迂回LoadLibraryA时appcrash

时间:2012-06-22 21:49:07

标签: c++ winapi detours

我绕开了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;
}

2 个答案:

答案 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