猿人学-APP大赛-第一题-Frida初试
如何用fiddler抓包参考:https://www.cnblogs.com/JKding233/p/16649489.html
先介绍一些前置知识点和环境配置
Frida 安装和运行
pip3 install frida frida-tools
查看模拟器版本:
| 1 | adb shell | 
下载对应 frida-server压缩包:(小于或等于本地frida版本)

解压缩,拿到里面的可执行文件:
| 1 | frida-server-16.2.1-android-x86_64 | 
把可执行文件推送到手机里面:
| 1 | adb push frida-server /data/local/tmp/frida-server | 
启动 frida:
| 1 | adb shell | 
配置接口转发,注意每次启动都需要配置:
| 1 | adb forward tcp:27042 tcp:27042 | 
开启另一个cmd,运行:frida-ps -R,连接成功:

Frida Python 脚本
hook 脚本示例
| 1 | import frida | 
- 一直没有输出的话,先退出重新启动app,再运行脚本
- 一直进入不了函数内部的话,可以使用 rpc 的方式
- 不需要 on_message 也可以打印
rpc 脚本示例
| 1 | import frida | 
- 看情况是否要创建实例,public static开头的静态函数直接调用就行
题目分析:
登录APP后,显示要强制更新,
http://download.python-spider.com/yuanrenxuem107.apk
那就先把 apk 文件下载到本地,方便后面分析,抓包看一下分析请求

只有 sign 是变动的,page、t、token 都是一些普通的参数,直接整个文件拖进 jadx 分析,搜索关键词 第一题
很快定位到  com.yuanrenxue.match2022.fragment.challenge.ChallengeOneFragment 这个类,直接搜索 sign

可以看出,参数主要是 sb 转 string 再转 bytes 传入的,先用 frida hook 一下sign函数的参数和结果:

把参数 send 出来,转成字符串,python bytes 列表转字符串方法如下
| 1 | def bytes2str(ascii_lst): | 
| 1 | var clazz = Java.use('com.yuanrenxue.match2022.security.Sign'); | 
on_message 函数改一下:
| 1 | def on_message(message, data): | 
打印结果:

可见参数为:page=x 加 时间戳
进入 sign 函数内部,只引入了一个依赖,可以考虑扣 java代码,觉得麻烦的话就直接用rpc,这里两个方案的实现都写一下

方案一 调用 java 代码
既然要扣代码,就得先解决第三方依赖的问题,看一下调用点:

传入的是一个长整型数字,结合 String.format() 函数的使用 ,这里很可能是一个固定值,用于字符转换
本来想用 hook,结果死活进不去函数,无奈改用rpc调用的方式,脚本我已经放在上面了,计算结果为:%02x%02x%02x%02x
简单介绍一下,在 java中,
String.format("%02X", 11)就是 11 转 十六进制的意思,不足的部分补0,所以输出:0B
同理
String.format("%03X", 11)输出 00B
抠出来的java代码如下:
| 1 | import java.util.ArrayList; | 
有一个地方需要注意,int length = bArr.length * 8 替换为 long length = bArr.length * 8
jpype的使用,上面有介绍,可以比对 hook结果进行验证
我这里就直接上爬虫脚本了
| 1 | # -*- coding: utf-8 -*- | 
运行结果:

方案二 Frida rpc
参考:https://www.cnblogs.com/JKding233/p/16649489.html
| 1 | # -*- coding: utf-8 -*- | 
挑战成功:

整个逆向过程花费的时间挺多的,不过总算搞懂了 frida的使用,以后要逆向其他的app就方便多了 😁✨👌