【问题标题】:DLL injection using remote thread does nothing at execution使用远程线程的 DLL 注入在执行时不执行任何操作
【发布时间】:2015-06-30 21:58:47
【问题描述】:

这么长时间以来,我一直在试图找出问题所在。 我见过一些人分配:

GetProcAddress(GetModuleHandle("KERNEL32.dll"), "LoadLibraryA")

我想知道这是否是我必须做的,但我只是不明白那行代码究竟做了什么。和我的dll函数没有关系,为什么要加载呢?

主(控制台应用程序 A.K.A 注射器):

#include <iostream>
#include <windows.h>
#include <TlHelp32.h>

char* dllPath = "C:\\Users\\Kalist\\Desktop\\Projects\\DLL\\bin\\Debug\\DLL.dll";
typedef DWORD (WINAPI *pThreadFunc)();
char* ProcToInject = "calc.exe";

int main(){
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    DWORD procID;

    if(procSnap){
        if(Process32First(procSnap, &pe32)){
            do{
               if(!strcmp(pe32.szExeFile, ProcToInject)){
                    procID = pe32.th32ProcessID;
                    break;
               }
            }while(Process32Next(procSnap, &pe32));
        }
        CloseHandle(procSnap);
    }
    HANDLE procAccess = OpenProcess(PROCESS_ALL_ACCESS, false, procID);
    void* memSpace = VirtualAllocEx(procAccess, NULL, strlen(dllPath)+1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(procAccess, memSpace, dllPath, strlen(dllPath)+1, NULL);
    HINSTANCE getLibadd = LoadLibrary(dllPath);
    pThreadFunc pThreadFuncVar = (pThreadFunc)GetProcAddress(getLibadd, "threadFunc");

    CreateRemoteThread(procAccess, NULL, 0, (LPTHREAD_START_ROUTINE)pThreadFuncVar, memSpace, 0, NULL);

    CloseHandle(procAccess);
}

DLL 远程进程:

#include <iostream>
#include <windows.h>

extern "C" DWORD WINAPI threadFunc(){
    MessageBox(0, "Injection worked!", "Injection message", MB_OK);
    return 0;
}

【问题讨论】:

    标签: c++ winapi dll dll-injection


    【解决方案1】:

    您的代码的问题是pThreadFuncVar 包含您的注入器进程中的 threadFunc 的地址。但是,您的 Dll.dll 甚至没有加载到目标进程中。即使你的 dll 被加载了,它也很可能不会加载到相同的地址,所以pThreadFuncVar 地址在目标进程中仍然没有意义。

    只有少数基本模块,如 KERNEL32,在每个进程中加载​​到相同的地址。因此,如果您将 LoadLibraryA 的地址用于 CreateRemoteThread,它将从您复制到目标进程内存的路径中加载 dll。这将依次调用您的 dll 的 dll 附加过程,这是您要放置 MessageBox 调用的地方。

    【讨论】:

    • 好吧,您实际上不应该从 DllMain 调用 MessageBox。但是你可以启动一个调用 MessageBox 的线程。
    猜你喜欢
    • 2020-01-28
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2011-08-03
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多