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

时间:2016-03-25 13:07:11

标签: c++ winapi dll dll-injection

过去几天我一直在尝试创建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);

    }
.
.
.

1 个答案:

答案 0 :(得分:2)

至少有两个问题:

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

1)sizeof(dllPath.c_str()):你在指针(c_str() returns a pointer)上做了sizeof,因此你可能得到4或8。如果使用dllPath.size() + sizeof(char),请使用wchar_t(或char代替std::wstring

2)使用MEM_RESERVE | MEM_COMMIT代替MEM_COMMIT:您希望同时保留提交保留的内存。

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