C++ - CreateRemoteThread DLL 注入 [Windows 7]

Posted

技术标签:

【中文标题】C++ - CreateRemoteThread DLL 注入 [Windows 7]【英文标题】:C++ - CreateRemoteThread DLL Injection [Windows 7] 【发布时间】:2012-12-31 00:36:32 【问题描述】:

无论我在哪里查看通过 CreateRemoteThread 注入的方法都是相同的,但是获取进程 ID 的方法不是......我的函数将返回正确的进程 ID,我对此不感兴趣,所以我将取消那部分,只包括实际注射。

我只是在学习 DLL 注入并且正在尝试使用 notepad.exe。如果注入成功,记事本的标题将从“Untitled - Notepad”变为“Hooked”。

#define DLL_NAME "injectme.dll"

.....

BOOL InjectRemoteThread(DWORD ProcessID)

    HANDLE RemoteProc;
    char buf[50]        =   0;
    LPVOID MemAlloc;
    LPVOID LoadLibAddress;

    // Process ID does show correctly!
    WCHAR id[100];
    StringCbPrintf(id, 100, L"%d", ProcessID); // id contains the process ID... is confirmed in comparing ID shown in tasklist and the messagebox.
    MessageBox(NULL, id, L"Process ID", MB_ICONINFORMATION);
    // Process ID does show correctly!

    if ( !ProcessID )
    
        MessageBox(NULL, (LPCWSTR)GetLastError(), L"An error occured", NULL);
        return 0;
    
    RemoteProc          =   OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessID);
    if ( !RemoteProc )
    
        MessageBox(NULL, (LPCWSTR)GetLastError(), L"An error occured", NULL);
        return 0;
    
    LoadLibAddress      =   (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    MemAlloc            =   (LPVOID)VirtualAllocEx(RemoteProc, NULL, strlen(DLL_NAME)+1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(RemoteProc, (LPVOID)MemAlloc, DLL_NAME, strlen(DLL_NAME)+1, NULL);
    CreateRemoteThread(RemoteProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddress, (LPVOID)MemAlloc, NULL, NULL);

    CloseHandle(RemoteProc);
    VirtualFreeEx(RemoteProc, (LPVOID)MemAlloc, 0, MEM_RELEASE | MEM_DECOMMIT);
    return 1;

DLL 可以使用其他人的注射器,但我不明白为什么... 它确实和注入器在同一个目录中。

【问题讨论】:

我见过类似的东西。我只是在 XP 上乱搞,通过 DLL 注入导致进程使用 100% CPU,效果很好。当我在 Windows 7 上尝试它时,它不起作用。它周围有一些东西发生了变化,可能通过调整你的进程令牌来解决,但我从来没有仔细研究过。 您是否收到任何错误,尤其是在OpenProcess 阶段? @MatteoItalia,在我的情况下不是,不。我怀疑在这种情况下也不会。 很遗憾,我始终没有出错。 不确定这是否重要,但您的应用程序和记事本是否具有相同的架构,即 64 位或 32 位? 【参考方案1】:

我发现了问题......我觉得自己很愚蠢。 任何有类似问题的人:不要使用相对路径,而是使用绝对路径。

我变了

#define DLL_NAME "injectme.dll"

#define DLL_NAME "C:\\Users\\Raikazu\\Documents\\Visual Studio 2012\\Projects\\Hooking\\Release\\injectme.dll"

【讨论】:

哦,伙计,非常感谢你哈哈。这是一个令人讨厌的错误

以上是关于C++ - CreateRemoteThread DLL 注入 [Windows 7]的主要内容,如果未能解决你的问题,请参考以下文章

远程线程注入 CreateRemoteThread 返回NULL

WIN32 远程注入 CreateRemoteThread

Dll注入:X86/X64 远程线程CreateRemoteThread 注入

远程线程注入方法CreateRemoteThread

CreateRemoteThread 失败并显示 ERROR_ACCESS_DENIED

我在试着做一个木马Loader注入记事本然后CreateRemoteThread启动DLL 但是似乎注入成功,DLL没有启动