2012-06-22 22 views
0

我绕过LoadLibraryA,为了阻止函数被调用到我的应用程序中。它是为了阻止'注入'。如果你从未见过这些,请参考着名的CDetour图书馆。appcrash绕行时LoadLibraryA

它挂钩了加载库函数,甚至成功返回,也阻止未知的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

'LoadLibraryA'不带2个参数 – Dani

回答

2

根据MSDN,有什么你可以在DllMain()安全做严格的限制。 LoadLibrary()当然不安全。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx

因为Kernel32.dll中保证在当入口点函数被调用进程的地址空间被加载,调用Kernel32.dll中的功能不会导致该DLL所使用在它的初始化代码被执行之前。因此,入口点函数可以调用不加载其他DLL的Kernel32.dll 中的函数。例如,DllMain可以创建同步对象,如临界区和互斥体,并使用TLS。不幸的是,在Kernel32.dll中没有完整的安全函数列表。

(粗体强调的是我的)

+0

谢谢!它的工作!,我用__beginthreadex而不是进程附加绕行。 –

+0

@ViniciusHorta:那你应该接受他的回答。 –

+1

是的,它让我等5分钟! –

0

你绕路需要使用相同的调用约定的函数被绕道。 LoadLibraryA()使用__stdcall但您的绕行使用编译器默认值,通常是__cdecl