news 2026/10/8 22:51:07

远程线程注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
远程线程注入

基础概念

  1. 注入定义:在第三方进程不知情 / 未授权的前提下,把代码 / 模块写入目标进程虚拟地址空间并执行
    安全领域:注入与反注入持续对抗
    常见注入:远程线程注入、APC 注入、钩子注入、输入法注入、导入表注入
  2. 远程线程注入核心思路 不直接在目标进程执行自定义函数,远程线程入口设为LoadLibraryA; 在目标进程内存存放 DLL 路径字符串,将字符串地址作为LoadLibraryA参数
    原因:LoadLibraryA原型刚好匹配线程函数格式:HMODULE LoadLibraryA(LPCTSTR lpFileName),1 个 4 字节参数、返回 4 字节返回值,满足CreateRemoteThread入口要求
    关键点:所有进程的kernel32.dll基地址一致,LoadLibraryA地址在各个进程相同

完整注入步骤(重点)

  1. OpenProcess:打开目标进程,获取进程句柄,需要PROCESS_ALL_ACCESS(或对应分项权限),传入目标 PID
  2. VirtualAllocEx:在目标进程虚拟空间分配内存,PAGE_READWRITE,用来存放 DLL 完整路径(内存大小 = strlen+1,预留\0结束符)
  3. WriteProcessMemory:跨进程写内存,把 DLL 路径字符串写入刚才分配的远程内存
  4. GetModuleHandleA(“kernel32.dll”) + GetProcAddress:拿到LoadLibraryA地址
  5. CreateRemoteThread:创建远程线程
    ○ 入口地址:LoadLibraryA
    ○ 线程参数:远程内存中 DLL 路径字符串的地址
  6. 远程线程执行LoadLibraryA → 目标进程加载 DLL,触发DllMain
  7. 资源释放:关闭线程句柄、进程句柄

DLL 端逻辑(DllMain)

BOOL 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打开目标进程,拿到 hProcess
VirtualAllocEx在别的进程分配虚拟内存
(VirtualAlloc:仅本进程)
WriteProcessMemory向目标进程内存写入数据
GetProcAddress获取 LoadLibraryA 函数地址
CreateRemoteThread在目标进程创建远程线程

易错点 & 限制

  1. DLL 路径:必须使用完整绝对路径;相对路径容易加载失败
  2. 位数匹配:32 位注入器只能注入 32 位目标进程;64 位注入器只能注入 64 位目标,32/64 不能交叉注入
  3. 权限:OpenProcess 权限不足直接失败;高版本 Windows 有注入防护
  4. 内存属性:VirtualAllocEx 分配 PAGE_READWRITE;如果后续需要执行代码才改成 PAGE_EXECUTE_READWRITE(本案例只存字符串,读写即可)
  5. DllMain禁止写死循环代码,会导致进程卡死,要新建子线程

最简注入器代码骨架

#include<windows.h>#include<stdio.h>intInjectDll(DWORD dwPID,constchar*szDllPath){//1.打开目标进程HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);if(hProcess==NULL){printf("OpenProcess fail\n");return0;}//2.远程分配内存LPVOID pRemoteMem=VirtualAllocEx(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 hRemoteThd=CreateRemoteThread(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;}

总结

  1. 远程线程注入本质:CreateRemoteThread在目标进程调用LoadLibraryA加载 DLL
  2. 4 个核心跨进程 API:OpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThread
  3. LoadLibrary 地址所有进程相同,所以不用在目标进程内解析
  4. 远程线程只负责加载 DLL;DLL 要持续运行代码,必须在 DllMain 里新建线程
  5. 注入前置条件:目标进程正在运行,注入程序拥有足够权限,位数一致
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 22:51:00

e2e视口配置完全指南:多分辨率Web测试最佳实践

e2e视口配置完全指南&#xff1a;多分辨率Web测试最佳实践 【免费下载链接】e2e Next generation e2e testing framework for web and mobile apps. 项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e e2e 视口&#xff08;viewport&#xff09;配置是这套开源 A…

作者头像 李华
网站建设 2026/10/8 22:48:33

应用开放平台 应用市场上架备案相关流程

open.tencent.com 为贯彻落实《中华人民共和国反电信网络诈骗法》、《互联网信息服务管理办法》及《非经营性互联网信息服务备案管理办法》等法律法规要求&#xff0c;配合相关部门做好移动互联网信息服务管理&#xff0c;根据2023年8月4日工信部发布的《工业和信息化部关于开展…

作者头像 李华
网站建设 2026/10/8 22:42:25

剪映数字人长句口型不齐:先核原声和断句,再比较同一句修改结果

园艺课数字人讲一段较长说明&#xff0c;嘴部动作和声音明显不齐&#xff0c;可以先核文稿、原声与画面各自状态&#xff0c;再在当前支持范围内试断句或语速。调整文稿可能改善表达&#xff0c;但不能保证所有嘴部问题都随之修复&#xff0c;最终仍要看实际音画。剪映有数字人…

作者头像 李华
网站建设 2026/10/8 22:42:19

选题毫无头绪?资深教授推荐这几个AI论文软件

写论文总感觉无从下手&#xff1f;选题难、思路乱、资料找不全、格式又复杂——这些痛点几乎每个学生都经历过。其实&#xff0c;关键在于用对 AI 工具、走对写作流程&#xff0c;才能事半功倍。资深教授普遍推荐&#xff1a;千笔AI&#xff08;中文全流程首选&#xff09; 豆包…

作者头像 李华
网站建设 2026/10/8 22:41:48

Frida入门到实战:hook so层与Java层的姿势总结

Frida 是一款跨平台的动态二进制插桩工具&#xff0c;凭借 JavaScript 脚本化、轻量灵活、全平台覆盖的特性&#xff0c;成为移动端逆向分析、安全测试领域的标配工具。无论是 Java 层的业务逻辑 Hook&#xff0c;还是 so 原生层的算法分析&#xff0c;Frida 都能提供统一的操作…

作者头像 李华
网站建设 2026/10/8 22:41:39

一张头像做剪映数字人口播:先核输入条件,再用试稿检查音画

教师只有一张授权头像&#xff0c;想制作课程开场&#xff0c;可以先确认当前数字人入口是否接受这类图片&#xff0c;再试一段包含姓名、课程名和完整长句的文稿。数字人能力存在&#xff0c;不代表所有端都接受一张照片&#xff0c;也不意味着任意头像都能直接得到自然的讲话…

作者头像 李华