文章目录[隐藏]
当我们用CreateProcessA创建一个进程启动游戏,然后把我们的DLL通过申请内存,写入内存进行注入,我们加载注入DLL,注入的DLL,我们采用了大漠多线程绑定游戏,获取函数名称完成注入具体环节看视频教程
创建进程教程截图
CreateProcessA创建进程注入步骤:
1、创建进程
2、申请内存空间
3、把DLL路径写入内存
4、获取loadlibrary地址
5、创建远程线程调用LoadLibraryA函数,获取远程句柄
6、唤醒主线程
7、测试
8、关闭句柄
CreateProcessA创建进程注入源码:
.版本 2 .支持库 spec .子程序 _按钮1_被单击 .局部变量 文件路径, 文本型 .局部变量 运行目录, 文本型 .局部变量 si, STARTUPINFO .局部变量 pi, 进程结构 .局部变量 sRet, 整数型 .局部变量 模块名称, 文本型 .局部变量 dll文件路径, 整数型 .局部变量 Param, 整数型 .局部变量 LoadLibraryA地址, 整数型 .局部变量 hThread, 整数型 .局部变量 bRet, 整数型 文件路径 = “D:\游戏\剑侠\剑侠情缘网络版\gamefree.exe” 运行目录 = 取文本左边 (文件路径, 倒找文本 (文件路径, “\”, , 假)) 模块名称 = 编辑框1.内容 ' 1、创建进程 sRet = CreateProcessA (文件路径, “”, 0, 0, 假, 4, 0, 运行目录, si, pi) 调试输出 (sRet) ' 2、申请内存空间 dll文件路径 = 取文本长度 (模块名称) + 1 Param = VirtualAllocEx (pi.进程句柄, 0, dll文件路径, 4096, 4) ' 3、把DLL路径写入内存 WriteProcessMemory (pi.进程句柄, Param, 模块名称, 取字节集长度 (到字节集 (模块名称)), 0) ' 4、获取loadlibrary地址 LoadLibraryA地址 = GetProcAddress (GetModuleHandleA (“kernel32”), “LoadLibraryA”) ' 5、创建远程线程调用LoadLibraryA函数,获取远程句柄 hThread = CreateRemoteThread (pi.进程句柄, 0, 0, LoadLibraryA地址, Param, 0, 0) .如果 (hThread = 0) 信息框 (“创建线程注入失败”, 0, , ) 返回 () .否则 .如果结束 ' 6、唤醒主线程 bRet = ResumeThread (pi.线程句柄) .如果 (bRet = -1) 信息框 (“ResumeThread线程唤醒失败”, 0, , ) 返回 () .否则 .如果结束 ' 7、测试 WaitForSingleObject (hThread, -1) ' 8、关闭句柄 CloseHandle (hThread)
注入后启动线程源码:
.版本 2
.支持库 spec
.支持库 EThread
.子程序 _按钮3_被单击
.局部变量 函数地址
.局部变量 内存地址
.局部变量 线程ID
.局部变量 线程句柄
函数地址 = GetProcAddress (dll句柄, 编辑框2.内容)
内存地址 = 申请内存 (取文本长度 (编辑框2.内容), )
写到内存 (编辑框2.内容, 内存地址, )
线程句柄 = CreateThread (0, 0, 函数地址, 内存地址, 0, 线程ID)
.如果真 (等待线程 (线程句柄, 100))
关闭线程句柄 (线程句柄)
释放内存 (内存地址)
STARTUPINFO结构
.版本 2
.数据类型 STARTUPINFO
.成员 cbSize, 整数型
.成员 lpReserved, 整数型
.成员 lpDesktop, 整数型
.成员 lpTitle, 整数型
.成员 dwX, 整数型
.成员 dwY, 整数型
.成员 dwXSize, 整数型
.成员 dwYSize, 整数型
.成员 dwXCountChars, 整数型
.成员 dwYCountChars, 整数型
.成员 dwFillAttribute, 整数型
.成员 dwFlags, 整数型
.成员 wShowWindow, 长整数型
.成员 cbReserved2, 长整数型
.成员 lpReserved2, 整数型
.成员 hStdInput, 整数型
.成员 hStdOutput, 整数型
.成员 hStdError, 整数型
进程结构
.版本 2
.数据类型 进程结构
.成员 进程句柄, 整数型, , , hProcess
.成员 线程句柄, 整数型, , , hThread
.成员 进程标识符, 整数型, , , dwProcessId
.成员 线程标识符, 整数型, , , dwThreadId
注入DLL 源码:
.版本 2 .支持库 EThread .程序集 窗口程序集_窗口1 .程序集变量 dm, 大漠, , "0" .程序集变量 游戏窗口数量, 整数型 .程序集变量 hwnd, 整数型, , "0", 游戏窗口句柄 .程序集变量 thwnd, 整数型, , "0", 线程句柄 .子程序 _按钮1_被单击, , , 注册大漠 ' 由于dm.dll是在我们的注入的dll中调用,尽量不要使用免注册,不用采用动态调用 运行 (“regsvr32 dm.dll -s”, 假, ) .子程序 多线程绑定 .局部变量 进程ID数组, 整数型, , "0" .局部变量 m, 整数型 进程_取ID数组 (“gamefree.exe”, 进程ID数组, ) 游戏窗口数量 = 取数组成员数 (进程ID数组) 重定义数组 (dm, 假, 游戏窗口数量) 重定义数组 (hwnd, 假, 游戏窗口数量) 重定义数组 (thwnd, 假, 游戏窗口数量) .计次循环首 (游戏窗口数量, m) ' 创建大漠对象,有几个窗口就创建几个 dm [m].创建 () ' 取游戏窗口句柄 hwnd [m] = 进程_ID取窗口句柄 (进程ID数组 [m], , , , ) ' 开始绑定游戏 .判断开始 (dm [m].BindWindow (hwnd [m], “dx”, “dx2”, “windows”, 0) = 1) 启动线程 (&工作主线程, m, thwnd [m]) .默认 .判断结束 .计次循环尾 () .子程序 工作主线程 .参数 d .局部变量 许可证, 线程许可证 许可证 = 线程_创建许可证 () 线程_进入许可区 (许可证) 线程_初始化COM库 () 跑路 (d) 对话 (d) 打怪 (d) dm [d].UnBindWindow () dm [d].释放 () 线程_取消COM库 () 线程_退出许可区 (许可证) 线程_删除许可证 (许可证) .子程序 跑路 .参数 数组序号 .计次循环首 (10, ) dm [数组序号].KeyPress (114) 程序_延时 (1000, ) .计次循环尾 () .子程序 对话 .参数 数组序号 .计次循环首 (10, ) dm [数组序号].KeyPress (115) 程序_延时 (1000, ) .计次循环尾 () .子程序 打怪 .参数 数组序号 .计次循环首 (10, ) dm [数组序号].KeyPress (116) 程序_延时 (1000, ) .计次循环尾 () .子程序 _按钮2_被单击 多线程绑定 ()
提取码:加QQ群:521068947 群文件下载
资源教程交流①群:521068947
511遇见QQ: 272586593