我绕开了LoadLibraryA,以阻止函数被调用到我的应用程序中。它意味着阻止注射'。如果您从未见过这些,请参阅着名的CDetour库。
它挂钩了加载库函数,甚至成功返回,也阻止了未知的dll被加载到内存中。有什么提示吗?
bool ( __stdcall* LoadLibraryA ) ( LPCSTR );
bool LoadLibraryADetoured( LPCSTR szMsg )
{
if( strcmp( szMsg, "MyAllowedDll.dll" ) )
return TRUE;
return FALSE;
}
INT APIENTRY DllMain( HMODULE hModule, DWORD dwReason, LPVOID Reserved )
{
switch( dwReason )
{
case DLL_PROCESS_ATTACH:
{
DWORD dwRetAddress = (DWORD)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "LoadLibraryA" );
ZChatInput = ( bool ( __stdcall* ) ( ) )LoadLibraryA( ( PBYTE )dwRetAddress, ( PBYTE )LoadLibraryADetoured );
DisableThreadLibraryCalls( hModule );
break;
}
case DLL_THREAD_ATTACH:
case DLL_PROCESS_DETACH:
DetourRemove( ( PBYTE )dwRetAddress, ( PBYTE )LoadLibraryADetoured );
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
答案 0 :(得分:2)
根据MSDN,在DllMain()
中可以安全地执行的操作存在严重限制。 LoadLibrary()
肯定不安全。
来自http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx:
由于在调用入口点函数时保证在进程地址空间中加载Kernel32.dll,因此在Kernel32.dll中调用函数不会导致在执行初始化代码之前使用DLL。因此,入口点函数可以调用Kernel32.dll 中不加载其他DLL的函数。例如,DllMain可以创建同步对象,如关键部分和互斥体,并使用TLS。不幸的是,Kernel32.dll中没有安全功能的完整列表。
(大胆强调我的)
答案 1 :(得分:0)
您的绕行需要使用与被绕行的功能相同的调用约定。 LoadLibraryA()
使用__stdcall
,但您的绕行使用编译器默认值,通常为__cdecl
。