如何将dll注入另一个进程

How to inject a dll to a another process?

本文关键字:另一个 进程 注入 dll      更新时间:2023-10-16

过去几天我一直在尝试创建一个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()返回指针),因此可能会得到4或8。使用dllPath.size() + sizeof(char)(如果使用std::wstring,则使用wchar_t而不是char)。

2) 使用MEM_RESERVE | MEM_COMMIT而不是仅使用MEM_COMMIT:您希望同时保留提交保留的内存。

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