我想加載與應用程序的工作目錄中存在的不同版本的DLL。爲此,我需要掛鉤LoadLibrary調用,以便在應用程序調用以加載DLL時,我可以透明地將其替換爲該DLL的較新版本。我嘗試使用NCodeHook,並在我的DLL中使用NInjectLib注入到應用程序中,但在加載kernel32.dll時崩潰。任何人都可以告訴我,這是否是注入電話的正確方式,或者是否有其他選擇。掛鉤LoadLibrary API調用
// 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-Hell仍然存在(曾經聽說過SideBySide Manager?),但我敢打賭,你會通過這樣的電話讓事情變得更糟。 – 2009-11-05 19:29:22
有關工作示例,請參閱http://newgre.net/ninjectlib – newgre 2010-03-12 22:35:37
http://stackoverflow.com/questions/15381506/stop-or-detection-dll-injection-loadlibrary – user1159258 2013-03-13 09:38:43