DLL Injector无法正常工作(64位编译器)

时间:2013-01-07 16:24:14

标签: c windows winapi dll-injection

我还在为同一个项目工作(如果你想知道为什么我会问这么多问题。) 无论如何,我从编译器切换,从mingw32(mingw.org)切换到MinGW-w64(mingw-w64.sourceforge.net /)

虽然项目编译正常但没有任何错误,但是注射器不起作用,没有任何错误或什么。这是来源:

int Inject(DWORD pID) 
{ 
    HANDLE hProcess;
    if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID)))
        return 0;

    char* szDllName = "subclass64.dll";

    LPVOID LoadLibraryAddress;
    if ((LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA")) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    LPVOID lpStringAddress;
    if ((lpStringAddress = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    if (WriteProcessMemory(hProcess, lpStringAddress, szDllName, strlen(szDllName), NULL) == 0)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    HANDLE hThread;
    if ((hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, lpStringAddress, 0, NULL)) == NULL)
    {
        char buf[32];
        sprintf(buf, "%d", GetLastError());
        MessageBox(0, buf, "", 0);

        CloseHandle(hProcess);
        return 0;
    }

    CloseHandle(hProcess); 
    return 1; 
}

我也进行了调试,但我没有得到任何奇怪的值:

(gdb) p hProcess
$1 = (HANDLE) 0xec
(gdb) p LoadLibraryAddress
$2 = (LPVOID) 0x7f9de0528ac <LoadLibraryA>
(gdb) p lpStringAddress
$3 = (LPVOID) 0x8a4d10000
(gdb) p hThread
$4 = (HANDLE) 0xf0
(gdb) p GetLastError()
$5 = 0

DLL没有任何问题,因为它适用于另一个DLL Injector(来自互联网)

编辑:它适用于虚拟/测试应用程序,但它没有使用记事本(例如使用第三方注入器。)

希望有人可以帮助我,问候

2 个答案:

答案 0 :(得分:2)

一个问题是目标进程中DLL的名称不是以null结尾,因为只分配和写入strlen(szDllName)个字节。更改字符串处理逻辑以分配和写入strlen(szDllName) + 1以确保字符串为空终止。

请注意,要注入的DLL subclass64.dll必须与目标进程位于同一目录中,或者其PATH环境变量必须包含DLL所在的目录。

答案 1 :(得分:0)

我从编译器切换到Visual Studio,在那里它最初没有工作,但后来确实如此。答案是不调试。因此,您导航到应用程序的路径,然后手动启动该程序。