返回列表 发新帖

【frida逆向】一部root手机进行frida逆向

  [复制链接]

4

主题

102

回帖

408

积分

初中生

Rank: 3Rank: 3

金币
259
好评
1
信誉
100
发表于 7 天前 来自手机  | 显示全部楼层 | 阅读模式  来自 西藏
本帖最后由 xendal 于 2026-8-24 13:12 编辑

教程是本人先逆向一次,然后写教程再逆向一次,所以有些地方可能会跳过,教程写的不是很详细,欢迎大佬们点评
不知道为啥图片都没了,这里放一个笔记链接,点我进入
xx菜谱大全frida逆向
包名:cn.lilaitech.wpcpdq
逆向参数:
请求体:APIDATA
响应解密
工具:reqable、mt、termux、frida
注意:手机需要root
类型:请求、响应加密
难度:简单
日期:

一、安装frida
  • 授予 termux 文件访问权限:termux-setup-storage
  • 下载frida-server(可以下载魔改版),并放入 data/local/tmp 中,并授予执行权限:chmod 777 frida文件名
  • 在termux安装frida相关需要:

  1. pkg install root-repo
  2. pkg install frida-python
复制代码

二、分析
打开抓包工具和外婆菜谱大全
为了方便分析,抓包选择对应APP

启动抓包,并滑动页面加载数据


一般都是搜索标题内容,但是这里搜索没有

一开始以为没抓到包,但是搜索 蛋糕 后就有我们要的数据


可以发现请求体和响应都是加密的


通过测试发现请求体 APIDATA 是必须的
三、逆向
一)请求体APIDATA
打开mt管理器,提取安装包,发现有加固,先去脱修,这里就不展示了


在 dex++中搜索 APIDATA,可以发现只有一个结果


点击进入后,转为 JAVA,方便分析

可以发现 APIDATA 由 str 获取

并且 str = new a().e(jSONObject.toString().getBytes());
这时可以试着使用frida hook该值
  1. function hookParma() {
  2.     // Hook f.a.e 方法
  3.     var A = Java.use("f.a");
  4.     A.e.implementation = function(byteArray) {
  5.         // 打印传入的字节数组长度
  6.         console.log("[f.a.e] byteArray length: " + byteArray.length);
  7.         // 将字节转为字符串(假设为 UTF-8)
  8.         var jsonString = Java.use("java.lang.String").$new(byteArray, "UTF-8");
  9.         console.log("[f.a.e] JSON data: " + jsonString);
  10.         // 调用原方法,获得加密后的字符串
  11.         var result = this.e(byteArray);
  12.         console.log("[f.a.e] encrypted result: " + result);
  13.         // 可选:修改返回值(例如 result = "fake_data")
  14.         return result;
  15.     };
  16.     // Hook FormBody.Builder.add(String, String)
  17.     var Builder = Java.use("okhttp3.FormBody$Builder");
  18.     Builder.add.overload('java.lang.String', 'java.lang.String').implementation = function(key, value) {
  19.         if (key === "APIDATA") {
  20.             console.log("[Builder.add] APIDATA value: " + value);
  21.             // 可选:修改 value,例如 value = "modified";
  22.             // 注意修改后会影响最终 POST 请求体
  23.         }
  24.         // 调用原方法
  25.         return this.add(key, value);
  26.     };
  27. }
  28. Java.perform(function() {
  29.     hookParma();
  30. });
复制代码
打开 termux,启动frida-server
  1. su
  2. ~/data/local/tmp/frida/rusda-server-17.15 127.0.0.1:27042
复制代码
打开新的终端

启动hook脚本
启动hook前先打开APP
  1. frida -H 127.0.0.1:27042 -N 包名 -l hookjs文件
  2. 如:
  3. frida -H 127.0.0.1:27042 -N cn.lilaitech.wpcpdq -l hook.js
复制代码
启动后将termux切到小窗口,并且打开抓包

之后还是加载数据,这时frida就有内容输出

暂停抓包和退出frida,进入termux可以发现加密前和加密后的值

将加密后的值随便复制一段

进入抓包软件,搜索复制的值,可以看到有匹配的包,将匹配的包里的 APIDATA 值复制下来

在将hook的值复制下来对比,可以发现是一样的

说明方向正确,接下来就是进入 a.e()函数中

进入e函数后再次转成JAVA,可以发现有 AES关键字

直接将这段代码丢给 AI 分析,简单给出结论

再告诉 AI 写一个 frida hook 代码
  1. // 辅助函数:字节数组转十六进制小写字符串
  2. function bytesToHex(bytes) {
  3.     if (!bytes) return "";
  4.     var hex = [];
  5.     for (var i = 0; i < bytes.length; i++) {
  6.         var b = bytes[i] & 0xFF;
  7.         hex.push(("0" + b.toString(16)).slice(-2));
  8.     }
  9.     return hex.join("");
  10. }
  11. // 辅助函数:字节数组转 Base64(使用 Android 的 Base64 类,显式指定重载)
  12. function bytesToBase64(bytes) {
  13.     if (!bytes) return "";
  14.     var Base64 = Java.use("android.util.Base64");
  15.     // 显式调用 overload('[B', 'int'),避免自动匹配失败
  16.     return Base64.encodeToString.overload('[B', 'int')(bytes, 2); // NO_WRAP
  17. }
  18. // 主 Hook 逻辑
  19. Java.perform(function () {
  20.     var A = Java.use("f.a");
  21.     // 1. 获取并打印硬编码密钥
  22.     console.log("[*] Creating instance to get key...");
  23.     var instance = A.$new();
  24.     var keyBytes = instance.a.value; // 获取 byte[] 字段
  25.     console.log("[*] AES Key (hex): " + bytesToHex(keyBytes));
  26.     console.log("[*] AES Key (base64): " + bytesToBase64(keyBytes));
  27.     // 2. Hook 加密方法 e(byte[])
  28.     A.e.implementation = function (bArr) {
  29.         console.log("\n[+] e() called");
  30.         // 原始输入 JSON 字符串
  31.         var inputStr = Java.use("java.lang.String").$new(bArr, "UTF-8");
  32.         console.log("[+] Input JSON: " + inputStr);
  33.         // 调用原方法获得加密结果
  34.         var result = this.e(bArr);
  35.         console.log("[+] Encrypted result: " + result);
  36.         return result;
  37.     };
  38.     // 3. Hook 解密方法 d(String)
  39.     A.d.implementation = function (encryptedStr) {
  40.         console.log("\n[+] d() called");
  41.         console.log("[+] Encrypted input: " + encryptedStr);
  42.         var plainBytes = this.d(encryptedStr);
  43.         if (plainBytes !== null) {
  44.             var plainStr = Java.use("java.lang.String").$new(plainBytes, "UTF-8");
  45.             console.log("[+] Decrypted plain JSON: " + plainStr);
  46.         } else {
  47.             console.log("[!] Decryption failed (MAC mismatch or error)");
  48.         }
  49.         return plainBytes;
  50.     };
  51.     // 4. Hook c 方法(AES 加解密)
  52.     A.c.implementation = function (mode, data, key, iv) {
  53.         var modeStr = (mode === 1) ? "ENCRYPT" : "DECRYPT";
  54.         console.log("[*] c() mode=" + modeStr);
  55.         console.log("[*]   data length: " + data.length);
  56.         console.log("[*]   key (hex): " + bytesToHex(key));
  57.         console.log("[*]   iv  (hex): " + bytesToHex(iv));
  58.         var result = this.c(mode, data, key, iv);
  59.         console.log("[*]   output length: " + (result ? result.length : "null"));
  60.         return result;
  61.     };
  62.     // 5. Hook a 方法(HMAC 计算)
  63.     var aMethod = A.a.overload('f.a', '[B', '[B');
  64.     aMethod.implementation = function (obj, data, key) {
  65.         console.log("[*] a() HMAC-SHA256");
  66.         console.log("[*]   data (hex): " + bytesToHex(data));
  67.         console.log("[*]   key  (hex): " + bytesToHex(key));
  68.         var result = this.a(obj, data, key);
  69.         console.log("[*]   HMAC raw (hex): " + bytesToHex(result));
  70.         return result;
  71.     };
  72.     // 6. Hook b 方法(字节转十六进制字符串)
  73.     var bMethod = A.b.overload('f.a', '[B');
  74.     bMethod.implementation = function (obj, bytes) {
  75.         var hexStr = this.b(obj, bytes);
  76.         console.log("[*] b() input length: " + (bytes ? bytes.length : 0) + ", output: " + hexStr);
  77.         return hexStr;
  78.     };
  79.     console.log("[*] All hooks installed successfully.");
  80. });
复制代码
之后再次启动frida hook

下滑加载数据,会发现有很多,并且还有响应的解密数据,一举两得

  1. 这时可以加 -o 文件名 来输出成文件
  2. frida -H 127.0.0.1:27042 -N cn.lilaitech.wpcpdq -l hook.js -o log.txt
复制代码
然后将输出的文件直接丢给 AI,让它来帮我们生成APIDATA加密和响应解密的Python爬虫代码即可
三、测试


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有1人评分好评 理由
悸D浮生 + 1

查看全部评分 总评分:好评 +1 

回复

使用道具 举报

0

主题

877

回帖

3076

积分

大学生

Rank: 5Rank: 5

金币
3598
好评
0
信誉
100
发表于 7 天前 来自手机  | 显示全部楼层  来自 四川
可惜没有root
回复

使用道具 举报

24

主题

3854

回帖

8429

积分

硕士生

打工仔

Rank: 6Rank: 6

金币
3821
好评
20
信誉
38

MT论坛新人考神MT论坛帅哥MT论坛活跃会员

QQ
发表于 7 天前 来自手机  | 显示全部楼层  来自 新疆
看看隐藏
回复

使用道具 举报

0

主题

470

回帖

1775

积分

高中生

Rank: 4

金币
920
好评
0
信誉
100
发表于 7 天前 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

9

主题

3668

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
4503
好评
3
信誉
100

2019-5.1节快乐MT论坛帅哥MT论坛最佳新人考神MT论坛新人挂机大佬

QQ
发表于 7 天前 | 显示全部楼层  来自 四川
看看隐藏
回复

使用道具 举报

87

主题

3212

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1073
好评
22
信誉
104

考神MT论坛最佳新人MT论坛帅哥

发表于 7 天前 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

12

主题

5246

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1590
好评
16
信誉
578

考神MT论坛帅哥MT论坛新人MT论坛最佳新人MT论坛活跃会员

发表于 7 天前 来自手机  | 显示全部楼层  来自 广西
看看隐藏
回复

使用道具 举报

24

主题

994

回帖

3119

积分

大学生

Rank: 5Rank: 5

金币
1011
好评
2
信誉
100
发表于 7 天前 来自手机  | 显示全部楼层  来自 广东
看看隐藏
回复

使用道具 举报

8

主题

252

回帖

1479

积分

高中生

Rank: 4

金币
804
好评
1
信誉
100

考神MT论坛新人

发表于 7 天前 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

0

主题

5

回帖

29

积分

幼儿园

Rank: 1

金币
20
好评
0
信誉
100
发表于 7 天前 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

2

主题

1334

回帖

6997

积分

硕士生

913559331

Rank: 6Rank: 6

金币
2790
好评
0
信誉
100

考神MT论坛帅哥

QQ
发表于 7 天前 来自手机  | 显示全部楼层  来自 河北
纯手机吗
回复

使用道具 举报

1

主题

1万

回帖

3万

积分

博士后

Rank: 8Rank: 8

金币
9010
好评
4
信誉
1302

考神MT论坛帅哥MT论坛新人

发表于 7 天前 来自手机  | 显示全部楼层  来自 广西
学习学习
回复

使用道具 举报

0

主题

1538

回帖

5690

积分

硕士生

Rank: 6Rank: 6

金币
1719
好评
2
信誉
100

MT论坛最佳新人

发表于 7 天前 来自手机  | 显示全部楼层  来自 河南
看看隐藏
回复

使用道具 举报

12

主题

4207

回帖

1万

积分

博士生

......

Rank: 7Rank: 7Rank: 7

金币
678
好评
18
信誉
100

考神MT论坛新人MT论坛最佳新人MT论坛帅哥挂机大佬

QQ
发表于 7 天前 来自手机  | 显示全部楼层  来自 江西
看看隐藏
回复

使用道具 举报

9

主题

967

回帖

5417

积分

硕士生

Rank: 6Rank: 6

金币
935
好评
0
信誉
98
发表于 7 天前 | 显示全部楼层  来自 江苏
学习学习
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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