启xin宝app的token算法破解——抓包分析篇(一)
转:https://blog.youkuaiyun.com/qq_34067821/article/details/100050472
为了提升逆向技术,最近几日研究了企cha查的sign和启xin宝的token算法,目前已经成功破解,两个app均是最新版,并将企cha查写成爬虫小demo,放在github上,详情查看 https://juejin.im/post/5d609fd26fb9a06acb3eab29 具体不在多说,今日继续启xin宝的token破解。
启xin宝的token破解可谓是有点小难,秘钥在ndk里面,比较难取,不过用一个比较火的技术就很快搞定了,后边详细说。
对于启xin宝我么就需要先进行抓包了,这里使用Charles进行手机端抓包:
这里随便抓了一个url,我们看到有token、push-registration、imei等等,那这么多的请求头里面是都需要吗??
我们做一个验证,使用requests或者就Charles重发验证,这里使用Charles重发验证,需要先进行更改请求头,然后重新发送即可。
1.右键在url上选择撰写
2.点击请求头
3.对请求头进行更改
4.执行(还可以进行还原操作)
经过我的验证发现只有token、appversion是最重要的,其他都没有太大作用,有兴趣的小伙伴可以自己试试。
对于app-version我们直接就可以拿来用,但是对于token怎么办,下一篇继续分析吧。
启xin宝app的token算法破解——逆向篇(二)
对于一个app而言,我们要逆向app,需要知道什么呢?
逆向工具
Java基础,甚至c和汇编基础
加固类型和脱壳工具
安卓开发基础
对安卓系统的认知
对xposed的认知
smali基础
以上这些是必须了解甚至掌握的,爬虫逆向路上越走越远了。
回归正题,该app是怎样一种app呢??
如何去查看app是否加固(加壳)呢?
我们要借助易开发这款app进行检验(同时带有脱壳功能)
可以看到该app是360加固,我们直接脱壳,然后导出脱壳数据分享到电脑上,导出数据为dex。
dex又是什么呢?
这篇文章可以了解一下浅谈 Android Dex 文件
本文不做相关基础的书写。还需要读者自己进行学习。
我们现在有了安卓apk的dex,现在就需要对dex进行逆向了。
这里推荐的工具有gda(中国人自己写的)、jeb(功能强大,需要付费)、jadx(逆向出更利于阅读的代码),如果涉及到ndk,我们还需要ida,工具的具体用法这里就不详细说了。本次使用jadx进行逆向dex文件,然后保存成Java源代码进行分析,Java源码代码分析,这里使用idea(Java开发工具)。
在使用jadx反编译dex的时候,内存使用比较大,请注意内存的大小。
上图保存成Java源代码之后,使用idea打开,然后继续分析token,下一篇继续。
启xin宝app的token算法破解——token分析篇(三)
本篇就爱你是对token静态分析,其实很简单就可以搞定那种。通过idea的全局搜索,直接搜索"token"直接找到token在哪里,上图。
找到了,进去看看,这是MessageUtil
类里面,可以看下MessageUtil
的具体方法:
具体代码就不贴了,分析到这里发现使用ndk,也就是c编译之后的so文件,这就有点难办了,先不管这个,继续分析下。
static {
System.loadLibrary("encrypt-lib");
}
在该类里面有这个return b.a(str);
方法,该方法是具体的算法分析。
/* renamed from: a reason: collision with root package name */
public static String f1288a = "CryptoTool_KEY";
public static String b = "CryptoTool_IV";
public static String c = MessageUtil.getKey();
public static String d = MessageUtil.getIV();
private static final String e = "AES/CBC/PKCS5Padding";
private static byte[] f = a.a(c);
private static SecretKeySpec g = new SecretKeySpec({}, "AES");
private static Cipher h;
public static String a(String str) {
try {
if (h == null) {
f = a.a(c);
g = new SecretKeySpec(f, "AES");
h = Cipher.getInstance(e);
h.init(1, g, new IvParameterSpec(a.a(d)));
}
byte[] bytes = str.getBytes("UTF-8");
byte[] bArr = new byte[h.getOutputSize(bytes.length)];
h.doFinal(bArr, h.update(bytes, 0, bytes.length, bArr, 0));
return Base64.encodeToString(bArr, 2);
} catch (Exception e2) {
e2.printStackTrace();
return null;
}
}
看到该token使用的是AES进行加密,具体的秘钥和偏移则在encrypt-lib里面。
如何能拿到秘钥和偏移呢?这里可以借助frida和xposed的hook进行提取,下一篇进行frida的hook提取。
启xin宝app的token算法破解——frida篇(四)
本篇就将对token的秘钥进行hook,使用上篇提到的frida进行hook,hooknative方法,获取到秘钥和偏移。
对于frida是什么?
Frida是一个动态代码插桩框架,这里的介绍主要以应用在Android平台应用程序上。动态二进制插桩(DBI)是将外部代码注入到现有的正在运行的二进制文件中,从而让它执行额外操作。DBI可以:
1.访问进程内存
2.在应用程序运行时覆盖函数
3.从导入的类调用函数
4.在堆上查找对象实例并使用
5.Hook、跟踪和拦截函数等
怎么使用呢?
pip install frida (python环境)
1.下载服务器二进制文件frida-server要和pip的版本相同
2.$ adb push frida-server-10.0.1-android-arm /data/local/tmp/frida-server
3.$ adb shell
4.cd /data/local/tmp
5.chmod 755 frida-server
6../frida-server
查看frida-server是否启动成功:
frida-ps -U能看到安卓的应用进程就行
启动成功后开始写python和具体的hook代码。
python代码:
import sys
import frida
def onmsg(msg, data):
print(msg)
jscode = open('qxb.js', 'r', encoding='utf8').read()
session = frida.get_usb_device().attach("com.bertadata.qxb")
script = session.create_script(jscode)
script.on('message', onmsg)
script.load()
sys.stdin.read()
现在可以对该app的具体方法hook
需要hook是MessageUtil
类下的具体方(该代码为参考代码,并不是该app的实际应用代码)
setImmediate(function () {
//延迟1秒调用Hook方法
console.log('start----')
setInterval(test, 1000);
// test()
});
function test() {
Java.perform(function () {
var hook = Java.use('com.类名');
hook.方法.overload('传参类型', 'java.lang.String', 'java.lang.String').implementation = function (a1, a2, a3) {
var ss = this.方法(a1, a2, a3);//调用是本方法
console.log('a1参数1 =' + a1);//打印
console.log('a2参数2 =' + a2);
console.log('a3参数3 =' + a3);
console.log('res=' + ss);
return ss;
};
执行python代码就可以直接打印出需要秘钥和偏移
拿到秘钥之后我们就需要验证该秘钥了,使用第一篇的token进行解密就可以咯。在实际中需要对改密要进行byte数组转换,更具体的转换方法。