我没什么问题.我已经将DLL加载到进程中(它不是我的),我必须在其中使用函数.我有这个功能的偏移,所以我只需要获取DLL地址并将其添加到偏移量以获得该功能.GetModuleHandle()返回HMODULE变量,但实际上我不知道是什么HMODULE.它是加载DLL的地址还是某种其他标记?
如果它不是加载DLL的地址,我怎么能得到这个地址?我希望我能说清楚.
从dll加载dll的最佳方法是什么?
我的问题是我无法在process_attach上加载一个dll,我无法从主程序加载dll,因为我不控制主程序源.因此我也不能调用非dllmain函数.
我最近在做 DLL 注入工作,所以我在谷歌上做了一些研究。现在我知道使用 CreateRemoteThread 是一个好方法。
ASLR(Address space layout randomization,因为Windows Vista)使得kernel32.dll的地址是随机的,但这并不影响整体,因为在一个会话中所有进程的kernel32.dll的基地址是一样的——直到操作系统重置。
所以这段代码通常可能是安全的:
void launchAndInject(const char* app, const char* dll)
{
STARTUPINFOA si = {0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
if (CreateProcessA(app, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
{
LPVOID loadLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if (loadLibrary == NULL) {
return;
}
SIZE_T len = ::strlen(dll) + 1;
LPVOID addr = VirtualAllocEx(pi.hProcess, NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
if (addr == NULL) {
return;
}
if (!WriteProcessMemory(pi.hProcess, addr, dll, len, …Run Code Online (Sandbox Code Playgroud)