C++ 从x64注入器向x86目标注入x86 dll

C++ 从x64注入器向x86目标注入x86 dll,c++,windows,dll,64-bit,C++,Windows,Dll,64 Bit,我在做标题上说的事情时有点困难。。。我制作了一个可用于x86到x86和x64到x64的注入器,但从x64(带有x86 dll)注入x86无法用于该代码: #include <Windows.h> #include <string> bool InjectDll(DWORD processId, std::string dllPath) { HANDLE hThread, hProcess; void* pLibRemote = 0; // the a

我在做标题上说的事情时有点困难。。。我制作了一个可用于x86到x86和x64到x64的注入器,但从x64(带有x86 dll)注入x86无法用于该代码:

#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;
}
#包括
#包括
bool InjectDll(DWORD processId,std::string dllPath)
{
HANDLE-hThread,hProcess;
void*pLibRemote=0;//地址(在远程进程中),其中
//szLibPath将被复制到;
HMODULE hKernel32=GetModuleHandle(“内核32”);
char DllFullPathName[_MAX_PATH];
GetFullPathName(dllPath.c_str(),_MAX_PATH,DllFullPathName,NULL);
//获取进程句柄
hProcess=OpenProcess(PROCESS\u ALL\u ACCESS,FALSE,processId);
//在szLibPath中复制文件路径
char szLibPath[_MAX_PATH];
strcpy_s(szLibPath,DllFullPathName);
//1.在远程进程中为szLibPath分配内存
pLibRemote=VirtualAllocEx(hProcess,NULL,sizeof(szLibPath),
MEM_COMMIT,PAGE_READWRITE);
if(pLibRemote==NULL)
返回false;
//2.将szLibPath写入分配的内存
WriteProcessMemory(hProcess,pLibRemote,(void*)szLibPath,
sizeof(szLibPath),空;
//3.强制远程进程加载dll
LPTHREAD\u START\u例程线程;
线程=(LPTHREAD_START_例程)GetProcAddress(hKernel32,“LoadLibraryA”);
hThread=CreateRemoteThread(hProcess,NULL,0,thread,pLibRemote,
0,空);
if(hThread==NULL)
返回false;
返回true;
}
该函数在每种情况下都返回true(即使是从注入32位进程的64位注入器),但它实际注入dll失败

顺便说一下,在我的研究中,我发现了这些问题:

但是,虽然答案解释了怎么做,但我并没有真正做到这一点。。。所以,也许我只需要一个代码片段就可以按正确的方式发送给我?

更改此行:

thread = (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryA");
thread = (LPTHREAD_START_ROUTINE)system("loadLibrary_x86_address.exe");
对于这一行:

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;
}
#包括
int main()
{
返回(内部)加载库a;
}

工作!这是一种黑客行为,但它确实起作用。

不,这根本不起作用。从GetProcAddress()获取的地址将完全错误。没有简单的解决方法,只有一个,构建x64版本的程序。注入器是64位的,DLL是32位的,目标是32位的。没有理由不起作用。我在帖子中链接的两个问题都说这是可能的,很多人都做到了。。。那么,为什么您会声称这是不可能的呢?您从GetProcAddress()获得的地址将是完全错误的。请随意忽略它。顺便说一句,@zah提出的黑客攻击并不坏,也不太实用。只要您这样做,就可以构建32位版本的注入器,并从64位版本开始。好的,谢谢!我看到了@zah的答案,但我拒绝了它,因为它没有被选为答案,而且感觉不对,但如果你说它看起来不错,我会试试看!