【Frida】05_读取扫雷游戏的数据

🛫 系列文章导航

🛫 导读

开发环境

版本号描述
文章日期2024-03-17
操作系统Win11 - 22H222621.2715
node -vv20.10.0
npm -v10.2.3
yarn -v3.1.1
frida-compile10.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对象的另一个系列的方法readU8readU32等,
直接读取不同位数的数值
返回值:整数

编写代码

本示例代码相对逻辑简单,主要有以下几个流程

  • 获取主进程基址: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及相关方法,大家可以参考官网文档了解更多方法使用。

📖 参考资料

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值