请注意,本文编写于 1823 天前,最后修改于 1568 天前,其中某些信息可能已经过时。
前言
本文仅供学习探讨之用,如果侵犯您的权益请联系我删除。
抓包
如图,每个请求会附加一个hkey,hkey是个时间相关的token,我想要得到这个hkey的计算方法
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不知道高到哪里去了(?),安装与使用参考这篇文章:
在电脑上新建一个Python3工程
HOOK模板:
import sys
import frida
process_name = 'com.max.xiaoheihe'
# 发送信息回调函数
def on_message(message, data):
if message['type'] == 'send':
print(f"[*] {message['payload']}")
else:
print(message)
if __name__ == '__main__':
try:
device = frida.get_usb_device()
except:
device = frida.get_remote_device()
if not device:
print("* 连接到Frida Server失败")
else:
process = device.attach(process_name)
# 加载JS脚本
js = open('hook.js', encoding='utf-8').read()
script = process.create_script(js)
script.on('message', on_message)
script.load()
# 读取返回输入
input()
script.unload()
在同级目录新建Hook.js
:
console.log("脚本载入成功");
Java.perform(function () {
var encodeAddr = Module.findExportByName("libnative-lib.so", "encode");
console.log(encodeAddr);
if (encodeAddr != null) {
Interceptor.attach(encodeAddr, {
onEnter: function (args) {
//args参数数组
console.log('encode-Enter')
console.log(args[0], Memory.readCString(args[0]));
console.log(args[1], Memory.readCString(args[1]));
console.log(args[2], Memory.readCString(args[2]));
console.log(args[3], Memory.readCString(args[3]));
console.log(args[4], Memory.readCString(args[4]));
},
onLeave: function (retval) {
//retval函数返回值
console.log('encode-Leave');
console.log(retval.toString());
console.log('======');
}
});
}
})
在手机上打开APP,然后运行
如果输出"脚本载入成功"就说明HOOK没有错误,至于HOOK上了没有得操作一下APP:
可以看到输出调用encode传入的3个参数,因为后两个是字符串,获取到的内容是个字符串地址,第一个参数貌似是个Java类
后续
本文链接:https://blog.chrxw.com/archives/2019/11/25/714.html
转载请保留本文链接,谢谢
4 条评论
在做了,群里的大神搞清楚hkey计算过程了,预计明天之前就能发布新版本
求后续!!!!!
真的很棒(☆ω☆)
已更新,感谢支持