2012-06-22 2 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 используется перед выполнением кода инициализации. Поэтому функция entry-point может вызывать функции в Kernel32.dll , которые не загружают другие DLL-файлы. Например, DllMain может создавать объекты синхронизации, такие как критические разделы и мьютексы, и использовать TLS. К сожалению, в Kernel32.dll нет исчерпывающего списка безопасных функций.

(Жирный выделено мною)

+0

Спасибо! это сработало !, я использовал __beginthreadex вместо этого, чтобы процесс присоединялся к обходам. –

+0

@ViniciusHorta: Тогда вы должны принять его ответ. –

+1

Да, он попросил меня подождать 5 минут! –

0

Вашего объезд должен использовать то же соглашение о вызовах, как функция времени свернуть. LoadLibraryA() использует __stdcall, но ваш обход использует компилятор по умолчанию, который обычно равен __cdecl.

Смежные вопросы