起序:学 安卓逆向
用到的 Frida
框架,小规模实战一波。起 了解 Frida 框架简单使用
的作用。
一、软件环境
测试 APK
是比较老的版本,因为从这个版本往上都是经过加固
的,反编译不出源码,我还不会脱壳
。所以…,你懂的。
二、抓包配置
本文使用的
老版本
的APK
,使用的是HTTP
,下方链接是配置之后,Fiddler
可以抓取HTTPS
包。请自行选择。
三、抓包分析&审计代码
1、安装 APK
这个打个码,自己下载之后就知道了。
注:在进行下面的步骤之前,先打开 Fiddler
。如何使用 Fiddler
这里不细讲。
2、登陆
账号密码都是随便的,目的是
抓包分析
包结构。点击登陆。
3、Fiddler 查看包结构
1、查看 WebForms
点击左边协议
→Inspectors
→WebForms
,可以看到有两个字段,正是点击登陆输入的账号密码,还有一个不知道的字符串(可以大胆猜测是加密的字符串)。
字段 | 值 |
---|---|
data | {“password”:“123”,“phone”:“15912345678”} |
apisign | 7f2e918f3083fa5c3ca95a6a83759d60 |
2、查看 Raw
这个是封包的协议头
这个就不解释了,看看就行了。
POST http://guocai.test2.ruanjiekeji.com/App/Login/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 112
Host: guocai.test2.ruanjiekeji.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.6.0
data=%7B%22password%22%3A%22123%22%2C%22phone%22%3A%2215912345678%22%7D&apisign=7f2e918f3083fa5c3ca95a6a83759d60
4、搜索关键字段
封包中的除去原来
HTTP/HTTPS
协议中原有的字段,其他不属于协议中的字段都是程序中自己封装的,所以就可以根据字段
来搜索该字段
出现的位置,比如这个加密的字符串 apisign
。
1、反编译 apk
此时用到的
jadx-gui
反编译apk
工具。
2、搜索 apisign
勾选
类名
、方法名
、变量名
、代码
。因为对于初学者来说,不知道apisign
会出现在哪里,所以勾选全部是最为稳妥的做法。(附加:像封装协议中的数据一般都在代码
中,所以只勾选代码
也是可以的。)
进入到该代码块中。
3、简单阅读代码
从这两行代码中可以看出
data
和apisign
就是协议包头
的数据。
- 这里可以看出,将
Constants.MD5_KEY
和data 的字符串
进行 MD5 加密,那这里的两个参数是什么的?
...
newBodyBuilder.add("data", data.toString());
newBodyBuilder.add("apisign", MD5Util.ToMD5(Constants.MD5_KEY, data.toString()));
...
按着
Ctrl
,点击MD5_KEY
。可以看出MD5_KEY
是一个字符串:d367f4699214cec412f7c2a1d513fe05
。
按着
Ctrl
,点击ToMD5
方法,可查看MD5Util
中ToMD5
方法的内容。这里就这吧,反正也不好看懂。也不必看懂。为了能看到ToMD5
这个加密方法传入的两个参数的内容,该Frida
出场了。
String pstr2 = secretKey + pstr;
ToMD5
方法的第一条语句就是将两个参数拼接起来
。
四、Frida Hook ToMD5 方法
Frida
是使用Python
和JavaScript
代码实现Hook
的。
1、Frida 环境搭建
2、代码解释
这就需要一些基础了,我尽量写的明白点吧。要想熟练使用,需要系统的学习一下
Frida
这个框架如何使用的。
# -*- coding: utf-8 -*-
# 导入 frida, sys 库
import frida, sys
# 编写 JavaScript 代码
jscode = """
Java.perform(function(){
<!-- 获取 MD5Util 这个类的对象 -->
var utils = Java.use("com.softgarden.baselibrary.utils.MD5Util");
<!-- 调用 ToMd5 这个,因为这个方法的参数有两个,所以在 function 中有两个参数,至于为什么没有类型修饰,因为 JavaScript 是弱语言 -->
utils.ToMD5.implementation = function(a, b){
<!-- send() 方法就是输出到控制台上,下面有截图可以看出效果 -->
send("Hook Start...");
send("第一个参数: " +a);
send("第二个参数: " +b);
<!-- 获取 ToMD5 这个方法执行的结果,并打印到控制台上 -->
var res = this.ToMD5(a, b);
send("ToMD5 方法返回值: " +res);
<!-- 返回这个结果,因为在 ToMD5 方法中就是将整个方法执行的结果返回,这里没有做任何修改,只是做了输出中间结果 -->
return res;
}
});
"""
# 这下面的代码的作用就是为了执行上面 JS 代码,输出 JS 中 send() 方法中的内容
def message(message, data):
if message["type"] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
# 获取这个 APK 的进程
process = frida.get_remote_device().attach('com.ljhhr.mobile')
# 加载 JS 代码
script = process.create_script(jscode)
script.on("message", message)
script.load()
sys.stdin.read()
3、执行 py
脚本&展示
复制上面
py
脚本放在py
文件中,在含有frida
和frida-tools
的虚拟环境中,执行该脚本。
python Frida.py
再点击
雷电模拟器
中APK
的登陆按钮,可以看出输出的内容。
对比一下
查看 WebForms
,这里输出的内容和查看 WebForms
这一步一摸一样。
[*] Hook Start...
[*] 第一个参数: d367f4699214cec412f7c2a1d513fe05
[*] 第二个参数: {"password":"123","phone":"15912345678"}
[*] ToMD5 方法返回值: 7f2e918f3083fa5c3ca95a6a83759d60
4、加密验证
到目前可知,
apisign
的值是采用MD5
加密得出的,加密前的数据是传入的两个参数拼接
起来的。
五、总结
从上面可以看出
Frida 框架
的简单使用方法,首先要有一个完整的软件环境
,为了搭建一个完整的环境,我也是头发掉了好几根。
- 完整的软件环境
- 熟练使用
抓包工具(Fiddler、Wireshark...)
, - 快速定位关键代码
- 代码审计
- 脚本编写
如果对您有帮助,点个赞再走吧。