使用来自 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 目标的主要内容,如果未能解决你的问题,请参考以下文章

QueryUserAPC Ring3下 APC注入

Windows x86/ x64 Ring3层注入Dll总结

将 dll 注入 Windows 10 记事本

防止来自Dll C ++的Dll注入

go依赖注入dig包使用-来自uber公司

卸载注入的 DLL