C DLL注入器不工作(64位编译器)

C DLL注入器不工作(64位编译器),c,windows,winapi,dll-injection,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,

我还在做同一个项目(以防你想知道我为什么问这么多问题。) 无论如何,我从编译器中切换,从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
(gdb)p进程
$1=(句柄)0xec
(gdb)p加载库地址
$2=(LPVOID)0x7f9de0528ac
(gdb)p地址
$3=(LPVOID)0x8A4D1000
(gdb)hThread
$4=(句柄)0xf0
(gdb)p GetLastError()
$5 = 0
DLL没有问题,因为它可以与另一个DLL注入器(来自internet)一起正常工作

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


希望有人能帮助我,因为一个问题是目标进程中的DLL名称不是以null结尾的,因为只有
strlen(szDllName)
字节被分配和写入。将字符串处理逻辑更改为分配并写入
strlen(szDllName)+1
,以确保字符串以null结尾


请注意,要插入的DLL,
子类64.DLL
,必须与目标进程位于同一目录中,或者其
路径
环境变量必须包括DLL所在的目录。

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

如果调试了错误的进程,GetLastError返回值将仅在您启动的线程上有效。在程序调用CreateRemoteThread之前,将调试器附加到注入的进程。忘记零终止符是一个明显的错误,因此没有指定DLL的完整路径。您还有另一个问题-如果启用ASLR,kernel32.DLL可能(并且将)加载到目标进程中的不同地址。这意味着应用程序中LoadLibraryA()的地址在目标进程中将不相同。它可能没有正确编译,但确实有效,但它只适用于虚拟应用程序,在记事本中注入不起作用。(这与第三方注入器有关。)VirtualAllocEx()zero初始化内存,因此空终止不是严格必要的,但为了正确起见,应该这样做。还有,只是一个小问题:DLL需要位于目标的当前目录中,该目录不一定与它在磁盘上的目录相同。@Luke,如果没有
+1
,空终止符的内存不足,您对DLL位置的看法是正确的,但我在与目标进程相同的目录中声明,不是目标可执行文件。