使用来自 x64 注入器的 x86 dll 注入 x86 目标
Posted
技术标签:
【中文标题】使用来自 x64 注入器的 x86 dll 注入 x86 目标【英文标题】:Injecting a x86 target with a x86 dll from a x64 injector 【发布时间】:2015-04-15 14:21:14 【问题描述】:正如标题所说的那样,我有点麻烦...我制作了一个适用于 x86 到 x86 和 x64 到 x64 的注入器,但是从 x64 注入 x86(带有 x86 dll)并没有使用该代码:
#include <Windows.h>
#include <string>
bool InjectDll(DWORD processId, std::string dllPath)
HANDLE hThread, hProcess;
void* pLibRemote = 0; // the address (in the remote process) where
// szLibPath will be copied to;
HMODULE hKernel32 = GetModuleHandle("Kernel32");
char DllFullPathName[_MAX_PATH];
GetFullPathName(dllPath.c_str(), _MAX_PATH, DllFullPathName, NULL);
// Get process handle
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
// copy file path in szLibPath
char szLibPath[_MAX_PATH];
strcpy_s(szLibPath, DllFullPathName);
// 1. Allocate memory in the remote process for szLibPath
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(szLibPath),
MEM_COMMIT, PAGE_READWRITE);
if (pLibRemote == NULL)
return false;
// 2. Write szLibPath to the allocated memory
WriteProcessMemory(hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL);
// 3. Force remote process to load dll
LPTHREAD_START_ROUTINE thread;
thread = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryA");
hThread = CreateRemoteThread(hProcess, NULL, 0, thread, pLibRemote,
0, NULL);
if (hThread == NULL)
return false;
return true;
该函数在每种情况下都返回 true(即使是从 64 位注入器注入 32 位进程),但它实际上无法注入 dll。
顺便说一句,在我的研究中,我发现了这些问题:
x86 Code Injection into an x86 Process from a x64 Process
C++: Injecting 32 bit targets from 64 bit process
但是,虽然答案解释了如何,但我并没有真正做到……所以也许我需要的只是一个代码 sn-p 以正确的方式发送给我?
【问题讨论】:
不,这根本行不通。您从 GetProcAddress() 获得的地址将完全错误。没有简单的解决方法,只有构建您的程序的 x64 版本。 INJECTOR 为 64 位,DLL 为 32 位,TARGET 为 32 位。它没有理由不起作用。我在帖子中链接的 2 个问题都说这是可能的,而且很多人都设法做到了……那你为什么要声称这是不可能的? 你从 GetProcAddress() 得到的地址是完全错误的。随意忽略它。顺便说一句,@zah 提出的 hack 还不错,不是很实用。只要你这样做,还不如构建 32 位版本的注入器,并从 64 位版本启动。 好的,谢谢!我看到了@zah 的答案,但我拒绝了它,因为它没有被选为答案,感觉不对,但如果你说它看起来不错,我会试一试! 【参考方案1】:改变这一行:
thread = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryA");
对于这一行:
thread = (LPTHREAD_START_ROUTINE)system("loadLibrary_x86_address.exe");
“loadLibrary_x86_address.exe”是一个 32 位应用程序,定义为:
#include <Windows.h>
int main()
return (int)LoadLibraryA;
有效!这是一种 hack,但它确实可以完成工作。
【讨论】:
以上是关于使用来自 x64 注入器的 x86 dll 注入 x86 目标的主要内容,如果未能解决你的问题,请参考以下文章