吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1461|回复: 23
上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
Evan422 发表于 2026-4-2 11:44 回帖奖励

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

<hr>

样本&&工具&&环境:

  • 样本:5YW75Z+65a6d
  • ubuntu_22.04.5
  • jadx-mcp插件
  • IDA 9.2
  • frida 16.1.5
  • reqable

<hr>

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

  1. 算法逆向

    • flutter开发的应用核心代码打包后都在libapp.so里面
    • 先在IDA里面搜索一下字符串 request-sign
    • 这里我本来想看交叉引用的,发现没效果,问了下AI,告诉我如下原因和解决方案
    • 按blutter官方文档执行以下命令,执行完之后会在你的输出目录生成以下内容
      python3 blutter.py path/to/app/lib/arm64-v8a out_dir
    • 输出文件
    • 其实到这里如果只是为了搞算法的话就已经可以将输出的asm里面的dio_request.dart导出文件丢给ai去分析就行了,针对这个app因为我
      已经知道它是一个加盐其未魔改的md5了,所以找盐这种事丢给ai完全可以胜任的
    • 但是为了体验flutter逆向全流程和熟悉IDA,我还是按网上教程,在IDA中导入了blutter生成的还原字符的脚本
    • 定位到_onRequest函数
    • hook盐值,在ida里我们看到了generateMD5函数的起始地址是0x70A264,所以我们只需要hook函数的入参和返回值,就能看到盐值了
      [JavaScript] 纯文本查看 复制代码
      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 &gt; 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[zxsq-anti-bbcode-0] 就是我们要的明文字符串指针
        this.inputStringPtr = args[zxsq-anti-bbcode-0];

        console.log("=========================================");
        console.log("[+] MD5 Signature Triggered!");

        // 使用精准解析函数读取完整明文
        let plaintext = readDartStringExact(this.inputStringPtr);

        console.log("[-&gt;] Full Plaintext Input:");
        console.log("-----------------------------------------");
        console.log(plaintext);
        console.log("-----------------------------------------");
        console.log("[zxsq-anti-bbcode-i] Plaintext Length: " + plaintext.length + " characters");
    },
    onLeave: function (retval) {
        // 返回值同样是 Dart 字符串,包含 32 位的 MD5 Hex
        let md5Result = readDartStringExact(retval);

        console.log("[&lt;-] MD5 Output Hash : " + md5Result);
        console.log("=========================================\n");
    }
});

}

setTimeout(function () { hookMD5(); }, 1000);

} 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);

  1. 总结
    • 本次样本逆向全程基本都是由ai完成的,包括思路和分析,我只是给它提供需要的信息,虽然不复杂,不过也是学到一些
      新东西的,包括怎么去逆flutter,怎么过flutter的SSL校验,基于地址hook so函数等,写的比较水勿喷,只是为了记录
      一下flutter逆向的流程。感谢AI— ~hhhha

img_8.png (33.97 KB, 下载次数: 0)

img_8.png

免费评分

参与人数 4吾爱币 +3 热心值 +3 收起 理由
AIways + 1 + 1 再接再厉!
Dzhy + 1 谢谢@Thanks!
menyu001 + 1 热心回复!
xuhao4577062311 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
N2Yan 发表于 2026-4-2 16:24
watersoft 发表于 2026-4-2 15:52
不错,如何加入反AI措施?

反AI措施基本上就是反人类(破解)措施,用最新的混淆技术,自己拟定映射表,或者使用服务端解密这种真的反人类的玩意。
推荐
autea 发表于 2026-4-2 18:22
学习了,最近在学习如何对手机应用进行抓包分析,希望更多这种知识分享,能系统化地出就更好了。
沙发
Hmily 发表于 2026-4-2 11:59
@Evan422 编辑帖子的时候点一下编辑框上面的MD图标,然后关闭,这样可以禁用discuz代码的干扰。
3#
laowufendou 发表于 2026-4-2 12:55
支持你的 不错的
4#
whosafe 发表于 2026-4-2 14:43
牛气,我最近也打算抓点东西
5#
jay6124626 发表于 2026-4-2 15:51
什么AI 这么厉害啊
6#
watersoft 发表于 2026-4-2 15:52
不错,如何加入反AI措施?
8#
zhq114 发表于 2026-4-2 17:08
楼主用的是什么ai啊, 可以让他找,我用codex cli和claude cli  直接提示不让逆向的。
9#
 楼主| Evan422 发表于 2026-4-2 17:10 |楼主
zhq114 发表于 2026-4-2 17:08
楼主用的是什么ai啊, 可以让他找,我用codex cli和claude cli  直接提示不让逆向的。

别提逆向就行了

免费评分

参与人数 1吾爱币 +1 收起 理由
zhq114 + 1 热心回复!

查看全部评分

10#
slslsl 发表于 2026-4-2 17:51
提示词可以试下内部项目、分析学习和逻辑研究等等绕过
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-11 22:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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