思路:
1、使用CE先将代码写好,并复制出其字节码
2、再目标进程中申请内存,并写入其字节码
3、在目标进程中创建远线程,实现远程CALL的调用
代码如下
1、使用的模块是精易模块
2、程序功能:对CS1.6的刷枪CALL的外部调用
====》_启动窗口集
.程序集 窗口程序集_启动窗口
.程序集变量 目标文件, 整数型
.程序集变量 文本数据, 文本型
.程序集变量 文本数组, 武器
.程序集变量 武器数据, 武器, , "0"
.程序集变量 远进程地址, 整数型
.程序集变量 刷枪CALL地址, 整数型
.子程序 __启动窗口_创建完毕
.如果真 (进程验活 () = 假)
返回 ()
.如果真结束
加载文本数据 ()
刷枪CALL地址 = 刷枪CALL ()
远进程地址 = 写远程数据 (刷枪CALL地址)
加载文本数据 ()
.子程序 加载文本数据
目标文件 = 打开文件 (“C:\Users\Administrator\Desktop\sj.txt”, #读入, )
.判断循环首 (真)
' 判断是否到文件尾部
文本数据 = 读入一行 (目标文件)
.如果真 (文本数据 = “”)
跳出循环 ()
.如果真结束
文本数组.武器偏移 = 取文本左边 (文本数据, 6)
文本数组.武器名称 = 取文本右边 (文本数据, 取文本长度 (文本数据) - 7)
加入成员 (武器数据, 文本数组)
列表框1.加入项目 (文本数组.武器名称, )
.判断循环尾 ()
.子程序 _列表框1_列表项被选择
.局部变量 id, 整数型
.局部变量 武器数据ID, 整数型
.局部变量 自己武器基地址, 整数型
id = 列表框1.现行选中项 + 1
.如果真 (id < 0)
返回 ()
.如果真结束
武器数据ID = 读库武器地址 (武器数据 [id].武器偏移)
自己武器基地址 = 读取自己武器基地址 ()
更换武器 (远进程地址, 武器数据ID, 自己武器基地址)
=======》程序集1
.版本 2
.支持库 spec
.程序集 程序集1
.程序集变量 进程名, 文本型
.程序集变量 进程ID, 整数型
.程序集变量 进程句柄, 整数型
.程序集变量 模块句柄, 整数型
.程序集变量 ModuleInfo, 精易_模块信息, , "0"
.子程序 取模块地址, 整数型, , 读取模块基地址
.参数 PID, 整数型
.参数 模块名称, 文本型
.局部变量 i, 整数型
.局部变量 mAddr, 整数型
进程_ID取模块 (PID, ModuleInfo)
.计次循环首 (取数组成员数 (ModuleInfo), i)
.如果真 (模块名称 = 到文本 (ModuleInfo [i].模块文件名))
mAddr = ModuleInfo [i].base
跳出循环 ()
.如果真结束
.计次循环尾 ()
返回 (mAddr)
.子程序 读库武器地址, 整数型, , 取武器偏移地址
.参数 偏移, 文本型
.局部变量 枪地址, 整数型
.局部变量 mpdll, 整数型
mpdll = 取模块地址 (进程ID, “mp.dll”)
枪地址 = mpdll + 进制_十六到十 (偏移)
返回 (枪地址)
.子程序 读取自己武器基地址, 整数型, , 取自己武器基地址
.局部变量 自己武器基地址, 整数型
' cstrike.exe+11069BC
' 自己武器基地址 - 第2个参数
自己武器基地址 = 取模块地址 (进程ID, 进程名) + 十六进制 (“11069BC”)
ReadProcessMemory_整数型 (进程句柄, 自己武器基地址, 自己武器基地址, 4, 0)
ReadProcessMemory_整数型 (进程句柄, 自己武器基地址 + 十六进制 (“7c”), 自己武器基地址, 4, 0)
返回 (自己武器基地址)
.子程序 调用远程call, , , 调用远程进程
.参数 程序地址, 整数型
CreateRemoteThread (进程句柄, 0, 0, 程序地址, 0, 0, 0)
.子程序 写远程数据, 整数型, , 申请内存
.参数 刷枪CALL, 整数型
.局部变量 远程数据, 字节集
.局部变量 子程序地址, 整数型
' 60 68 F8 19 EA 1F B9 E0 B0 1E 01 E8 30 8B A2 1F 61
' 内存_远程调用子程序 (进程句柄, 十六进制 (“10340000”), , , )
远程数据 = { 96, 104, 0, 0, 0, 0, 185, 0, 0, 0, 0, 232, 0, 0, 0, 0, 97, 195 }
子程序地址 = 内存_远程创建内存_字节集 (进程句柄, 远程数据)
.如果真 (子程序地址 = 0)
信息框 (“内存分配失败”, 0, , )
返回 (0)
.如果真结束
刷枪CALL = 刷枪CALL - (子程序地址 + 11) - 5
WriteProcessMemory_整数3 (进程句柄, 子程序地址 + 12, 刷枪CALL, 4, 0)
返回 (子程序地址)
.子程序 更换武器, , , 换武器
.参数 子程序地址, 整数型
.参数 武器地址, 整数型
.参数 自己武器基地址, 整数型
' 写内存数据
WriteProcessMemory_整数3 (进程句柄, 子程序地址 + 2, 武器地址, 4, 0)
WriteProcessMemory_整数3 (进程句柄, 子程序地址 + 7, 自己武器基地址, 4, 0)
调试输出 (子程序地址)
调用远程call (子程序地址)
.子程序 进程验活, 逻辑型, , 进程是否存在
进程名 = “cstrike.exe”
.如果真 (进程_是否存在 (进程名) = 假)
信息框 (“请启动进程”, 0, , )
返回 (假)
.如果真结束
进程ID = 进程_名取ID (进程名)
进程句柄 = 进程_打开1 (进程ID)
返回 (真)
.子程序 刷枪CALL, 整数型
.局部变量 刷枪CALL地址, 整数型
刷枪CALL地址 = 取模块地址 (进程ID, “mp.dll”) + 十六进制 (“98B40”)
返回 (刷枪CALL地址)
====》自定义数据类型
.数据类型 武器, 公开
.成员 武器偏移, 文本型
.成员 武器名称, 文本型
====》启动窗口
效果展示:
备注
1、CE中调用CALL的框架如下
2、在目标进程中写入CALL地址时的计算公式如下: 字节码 = 目标地址 - 源地址 - jcc指令长度,在该实例中为:字节码 = 子程序地址 - 申请内存地址 - 5