猿人学-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-15.1.10-android-x86_64 /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就方便多了 😁✨👌