一、远程线程注入的原理

  1、其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以将DLL文件加载到自身进程中。

  2、这样,就可以用 CreateRemoteThread() 函数创建一个远程线程,让目标进程调用LoadLibrary() 来加载我们自己写的DLL 。CreateRemoteThread() 有这几个参数比较关键:A:想要注入的进程的句柄,这里可以通过OpenProcess()得到; B:想要运行的函数,本例中当然是 LoadLibrary() 啦; C: 所运行函数的参数,本例中是自己写的DLL的存放路径。

  3、那么,怎么让 LoadLibrary() 找到自己写的DLL的存放路径呢?这就需要在内存中开辟一块空间,把路径写入进去。这要先用 VirtualAllocEx()开辟一块空间,然后用WriteProcessMemory() 函数把DLL路径写进去。

  4、小结:总的来说,就是:先在目标进程的内存空间里开辟一块新地方,往新地方里面写入DLL的路径,再创建远程线程找到LoadLibrary() 函数,并在刚才开辟的新地方中读取DLL路径,进而加载我们自己写的DLL。

二、代码实现(含详细注释)

  1 #include <iostream>
  2 #include "stdlib.h"
  3 #include <tchar.h>
  4 #include <Windows.h>
  5
  6 bool Inject(DWORD dwId, WCHAR* szPath)//参数1:目标进程PID  参数2:DLL路径
  7 {
  8     //一、在目标进程中申请一个空间
  9
 10
 11     /*
 12     【1.1 获取目标进程句柄】
 13     参数1:想要拥有的进程权限(本例为所有能获得的权限)
 14     参数2:表示所得到的进程句柄是否可以被继承
 15     参数3:被打开进程的PID
 16     返回值:指定进程的句柄
 17     */
 18     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
 19
 20
 21     /*
 22     【1.2 在目标进程的内存里开辟空间】
 23     参数1:目标进程句柄
 24     参数2:保留页面的内存地址,一般用NULL自动分配
 25     参数3:欲分配的内存大小,字节单位
 26     参数4:MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
 27     参数5:PAGE_READWRITE 区域可被应用程序读写
 28     返回值:执行成功就返回分配内存的首地址,不成功就是NULL
 29     */
 30     LPVOID pRemoteAddress = VirtualAllocEx(
 31         hProcess,
 32         NULL,
 33         1,
 34         MEM_COMMIT,
 35         PAGE_READWRITE
 36     );
 37
 38     //二、 把dll的路径写入到目标进程的内存空间中
 39
 40     DWORD dwWriteSize = 0;
 41     /*
 42     【写一段数据到刚才给指定进程所开辟的内存空间里】
 43     参数1:OpenProcess返回的进程句柄
 44     参数2:准备写入的内存首地址
 45     参数3:指向要写的数据的指针(准备写入的东西)
 46     参数4:要写入的字节数(东西的长度+0/)
 47     参数5: 返回值。返回实际写入的字节
 48     */
 49     WriteProcessMemory(hProcess,pRemoteAddress, szPath, wcslen(szPath) * 2 + 2, &dwWriteSize);
 50
 51
 52     //三、 创建一个远程线程,让目标进程调用LoadLibrary
 53
 54     /*
 55     参数1:该远程线程所属进程的进程句柄
 56     参数2:一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结构指定了线程的安全属性
 57     参数3:线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小
 58     参数4:在远程进程的地址空间中,该线程的线程函数的起始地址(也就是这个线程具体要干的活儿)
 59     参数5:传给线程函数的参数(刚才在内存里开辟的空间里面写入的东西)
 60     参数6:控制线程创建的标志。0(NULL)表示该线程在创建后立即运行
 61     参数7:指向接收线程标识符的变量的指针。如果此参数为NULL,则不返回线程标识符
 62     返回值:如果函数成功,则返回值是新线程的句柄。如果函数失败,则返回值为NULL
 63     */
 64     HANDLE hThread = CreateRemoteThread(
 65         hProcess,
 66         NULL,
 67         0,
 68         (LPTHREAD_START_ROUTINE)LoadLibrary,
 69         pRemoteAddress,
 70         NULL,
 71         NULL
 72     );
 73     WaitForSingleObject(hThread, -1); //当句柄所指的线程有信号的时候,才会返回
 74
 75     /*
 76     四、 【释放申请的虚拟内存空间】
 77     参数1:目标进程的句柄。该句柄必须拥有 PROCESS_VM_OPERATION 权限
 78     参数2:指向要释放的虚拟内存空间首地址的指针
 79     参数3:虚拟内存空间的字节数
 80     参数4:MEM_DECOMMIT仅标示内存空间不可用,内存页还将存在。
 81            MEM_RELEASE这种方式很彻底,完全回收。
 82     */
 83     VirtualFreeEx(hProcess, pRemoteAddress, 1, MEM_DECOMMIT);
 84     return 0;
 85 }
 86
 87
 88 int _tmain(int argc, _TCHAR * argv[])
 89 {
 90     wchar_t wStr[] = L"E:\\inject.dll";
 91     DWORD dwId = 0;
 92
 93     //参数1:(NULL
 94     //参数2:目标窗口的标题
 95     //返回值:目标窗口的句柄
 96     HWND hCalc = FindWindow(NULL, L"微信");
 97     printf("目标窗口的句柄为:%d\n", hCalc);
 98
 99     DWORD dwPid = 0;
100
101     //参数1:目标进程的窗口句柄
102     //参数2:把目标进程的PID存放进去
103     DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid);
104     printf("目标窗口的进程PID为:%d\n", dwPid);
105
106     //参数1:目标进程的PID
107     //参数2:想要注入DLL的路径
108     Inject(dwPid, wStr);
109
110     return 0;
111 }

执行之后,DLL就注入到了PC版的微信进程。且该DLL中含有一个弹窗代码,也出现在了PC版微信的界面之上。

附:测试用的DLL代码

 1 #include <windows.h>
 2
 3
 4 DWORD WINAPI runBot(LPVOID lpParam) {
 5     // 此处可以写具体的bot代码
 6     return 1;
 7 }
 8
 9
10 BOOL APIENTRY DllMain( HMODULE hModule,
11                        DWORD  ul_reason_for_call,
12                        LPVOID lpReserved
13                      )
14 {
15     switch (ul_reason_for_call)
16     {
17     case DLL_PROCESS_ATTACH:
18         MessageBoxA(NULL, "DLL Attached!\n", "Game Hacking", MB_OK | MB_TOPMOST);
19         CreateThread(NULL, 0, &runBot, NULL, 0, NULL);
20         break;
21     }
22     return TRUE;
23 }

(以上例程均在 Windows 10 系统,VisualStudio 2019 环境中编译通过)

转载于:https://www.cnblogs.com/codex/p/10849200.html

详细解读:远程线程注入DLL到PC版微信相关推荐

  1. 远程线程注入DLL到PC版微信

    一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...

  2. WinAPI【远程注入】利用远程线程注入DLLDelphi版

    { WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...

  3. 易语言远程线程注入DLL到游戏

    远程线程注入CreateRemoteThread通过获取注入目标进程的句柄,把我们的DLL注入到目标进程内存地址,远程线程的意思是另一个进程中的线程,并非远控的意思,也就是远程线程注入是指一个进程在另 ...

  4. 远程线程注入dll的一个例子,netcat.dll

    远程dll示例,学习远程线程的例子 masm32 v11 免费下载 Windows环境下32位汇编语言程序设计中13章的远程注入dll的例子 说明HideDll.dll既是nc.dll(改了个名,军刀 ...

  5. DLL 远程线程注入

    远程线程注入 首先 , 这里讲和为注入 , 通俗讲 , 就是把自己的东西强加给别人 也就是在 其他程序的运行的内存空间里面 插入自己的代码 这里提到的远程线程注入 这个算是很常用,也算是用的比较多的一 ...

  6. DLL注入_远程线程注入

    什么是线程注入? 线程注入,是通过开启远程线程的方式,将DLL加载到目标宿主进程中的常用方式. 什么是动态链接库? 首先Windows中链接库分为两种:动态链接库DLL.静态链接库LIB. ① 静态链 ...

  7. (二) 使用Detours调试远程线程注入的dll

    远程线程注入是指一个进程在另一个进程中创建线程的技术.该技术可以用于:API Hook,破解软件所谓的"内存补丁"等. 将DLL注入到其它进程并不是难事,问题是这个被注入的DLL不 ...

  8. 远程线程注入引出的问题

    一.远程线程注入基本原理 远程线程注入--相信对Windows底层编程和系统安全熟悉的人并不陌生,其主要核心在于一个Windows API函数CreateRemoteThread,通过它可以在另外一个 ...

  9. windows-CODE注入(远程线程注入)

    远程线程注入(先简单说,下面会详细说) 今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式 ...

最新文章

  1. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配
  2. 廖雪峰python教程完整版-为什么看不懂廖雪峰的Python学习教程?
  3. Oracle数据库的轻松干净卸载
  4. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer
  5. C++数据结构struct
  6. dns服务器漏洞修复,KB4569509:DNS 服务器漏洞 CVE-2020-1350 指南
  7. Android Studio 导入 Android 系统模块并编译和调试
  8. 注册表把html设置成桌面,[注册表] 将Windows 10默认应用程序设置页面添加到桌面右键菜单中...
  9. 可优比和aag哪个好_2020年儿童床品牌排行榜,如何购买婴儿床?(可优比/思多嘉儿Stokke/好孩子/葛莱Graco)...
  10. 开源icon、SVG、字体图标库收集
  11. 计算机便签中字的大小,Windows便签字体怎么调整?电脑便签怎么改字体大小
  12. C# Socket通讯连接测试
  13. http://msdn.itellyou.cn/
  14. OpenGL混合功能与抗锯齿
  15. 结对项目-最长英语单词链
  16. 6park留园 android,‎「掌上留园-6park」をApp Storeで
  17. 深圳办理cdn经营许可证_申请cdn许可证变更「深圳办理cdn经营许可证」
  18. 设定了所有种子后每次结果还是不一样 pytorch可重复 可复现问题
  19. 一分钟带你了解最真实的服务器
  20. php hrtime stopwatch,学习PHP中的高精度计时器HRTime扩展

热门文章

  1. 学计算机高中选那三科,女生高中选哪三科最吃香?女生高中选物理还是历史学科?...
  2. 有哪些内外网都能传输文件的工具-镭速
  3. ROS之mocap_optitrack
  4. noip 2018 模拟赛16
  5. 秒杀商城项目----全局异常处理和加入缓存预热,商品结束秒杀标记 Map
  6. Matlab图片合成视频函数VideoWriter简介
  7. 卷皮九块邮官方邀请码8imrdm 注册即为VIP
  8. MATLAB数表示,1e100是什么数??matlab
  9. MIUI12(开发版) 更新之后无法使用Google服务的解决办法
  10. 优思学院|企业为何要培训员工六西格玛?