安卓Native逆向笔记(一)
前言
本文仅供学习探讨之用,如果侵犯您的权益请联系本站删除。
1. 抓包
如图,每个请求会附加一个hkey,hkey是个时间相关的token,我想要得到这个hkey的计算方法
1. APP分析
使用非常好用的国产分析软件 GDA:链接
虽然GUI比较杀马特,但是又不是不能用
直接把APP丢进GDA,然后搜索字符串"hkey"
第一处:
这个是旧版本APP使用的计算方式,就是时间戳取MD5,然后把MD5结果里的"a"和"0"替换成"app",然后再取一次MD5,很弱智的加密
第二处:
这是新版本APP使用的计算方式,看导入名,使用了NDKTools包里的encode函数,v2是API的URL取路径,v1_1是时间戳
使用Jadx,反混淆类名以后,定位到NDKTools类,看起来encode函数是个Native方法
上吧,Frida
Frida是个通用HOOK框架,支持各种平台,可以动态插桩,比XPosed不知道高到哪里去了(?)
首先下载最新版的Frida Server:链接,下载安卓arm或者安卓arm64就行
安装Python3依赖库:pip3 install frida
Frida是这样的,手机或者电脑端运行的是Server端,用来接收指令,开发机是客户端
使用ADB连上手机,上传Frida Server
adb usb
adb push /sbin/frida [解压出来的Frida-server文件路径]
在ADB Shell里运行Frida-Server,我的设备已经ROOT了,没有ROOT没法动态HOOK
adb shell
$ su
# frida
在电脑上新建一个Python3工程
HOOK模板:
import sys
import frida
from typing import BinaryIO
js_file_name = 'Hook.js'
process_name = 'com.max.xiaoheihe'
# 自定义回调函数
def on_message(message, data):
print(message)
print(data)
def get_js_code():
js_file = open(js_file_name) # type: BinaryIO
return js_file.read()
if __name__ == '__main__':
rdev=frida.get_remote_device()
# 附加到进程并得到进程对象
process = rdev.attach(process_name)
# 指定JavaScript脚本
script = process.create_script(get_js_code())
# 加载JavaScript脚本
script.on('message', on_message)
script.load()
# 读取返回输入
sys.stdin.read()
在同级目录新建Hook.js
:
console.log("脚本载入成功");
Interceptor.attach(Module.findExportByName("libnative-lib.so", "encode"), {
onEnter: function (args) {
send("encode(" + Memory.readCString(args[0]) + "," + args[1]+"," + args[2] + ")");
},
onLeave: function (retval) {
}
});
在手机上打开APP,然后运行
如果输出"脚本载入成功"就说明HOOK没有错误,至于HOOK上了没有得操作一下APP:
可以看到输出调用encode传入的3个参数,因为后两个是字符串,获取到的内容是个字符串地址,第一个参数貌似是个Java类
未完待续