🛫 系列文章导航
- 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
- 【Frida】 01_食用指南 https://blog.csdn.net/kinghzking/article/details/126849567
- 【Frida】 03_初识frida-node https://blog.csdn.net/kinghzking/article/details/136685316
- 【Frida】 04_Frida中使用TypeScript脚本(采坑) https://blog.csdn.net/kinghzking/article/details/136772475
- 【Frida】 05_读取扫雷游戏的数据 https://blog.csdn.net/kinghzking/article/details/136781623
- 【Frida】 06_分析扫雷游戏的数据,显示地雷位置 https://blog.csdn.net/kinghzking/article/details/136685316
- 【Frida】 07_让系统重新绘制指定窗口 https://blog.csdn.net/kinghzking/article/details/136829854
- 【Frida】 08_将目标窗口切换到前台 https://blog.csdn.net/kinghzking/article/details/136837275
- 【Frida】 09_获取软件窗口位置,设置鼠标指针位置 https://blog.csdn.net/kinghzking/article/details/136854052
- 【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关) https://blog.csdn.net/kinghzking/article/details/136854020
- 【frida-实战】“一行”代码教你获取WeGame平台中所有的lua脚本 https://blog.csdn.net/kinghzking/article/details/125590584
- 【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权) https://blog.csdn.net/kinghzking/article/details/130512479
🛫 导读
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2024-03-17 | |
操作系统 | Win11 - 22H2 | 22621.2715 |
node -v | v20.10.0 | |
npm -v | 10.2.3 | |
yarn -v | 3.1.1 | |
frida-compile | 10.2.1 | 高版本各种异常 |
扫雷程序下载地址 | https://download.csdn.net/download/kinghzking/88979919 | |
课程源码 | https://gitcode.net/kinghzking/MyOpen | 所在目录:/course/frida |
1️⃣ 逆向分析
定位地雷数量
首先,扫雷游戏中雷的数量是一开始就设置好的,该数据为左边的LED显示,如下图所示,为10个。
同时,该值可以自定义设置,我们通过不断的修改该值,并通过CE搜索删选,很快定位到该数值(有三个)。
修改删选出来的三个值,修改他们,查看设置中的值,可以确定真正的雷的数量地址是
0x010056A4 (winmine.exe+56A4)
确定高度和宽度
从编程角度,设置中的值应该在同一个结构体中,在内存中体现出来,就是说他们内存一般不会离的太远。
我们通过修改设置中的宽高值,很快的确定高宽
地址分别是雷数+4
、+8
。
确定地图地址
这个地址,咱们也假设在雷数量附近。然后点击扫雷,让界面变化一下,很幸运的,出现了一堆
@
,比对几次,发现他们就是雷的内容了。
记录该地址为0x01005340
。
2️⃣ 编写脚本
frida函数解释
需要有一定的windows编程基础!!!
Process.getModuleByName
方法
根据名称获取进程
返回值:Module
对象
NativePointer
对象
对指针的封装,这里介绍一个方法add(rhs)
参数rhs
,它可以是一个数字,也可以是另一个 NativePointer
返回值:一个新的 NativePointer 对象
NativePointer
对象的另一个系列的方法readU8
、readU32
等,
直接读取不同位数的数值
返回值:整数
编写代码
本示例代码相对逻辑简单,主要有以下几个流程
- 获取主进程基址:
this.module_winmine
。- 获取棋盘高度、宽度、地雷数量,并打印出来。
- 遍历棋盘,按行遍历所有数值
class L07 {
private module_name_winmine = "winmine.exe";
private module_winmine: Module;
constructor() {
console.log("======================", new Date().toISOString(), "==========================");
console.log("Frida.version", Frida.version);
//获取模块基址
this.module_winmine = Process.getModuleByName(this.module_name_winmine);
}
board_info() {
let height = this.module_winmine.base.add(0x56A8).readU32();
console.log("棋盘高度:", height);
let width = this.module_winmine.base.add(0x56AC).readU32();
console.log("棋盘宽度:", width);
let mine_count = this.module_winmine.base.add(0x56A4).readU32();
console.log("地雷数量:", mine_count);
let head = this.module_winmine.base.add(0x5340);
console.log("棋盘头:", head);
//遍历棋盘,按行遍历
for (let i = 0; i < height + 2; i++) {
//按列遍历
let data = [];
for (let j = 0; j < width + 2; j++) {
let byte_data = head.add(j + 0x20 * i).readU8();
data.push(byte_data.toString(16).padStart(2, '0'));
}
console.log(data.join(" "));
}
}
}
let l07 = new L07();
l07.board_info();
测试运行
按照如下配置
watch05
,并运行npm run watch05
,将以监视模式编译05相关代码。
最后执行命令
D:\Python\Python371\Scripts\frida.exe -n winmine.exe -l index.js
将显示如下所示内容:
🛬 文章小结
本小节讲解了Frida的Process方法实战操作,并介绍了NativePointer及相关方法,大家可以参考官网文档了解更多方法使用。
📖 参考资料
- 【Frida】04_Frida中使用TypeScript脚本(采坑) https://blog.csdn.net/kinghzking/article/details/136772475
ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。