文章目录[隐藏]
远程线程注入CreateRemoteThread通过获取注入目标进程的句柄,把我们的DLL注入到目标进程内存地址,远程线程的意思是另一个进程中的线程,并非远控的意思,也就是远程线程注入是指一个进程在另一个进程中创建线程的技术,本视频教程使用三节课,演示了把自己编写的辅助DLL注入到游戏进程中,注入的DLL,采用了三种方法编写,具体见视频教程(QQ群:521068947 下载)下面我们先看一下步骤:
1、获取游戏进程句柄,0表示不继承句柄
2、在远程进程中(游戏进程中)申请内存空间,用来存放模块路径
3、WriteProcessMemory写进内存
4、获取LoadlibrarA地址
5、CreateRemoteThread核心远程线程注入
远程线程注入视频截图
远程线程注入源码:
.版本 2 .支持库 spec .子程序 _按钮1_被单击, , , hook .局部变量 模块名称, 文本型 .局部变量 进程句柄 .局部变量 目标进程内存地址 .局部变量 写入成功的地址 .局部变量 ret_l, 逻辑型 .局部变量 LoadlibrarA地址 .局部变量 creatRet 模块名称 = 编辑框1.内容 ' 获取游戏进程句柄,0表示不继承句柄 进程句柄 = OpenProcess (2035711, 0, 到数值 (编辑框2.内容)) .如果真 (进程句柄 = 0) 信息框 (“打开进程失败,可能权限不够”, 0, , ) 返回 () .如果真结束 ' 2、在远程进程中(游戏进程中)申请内存空间,用来存放模块路径 ' 0表示自动分配保留内存页面地址 目标进程内存地址 = VirtualAllocEx (进程句柄, 0, 4096, 4096, 64) .如果真 (目标进程内存地址 = 0) 信息框 (“分配内存地址失败”, 0, , ) 返回 () .如果真结束 ' 3、WriteProcessMemory写进内存 ret_l = WriteProcessMemory (进程句柄, 目标进程内存地址, 模块名称, 取字节集长度 (到字节集 (模块名称)), 取变量地址 (写入成功的地址)) .如果真 (ret_l = 假) 信息框 (“数据写入内存失败!”, 0, , ) 返回 () .如果真结束 ' 4、获取LoadlibrarA地址 LoadlibrarA地址 = GetProcAddress (GetModuleHandleA (“Kernel32.dll”), “LoadLibraryA”) .如果真 (LoadlibrarA地址 = 0) 信息框 (“LoadlibrarA地址失败”, 0, , ) 返回 () .如果真结束 ' 5、核心远程线程注入 creatRet = CreateRemoteThread (进程句柄, 0, 0, LoadlibrarA地址, 目标进程内存地址, 0, 0) .如果真 (creatRet = 0) 信息框 (“远程线程注入失败”, 0, , ) 返回 ()
启动线程源码:
.版本 2 .支持库 spec .支持库 EThread .子程序 _按钮3_被单击 .局部变量 函数地址 .局部变量 内存地址 .局部变量 线程ID .局部变量 线程句柄 ' 1、 取得dll函数地址 函数地址 = GetProcAddress (dll句柄, 编辑框3.内容) ' 2、申请内存地址,用来存放函数里参数 内存地址 = 申请内存 (取文本长度 (编辑框3.内容), ) ' 3、把参数写入申请的内存地址中 写到内存 (编辑框3.内容, 内存地址, ) ' 4、创建线程CreateThread ' (1)表示线程内核对象的安全属性,0 ' (2)表示线程栈空间的大K小,0表示使用默认大小(1mb) ' (3)新线程所执行的线程函数的地址,多个线程可以使用同一个地址 ' (4)创给线程函数的参数 ' (5)控制线程的创建,0表现创建后立即执行调度线程 ' (6)返回创建线程的ID 线程句柄 = CreateThread (0, 0, 函数地址, 内存地址, 0, 线程ID) 调试输出 (线程句柄) ' 5、线程的一些安全处理 .如果真 (等待线程 (线程句柄, 100)) 关闭线程句柄 (线程句柄) 释放内存 (内存地址) .如果真结束
卸载注入的DLL
.版本 2 .子程序 _按钮4_被单击 .如果真 (FreeLibrary (dll句柄) = 真) dll句柄 = 0
百度网盘链接:https://pan.baidu.com/s/158ikKVjIwaoF4438MG4fhA
提取码:加QQ群:521068947 群文件下载