c - DLL 注入(inject)器不工作(64 位编译器)

标签 c windows winapi dll-injection

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

虽然项目编译良好,没有任何错误,但注入(inject)器无法工作,没有给出任何错误或其他内容。来源如下:

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 注入(inject)器(来自互联网)一起正常工作

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

希望有人能帮助我,问候

最佳答案

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

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

关于c - DLL 注入(inject)器不工作(64 位编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199917/

相关文章:

windows - CFileDialog - 选定的过滤器和 "Hint"显示所有文件

windows - PHPUnit 的奇怪输出

c++ - 如果一个进程是从 Windows 上的另一个进程生成的,我可以关闭它自己的句柄吗?

c++ - TextOut 到设备上下文的中心

c - 从 C 中的 vector 中删除一个元素

windows - 获取 git 中最后 2 个标签之间的提交列表 - 在 Windows 上 - 不知道标签

c - 将用户输入作为历史记录返回到列表中

c++ - Windows 多显示器 : How can I determine if a target is physically connected to a source when the target is available but not active?

c - 中断发送和接收字符串

C 程序 sqrt 不工作