使用远程线程的DLL注入在执行时不起任何作用

DLL injection using remote thread does nothing at execution

本文关键字:执行 注入 作用 任何 DLL 程线程 线程      更新时间:2023-10-16

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

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

我想知道这是否是我必须做的,但我只是不明白那行代码到底做了什么。它与MY dll函数无关,为什么要加载它?

Main(控制台应用程序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;
}

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

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