基础概念注入定义在第三方进程不知情 / 未授权的前提下把代码 / 模块写入目标进程虚拟地址空间并执行安全领域注入与反注入持续对抗常见注入远程线程注入、APC 注入、钩子注入、输入法注入、导入表注入远程线程注入核心思路 不直接在目标进程执行自定义函数远程线程入口设为LoadLibraryA 在目标进程内存存放 DLL 路径字符串将字符串地址作为LoadLibraryA参数原因LoadLibraryA原型刚好匹配线程函数格式HMODULE LoadLibraryA(LPCTSTR lpFileName)1 个 4 字节参数、返回 4 字节返回值满足CreateRemoteThread入口要求关键点所有进程的kernel32.dll基地址一致LoadLibraryA地址在各个进程相同完整注入步骤重点OpenProcess打开目标进程获取进程句柄需要PROCESS_ALL_ACCESS或对应分项权限传入目标 PIDVirtualAllocEx在目标进程虚拟空间分配内存PAGE_READWRITE用来存放 DLL 完整路径内存大小 strlen1预留\0结束符WriteProcessMemory跨进程写内存把 DLL 路径字符串写入刚才分配的远程内存GetModuleHandleA(“kernel32.dll”) GetProcAddress拿到LoadLibraryA地址CreateRemoteThread创建远程线程○ 入口地址LoadLibraryA○ 线程参数远程内存中 DLL 路径字符串的地址远程线程执行LoadLibraryA → 目标进程加载 DLL触发DllMain资源释放关闭线程句柄、进程句柄DLL 端逻辑DllMainBOOL APIENTRYDllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH://DLL被加载进来新建线程持续执行代码CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);break;caseDLL_THREAD_ATTACH:break;caseDLL_THREAD_DETACH:break;caseDLL_PROCESS_DETACH:break;}returnTRUE;}重要CreateRemoteThread创建的远程线程执行完 LoadLibrary 就直接结束如果要长时间运行代码不能在 DllMain 里面写死循环规范做法DLL_PROCESS_ATTACH 里创建新线程业务代码放到新线程用到的核心 API 清单API作用OpenProcess打开目标进程拿到 hProcessVirtualAllocEx在别的进程分配虚拟内存(VirtualAlloc仅本进程)WriteProcessMemory向目标进程内存写入数据GetProcAddress获取 LoadLibraryA 函数地址CreateRemoteThread在目标进程创建远程线程易错点 限制DLL 路径必须使用完整绝对路径相对路径容易加载失败位数匹配32 位注入器只能注入 32 位目标进程64 位注入器只能注入 64 位目标32/64 不能交叉注入权限OpenProcess 权限不足直接失败高版本 Windows 有注入防护内存属性VirtualAllocEx 分配 PAGE_READWRITE如果后续需要执行代码才改成 PAGE_EXECUTE_READWRITE本案例只存字符串读写即可DllMain禁止写死循环代码会导致进程卡死要新建子线程最简注入器代码骨架#includewindows.h#includestdio.hintInjectDll(DWORD dwPID,constchar*szDllPath){//1.打开目标进程HANDLE hProcessOpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);if(hProcessNULL){printf(OpenProcess fail\n);return0;}//2.远程分配内存LPVOID pRemoteMemVirtualAllocEx(hProcess,NULL,strlen(szDllPath)1,MEM_COMMIT,PAGE_READWRITE);//3.写入DLL路径字符串WriteProcessMemory(hProcess,pRemoteMem,szDllPath,strlen(szDllPath)1,NULL);//4.获取LoadLibraryA地址LPVOID pLoadLib(LPVOID)GetProcAddress(GetModuleHandleA(kernel32.dll),LoadLibraryA);//5.创建远程线程HANDLE hRemoteThdCreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pLoadLib,pRemoteMem,0,NULL);WaitForSingleObject(hRemoteThd,INFINITE);//资源释放CloseHandle(hRemoteThd);CloseHandle(hProcess);return1;}intmain(){InjectDll(1048,C:\\TestDll.dll);getchar();return0;}总结远程线程注入本质CreateRemoteThread在目标进程调用LoadLibraryA加载 DLL4 个核心跨进程 APIOpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThreadLoadLibrary 地址所有进程相同所以不用在目标进程内解析远程线程只负责加载 DLLDLL 要持续运行代码必须在 DllMain 里新建线程注入前置条件目标进程正在运行注入程序拥有足够权限位数一致