找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 171|回复: 1

[源码] [初级入狱教程]通用型内存读写源码与炫++避坑不完全指南

[复制链接]

18

主题

43

回帖

256

积分

中级会员

积分
256
发表于 2024-8-27 17:25:18 | 显示全部楼层 |阅读模式
先纪念一下踩过的坑

1、模块混用时各种数据类型套娃(特别是WINDOWS API中各种数据类型套娃)引发的报错,详见大神花姐的解答
[公告] 炫语言常见错误以及解决方法

这里再记录一个C语言风格的结构体强转方法
例如有位置型、坐标型结构体,成员都是2个整型
  1. 坐标 = *(坐标型*)&位置  // &位置表示取<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给出的示例代码如下
  1. HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, processId)
复制代码
第一个常量,以及取PID需要的套娃类型(DWORD)用外部宏就轻松解决了
  1. #外部宏 DWORD
  2. #外部宏 PROCESS_ALL_ACCESS

  3. HWND 窗口句柄_游戏 = 查找窗口("MainWindow", "Plants vs. Zombies")
  4. DWORD pid
  5. 取窗口线程进程ID(窗口句柄_游戏, &pid)
  6. 打开进程(PROCESS_ALL_ACCESS, 假, pid)
复制代码
过了上面2个坑,写代码就轻松多了,以下是本人手搓的通用型内存读写源码(以植物大战僵尸为例),写的太烂,请勿喷
  1. #外部宏 DWORD
  2. #外部宏 PROCESS_ALL_ACCESS

  3. //@备注 返回10进制内存地址
  4. 函数 变整型 取基址(DWORD 进程pid, 变整型 内存地址)
  5.         变整型 读到的内存地址 = 0
  6.         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
  7.         读进程内存(进程权限句柄, (空类型*)内存地址, &读到的内存地址, 4, 空)
  8.         如果 (进程权限句柄)
  9.                 关闭句柄(进程权限句柄)
  10.         返回 读到的内存地址

  11. //@备注 欲读取的数据类型0-字节,1-2字节,2-4字节,3-8字节,4-单浮点,5-双浮点
  12. 函数 逻辑型 读内存(DWORD 进程pid, 变整型 内存地址, 整型 欲读取的数据类型, 空类型* 数据)
  13.         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
  14.         逻辑型 状态 = 假
  15.         分支判断 (欲读取的数据类型)
  16.                 分支 0
  17.                         字节型 返回的数据
  18.                         字节型 *数据指针 = (字节型*)数据
  19.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 1, 空)
  20.                         *数据指针 = 返回的数据
  21.                         跳出
  22.                 分支 1
  23.                         短整型 返回的数据
  24.                         短整型 *数据指针 = (短整型*)数据
  25.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 2, 空)
  26.                         *数据指针 = 返回的数据
  27.                         跳出
  28.                 分支 2
  29.                         整型 返回的数据
  30.                         整型 *数据指针 = (整型*)数据
  31.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 4, 空)
  32.                         *数据指针 = 返回的数据
  33.                         跳出
  34.                 分支 3
  35.                         长整型 返回的数据
  36.                         长整型 *数据指针 = (长整型*)数据
  37.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 8, 空)
  38.                         *数据指针 = 返回的数据
  39.                         跳出
  40.                 分支 4
  41.                         浮点型 返回的数据
  42.                         浮点型 *数据指针 = (浮点型*)数据
  43.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 4, 空)
  44.                         *数据指针 = 返回的数据
  45.                         跳出
  46.                 分支 5
  47.                         双浮点型 返回的数据
  48.                         双浮点型 *数据指针 = (双浮点型*)数据
  49.                         状态 = 读进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&返回的数据, 8, 空)
  50.                         *数据指针 = 返回的数据
  51.                         跳出
  52.                 其他
  53.                         跳出
  54.         如果 (进程权限句柄)
  55.                 关闭句柄(进程权限句柄)
  56.         返回 状态

  57. //@备注 欲写入的数据类型0-字节,1-2字节,2-4字节,3-8字节,4-单浮点,5-双浮点
  58. 函数 逻辑型 写内存(DWORD 进程pid, 变整型 内存地址, 整型 欲写入的数据类型, 空类型* 数据)
  59.         句柄型 进程权限句柄 = 打开进程(PROCESS_ALL_ACCESS, 假, 进程pid)
  60.         逻辑型 状态 = 假
  61.         分支判断 (欲写入的数据类型)
  62.                 分支 0
  63.                         字节型 待写入数据
  64.                         字节型 *数据指针 = (字节型*)数据
  65.                         待写入数据 = *数据指针
  66.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 1, 空)
  67.                         跳出
  68.                 分支 1
  69.                         短整型 待写入数据
  70.                         短整型 *数据指针 = (短整型*)数据
  71.                         待写入数据 = *数据指针
  72.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 2, 空)
  73.                         跳出
  74.                 分支 2
  75.                         整型 待写入数据
  76.                         整型 *数据指针 = (整型*)数据
  77.                         待写入数据 = *数据指针
  78.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 4, 空)
  79.                         跳出
  80.                 分支 3
  81.                         长整型 待写入数据
  82.                         长整型 *数据指针 = (长整型*)数据
  83.                         待写入数据 = *数据指针
  84.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&待写入数据, 8, 空)
  85.                         跳出
  86.                 分支 4
  87.                         浮点型 写入数据
  88.                         浮点型 *数据指针 = (浮点型*)数据
  89.                         写入数据 = *数据指针
  90.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&写入数据, 4, 空)
  91.                         跳出
  92.                 分支 5
  93.                         双浮点型 写入数据
  94.                         双浮点型 *数据指针 = (双浮点型*)数据
  95.                         写入数据 = *数据指针
  96.                         状态 = 写进程内存(进程权限句柄, (空类型*)内存地址, (空类型*)&写入数据, 8, 空)
  97.                         跳出
  98.                 其他
  99.                         跳出
  100.         如果 (进程权限句柄)
  101.                 关闭句柄(进程权限句柄)
  102.         返回 状态

  103. 函数 整型 入口函数() //控制台程序入口函数, 程序启动优先进入此函数
  104.         控制台_置中文编码()
  105.         HWND 窗口句柄_游戏 = 查找窗口("MainWindow", "Plants vs. Zombies")
  106.         DWORD pid
  107.         取窗口线程进程ID(窗口句柄_游戏, &pid)
  108.         //[[731C50]+868]+5578
  109.         变整型 阳光基址 = 0x731C50
  110.         阳光基址 = 取基址(pid, 阳光基址)
  111.         阳光基址 = 取基址(pid, 阳光基址 + 0x868)
  112.         阳光基址 = 阳光基址 + 0x5578
  113.         整型 数据 = 0
  114.         读内存(pid, 阳光基址, 2, &数据)
  115.         调试输出(数据)
  116.         整型 a = 6000
  117.         写内存(pid, 阳光基址, 2, &a)
  118.         控制台_暂停()
  119.         返回 0
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

32

主题

143

回帖

736

积分

高级会员

积分
736
发表于 2024-8-27 17:46:24 | 显示全部楼层
谢谢,学习了!原来是这样用分支的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2024-11-23 16:16 , Processed in 0.076285 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表