前言

本文仅供学习探讨之用,如果侵犯您的权益请联系我删除。

抓包

如图,每个请求会附加一个hkey,hkey是个时间相关的token,我想要得到这个hkey的计算方法
抓包内容

APP分析

使用非常好用的国产分析软件 GDA:链接
国产GDA,强势推荐

@> 虽然GUI比较杀马特,但是又不是不能用

直接把APP丢进GDA,然后搜索字符串"hkey"
GDA搜索字符串

第一处:
这个是旧版本APP使用的计算方式,就是时间戳取MD5,然后把MD5结果里的"a"和"0"替换成"app",然后再取一次MD5,很弱智的加密

旧版APP加密方式

第二处:
这是新版本APP使用的计算方式,看导入名,使用了NDKTools包里的encode函数,v2是API的URL取路径,v1_1是时间戳

新版APP加密方式

使用Jadx,反混淆类名以后,定位到NDKTools类,看起来encode函数是个Native方法
NDKTools类

上吧,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:
HOOK输出

可以看到输出调用encode传入的3个参数,因为后两个是字符串,获取到的内容是个字符串地址,第一个参数貌似是个Java类

后续


最后修改:2020 年 08 月 06 日
如果觉得我的文章对你有用,请随意赞赏