论坛首页 安全工具分享区 阅读主题

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

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

样本&&工具&&环境:1.分析接口嘛,肯定先抓个包试试抓包这里有个坑点,flutter自带SSL校验,这个问了下AI,github上有佬开源的通杀flutter SSL校验,感兴趣的可以去看一下代码实现 f87K9s2c8@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";

// 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校验,感兴趣的可以去看一下代码实现 b11K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5g2V1W2e0e0%4y4W2j5%4g2J5K9i4c8&6i4K6u0r3k6r3W2K6j5h3u0D9k6g2)9J5k6r3k6D9N6i4c8@1k6i4u0Q4x3X3c8@1L8s2y4Q4x3X3c8$3k6i4u0A6k6X3W2U0j5i4c8A6L8$3^5`.

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


flutter开发的应用核心代码打包后都在libapp.so里面
先在IDA里面搜索一下字符串 request-sign
这里我本来想看交叉引用的,发现没效果,问了下AI,告诉我如下原因和解决方案
按blutter官方文档执行以下命令,执行完之后会在你的输出目录生成以下内容

输出文件
其实到

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290688.htm
#2 2026-06-01 21:09:11
感谢你分享这么好的资源!
#3 2026-06-01 21:09:11
rbq
#4 2026-06-01 21:09:11
学习
#5 2026-06-01 21:09:11
blutter
#6 2026-06-01 21:09:11
看看
#7 2026-06-01 21:09:11
看看
#8 2026-06-01 21:09:11
看看
#9 2026-06-01 21:09:11
学习一下
#10 2026-06-01 21:09:11
看看
#11 2026-06-01 21:09:11
6666 感谢大佬
#12 2026-06-01 21:09:11
APP也没加固什么的么..之前想让AI逆一个APP ida的mcp和jadx的mcp 以及 frida都给他提供好了
然后他就在那里死磕ollvm切到frida 因为有注入检测 spwn启动就崩溃 ai自己搁那改 改了几十个版本了..
烧了我300M的token 最终还是不了了之
#13 2026-06-01 21:09:11
学习学习
#14 2026-06-01 21:09:11
感谢分享。
#15 2026-06-01 21:09:11
感谢大佬
#16 2026-06-01 21:09:11
正在学flutter逆向。感谢!
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号