如何将dll注入另一个进程?

How to inject a dll to a another process?

最近几天我一直在尝试创建一个 DLL 注入器。
我找到的最简单的 DLL 注入方法是使用 CreateRemoteThread

这是我到目前为止写的,这段代码不起作用,也找不到原因。

我很确定我的问题出在我用来调用 WinAPI 函数的变量类型上,但我找不到位置。

bool Injector::Inject( HANDLE hProcess )
{
    //hProcess is a process with writing and reading access
    HANDLE hThread;
    void*  pLibRemote = 0;  
    string dllPath = "Some dll path";
    HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32"));


    pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);

    WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL);

    hThread = CreateRemoteThread( hProcess, NULL, 0,    
                    (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"), 
                    pLibRemote, 0, NULL );


    .
    .
    .

    CloseHandle(hThread);

    }
.
.
.

至少有 2 个问题:

pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);

1) sizeof(dllPath.c_str()) :您正在对指针执行 sizeof (c_str() returns a pointer),因此您可能会得到 4 或 8 作为结果。使用 dllPath.size() + sizeof(char)(如果使用 std::wstring,则使用 wchar_t 而不是 char)。

2) 使用 MEM_RESERVE | MEM_COMMIT 而不是 MEM_COMMIT :你想保留 同时提交保留的内存。

还要确保两个程序使用相同的 ISA(x86/x86;x64/x64,但不是不匹配的 ISA)。