首页
社区
课程
招聘
[原创]AI辅助逆向某flutter应用
发表于: 4天前 1166

[原创]AI辅助逆向某flutter应用

4天前
1166

引言:最近买了点基金,然后我对象基本过半个小时就提醒我看看基金情况,工位不太好不好摸鱼,所以就想着搞下这个app接口, 然后开发一个桌面应用挂在这里定时轮询,正好最近也想尝试一下jadx的mcp,AI分析到最后告诉我这是flutter开发的, 之前没有接触过flutter逆向,所以搞一下填补一下空白,下面开始正篇。

样本&&工具&&环境:

1.分析接口嘛,肯定先抓个包试试

抓包这里有个坑点,flutter自带SSL校验,这个问了下AI,github上有佬开源的通杀flutter SSL校验,感兴趣的可以去看一下代码实现 012K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5g2V1W2e0e0%4y4W2j5%4g2J5K9i4c8&6i4K6u0r3k6r3W2K6j5h3u0D9k6g2)9J5k6r3k6D9N6i4c8@1k6i4u0Q4x3X3c8@1L8s2y4Q4x3X3c8$3k6i4u0A6k6X3W2U0j5i4c8A6L8$3^5`.

定位到目标接口,头部有一个签名,看长度初步判断是md5

  python3 blutter.py path/to/app/lib/arm64-v8a out_dir
function readDartStringExact(ptr) {
    if (ptr.isNull()) return "null";

    try {
        // 1. 读取长度:位于指针偏移 +7 的位置,占用 4 个字节
        // 读取出来的 Smi 编码值需要右移 1 位才是真实长度
        let lengthSmi = ptr.add(7).readU32();
        let length = lengthSmi >> 1;

        if (length === 0) return "";
        if (length > 10240) return "[String suspiciously long: " + length + " bytes]";

        // 2. 读取字符串数据:位于指针偏移 +15 (0x0F) 的位置
        let strDataPtr = ptr.add(15);
        
        // 按照真实长度读取完整的 UTF-8 字符串
        let str = strDataPtr.readUtf8String(length);
        return str;
    } catch (e) {
        return "[Error reading string at " + ptr + ": " + e.message + "]";
    }
}

function hookMD5() {
    let moduleName = "libapp.so";
    let libapp = Process.getModuleByName(moduleName);
    let targetOffset = 0x70A264; 
    let targetAddress = libapp.base.add(targetOffset);

    console.log("[*] Hooking generateMD5 at: " + targetAddress);
    console.log("[*] Waiting for network requests...\n");

    Interceptor.attach(targetAddress, {
        onEnter: function(args) {
            // 我们已经确认 args[0] 就是我们要的明文字符串指针
            this.inputStringPtr = args[0];
            
            console.log("=========================================");
            console.log("[+] MD5 Signature Triggered!");
            
            // 使用精准解析函数读取完整明文
            let plaintext = readDartStringExact(this.inputStringPtr);
            
            console.log("[->] Full Plaintext Input:");
            console.log("-----------------------------------------");
            console.log(plaintext);
            console.log("-----------------------------------------");
            console.log("[i] Plaintext Length: " + plaintext.length + " characters");
        },
        onLeave: function(retval) {
            // 返回值同样是 Dart 字符串,包含 32 位的 MD5 Hex
            let md5Result = readDartStringExact(retval);
            
            console.log("[<-] MD5 Output Hash : " + md5Result);
            console.log("=========================================\n");
        }
    });
}

setTimeout(function() {
    hookMD5();
}, 1000);
  • 样本:5YW75Z+65a6d
  • ubuntu_22.04.5
  • jadx-mcp插件
  • IDA 9.2
  • frida 16.1.5
  • reqable
  • 抓包这里有个坑点,flutter自带SSL校验,这个问了下AI,github上有佬开源的通杀flutter SSL校验,感兴趣的可以去看一下代码实现 bd8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5g2V1W2e0e0%4y4W2j5%4g2J5K9i4c8&6i4K6u0r3k6r3W2K6j5h3u0D9k6g2)9J5k6r3k6D9N6i4c8@1k6i4u0Q4x3X3c8@1L8s2y4Q4x3X3c8$3k6i4u0A6k6X3W2U0j5i4c8A6L8$3^5`.

  • 定位到目标接口,头部有一个签名,看长度初步判断是md5

  • flutter开发的应用核心代码打包后都在libapp.so里面
  • 先在IDA里面搜索一下字符串 request-sign
  • 这里我本来想看交叉引用的,发现没效果,问了下AI,告诉我如下原因和解决方案
  • 按blutter官方文档执行以下命令,执行完之后会在你的输出目录生成以下内容
  • 输出文件
  • 其实到这里如果只是为了搞算法的话就已经可以将输出的asm里面的dio_request.dart导出文件丢给ai去分析就行了,针对这个app因为我已经知道它是一个加盐其未魔改的md5了,所以找盐这种事丢给ai完全可以胜任的
  • 但是为了体验flutter逆向全流程和熟悉IDA,我还是按网上教程,在IDA中导入了blutter生成的还原字符的脚本
  • 定位到_onRequest函数
  • hook盐值,在ida里我们看到了generateMD5函数的起始地址是0x70A264,所以我们只需要hook函数的入参和返回值,就能看到盐值了
  • 本次样本逆向全程基本都是由ai完成的,包括思路和分析,我只是给它提供需要的信息,虽然不复杂,不过也是学到一些新东西的,包括怎么去逆flutter,怎么过flutter的SSL校验,基于地址hook so函数等,写的比较水勿喷,只是为了记录一下flutter逆向的流程。感谢AI— ~hhhha
  1. 算法逆向
  1. 总结
  • 样本:5YW75Z+65a6d
  • ubuntu_22.04.5
  • jadx-mcp插件

  • [培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

    收藏
    免费 35
    支持
    分享
    最新回复 (14)
    雪    币: 0
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    2
    感谢你分享这么好的资源!
    3天前
    1
    雪    币: 104
    活跃值: (8162)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    rbq
    3天前
    0
    雪    币: 25
    活跃值: (3292)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    学习
    3天前
    0
    雪    币: 0
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    5
    65666
    2天前
    0
    雪    币: 3765
    活跃值: (3683)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    blutter 
    2天前
    0
    雪    币: 6554
    活跃值: (6450)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    7
    66
    2天前
    0
    雪    币: 375
    活跃值: (3586)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    8
    66
    1天前
    0
    雪    币: 7543
    活跃值: (24376)
    能力值: ( LV12,RANK:550 )
    在线值:
    发帖
    回帖
    粉丝
    9
    看看
    1天前
    0
    雪    币: 241
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    10
    看看
    1天前
    0
    雪    币: 35
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    11
    看看
    1天前
    0
    雪    币: 210
    活跃值: (1908)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    学习一下 
    1天前
    0
    雪    币: 114
    活跃值: (90)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    13
    看看
    1天前
    0
    雪    币: 201
    活跃值: (2207)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    14
    666666
    1天前
    0
    雪    币: 229
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    15
    66
    23小时前
    0
    游客
    登录 | 注册 方可回帖
    返回