| 
 | 
 
先纪念一下踩过的坑 
 
1、模块混用时各种数据类型套娃(特别是WINDOWS API中各种数据类型套娃)引发的报错,详见大神花姐的解答 
[公告] 炫语言常见错误以及解决方法 
 
这里再记录一个C语言风格的结构体强转方法 
例如有位置型、坐标型结构体,成员都是2个整型 
- 坐标 = *(坐标型*)&位置  // &位置表示取<span style="background-color: rgb(255, 255, 255);">变量(</span><span style="background-color: rgb(255, 255, 255);">位置型结构体</span><span style="background-color: rgb(255, 255, 255);">)的指针,可理解为将</span><span style="background-color: rgb(255, 255, 255);">位置型结构体指针强转为</span>坐标型结构体指针,再解引用赋值
 
  复制代码 2、重点来了,外部宏的使用。炫++目前模块比较少,C++借助AI可以填补这个缺憾,那么问题来了,各种常量怎么整? 
例如OpenProcess()函数,系统API模块中叫打开进程(),AI给出的示例代码如下 
- HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, processId)
 
  复制代码 第一个常量,以及取PID需要的套娃类型(DWORD)用外部宏就轻松解决了 
- #外部宏 DWORD
 
 - #外部宏 PROCESS_ALL_ACCESS
 
  
- HWND 窗口句柄_游戏 = 查找窗口("MainWindow", "Plants vs. Zombies")
 
 - DWORD pid
 
 - 取窗口线程进程ID(窗口句柄_游戏, &pid)
 
 - 打开进程(PROCESS_ALL_ACCESS, 假, pid)
 
  复制代码 过了上面2个坑,写代码就轻松多了 ,以下是本人手搓的通用型内存读写源码(以植物大战僵尸为例),写的太烂,请勿喷 
- #外部宏 DWORD
 
 - #外部宏 PROCESS_ALL_ACCESS
 
  
- //@备注 返回10进制内存地址
 
 - 函数 变整型 取基址(DWORD 进程pid, 变整型 内存地址)
 
 -         变整型 读到的内存地址 = 0
 
 -         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
 
 -         读进程内存(进程权限句柄, (空类型*)内存地址, &读到的内存地址, 4, 空)
 
 -         如果 (进程权限句柄)
 
 -                 关闭句柄(进程权限句柄)
 
 -         返回 读到的内存地址
 
  
- //@备注 欲读取的数据类型0-字节,1-2字节,2-4字节,3-8字节,4-单浮点,5-双浮点
 
 - 函数 逻辑型 读内存(DWORD 进程pid, 变整型 内存地址, 整型 欲读取的数据类型, 空类型* 数据)
 
 -         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
 
 -         逻辑型 状态 = 假
 
 -         分支判断 (欲读取的数据类型)
 
 -                 分支 0
 
 -                         字节型 返回的数据
 
 -                         字节型 *数据指针 = (字节型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 1, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 分支 1
 
 -                         短整型 返回的数据
 
 -                         短整型 *数据指针 = (短整型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 2, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 分支 2
 
 -                         整型 返回的数据
 
 -                         整型 *数据指针 = (整型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 4, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 分支 3
 
 -                         长整型 返回的数据
 
 -                         长整型 *数据指针 = (长整型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 8, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 分支 4
 
 -                         浮点型 返回的数据
 
 -                         浮点型 *数据指针 = (浮点型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 4, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 分支 5
 
 -                         双浮点型 返回的数据
 
 -                         双浮点型 *数据指针 = (双浮点型*)数据
 
 -                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 8, 空)
 
 -                         *数据指针 = 返回的数据
 
 -                         跳出
 
 -                 其他
 
 -                         跳出
 
 -         如果 (进程权限句柄)
 
 -                 关闭句柄(进程权限句柄)
 
 -         返回 状态
 
  
- //@备注 欲写入的数据类型0-字节,1-2字节,2-4字节,3-8字节,4-单浮点,5-双浮点
 
 - 函数 逻辑型 写内存(DWORD 进程pid, 变整型 内存地址, 整型 欲写入的数据类型, 空类型* 数据)
 
 -         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
 
 -         逻辑型 状态 = 假
 
 -         分支判断 (欲写入的数据类型)
 
 -                 分支 0
 
 -                         字节型 待写入数据
 
 -                         字节型 *数据指针 = (字节型*)数据
 
 -                         待写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 1, 空)
 
 -                         跳出
 
 -                 分支 1
 
 -                         短整型 待写入数据
 
 -                         短整型 *数据指针 = (短整型*)数据
 
 -                         待写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 2, 空)
 
 -                         跳出
 
 -                 分支 2
 
 -                         整型 待写入数据
 
 -                         整型 *数据指针 = (整型*)数据
 
 -                         待写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 4, 空)
 
 -                         跳出
 
 -                 分支 3
 
 -                         长整型 待写入数据
 
 -                         长整型 *数据指针 = (长整型*)数据
 
 -                         待写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 8, 空)
 
 -                         跳出
 
 -                 分支 4
 
 -                         浮点型 写入数据
 
 -                         浮点型 *数据指针 = (浮点型*)数据
 
 -                         写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&写入数据, 4, 空)
 
 -                         跳出
 
 -                 分支 5
 
 -                         双浮点型 写入数据
 
 -                         双浮点型 *数据指针 = (双浮点型*)数据
 
 -                         写入数据 = *数据指针
 
 -                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&写入数据, 8, 空)
 
 -                         跳出
 
 -                 其他
 
 -                         跳出
 
 -         如果 (进程权限句柄)
 
 -                 关闭句柄(进程权限句柄)
 
 -         返回 状态
 
  
- 函数 整型 入口函数() //控制台程序入口函数, 程序启动优先进入此函数
 
 -         控制台_置中文编码()
 
 -         HWND 窗口句柄_游戏 = 查找窗口("MainWindow", "Plants vs. Zombies")
 
 -         DWORD pid
 
 -         取窗口线程进程ID(窗口句柄_游戏, &pid)
 
 -         //[[731C50]+868]+5578
 
 -         变整型 阳光基址 = 0x731C50
 
 -         阳光基址 = 取基址(pid, 阳光基址)
 
 -         阳光基址 = 取基址(pid, 阳光基址 + 0x868)
 
 -         阳光基址 = 阳光基址 + 0x5578
 
 -         整型 数据 = 0
 
 -         读内存(pid, 阳光基址, 2, &数据)
 
 -         调试输出(数据)
 
 -         整型 a = 6000
 
 -         写内存(pid, 阳光基址, 2, &a)
 
 -         控制台_暂停()
 
 -         返回 0
 
  复制代码 
 
 
 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册 
 
 
 
×
 
 
 
 
 |