|
先纪念一下踩过的坑
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
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|