Я хочу загрузить другую версию DLL, чем присутствует в рабочем каталоге приложения. Для этого мне нужно подключить вызов LoadLibrary, чтобы при приеме приложения для загрузки DLL я мог прозрачно заменить его более новой версией этой DLL. Я пробовал использовать NCodeHook и иметь следующий код в своей DLL, который я ввожу в приложение с помощью NInjectLib, но он падает при загрузке kernel32.dll. Может кто-нибудь, пожалуйста, скажите мне, является ли это правильным способом инъекции вызова или есть другие альтернативы.Hooking LoadLibrary API call
// CodeHook.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <NCodeHookInstantiation.h>
#include "CodeHook.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
typedef HMODULE (WINAPI *LoadLibraryFPtr)(LPCTSTR dllName);
#pragma data_seg("SHARED")
LoadLibraryFPtr origFunc = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:SHARED,RWS")
HMODULE WINAPI LoadLibraryHook(LPCTSTR dllName)
{
if (origFunc != NULL)
{
return origFunc(dllName);
}
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
CODEHOOK_API void Initialize (void)
{
NCodeHookIA32 nch;
origFunc = nch.createHookByName("kernel32.dll", "LoadLibrary", LoadLibraryHook);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
Я бы настоятельно рекомендую, чтобы избежать такого подхода. DLL-ад по-прежнему существует (когда-либо слышал о SideBySide Manager?), Но я уверен, что с таким вызовом у вас будет еще хуже. –
Для рабочего примера см. Http://newgre.net/ninjectlib – newgre
http://stackoverflow.com/questions/15381506/stop-or-detection-dll-injection-loadlibrary – user1159258