前言
不多逼逼,这个安卓社区就是酷安,以前想过要爬这软件,但是都忘了,几天前抓了下它的包,发现请求 headers 里有一个 token 验证,果断就给破了
分析过程
先抓个包
可以看到其中有个请求头X-App-Token,这就是验证,至于X-App-Device这玩意儿应该是获取你手机信息的,不管它,先看看软件源代码,找到请求方法
1、jeb分析
没加固,好像也没混淆,舒服
搜索关键字:X-App-Token

很明显找到了我们要的东西了,(jeb3.0按tab键反编译)

这个 X-App-Token 是变量 v2_1,v2_1是,一个AuthUtils类里的getAS方法返回的

跟进可以发现这是一个native方法,lib是native-lib

到这里就没法用jeb分析了,我们先看看参数2 deviceId 是个什么玩意儿
可以看到是一个 SystemUtils类里的 getDeviceID方法返回的,传入一个context参数
我们去app的application hook这个方法
我找到一个代码量最少的方法,这样可以帮助我们不破坏原逻辑的情况下hook

hook的代码很简单
Java.perform(function() {
var CoolMarket = Java.use('com.coolapk.market.CoolMarketApplication');
CoolMarket.onLog.implementation = function() {
var deviceId = Java.use('com.coolapk.market.util.SystemUtils').getDeviceId(this);
console.log('Device Id: ', deviceId);
var app_token = Java.use('com.coolapk.market.util.AuthUtils').getAS(this, deviceId);
console.log('App Token: ', app_token);
console.log('----------');
return 1;
}
})
拿到 deviceId 后分析so
ida分析
解压apk拿到 native-lib.so,用ida打开
我们已知方法名和参数个数,那么就先搜索方法名
在 Function Window 按 option+t 搜索 getAS,可以看到,毛都没有

那我们就到 IDA View 里搜索,快捷键一样
找到了这个,参数是两个,但这个不是方法,没法 F5 反编译
不瞒你们,这个DCB是个什么玩意儿我也不知道. 但是我在 Function Window 瞎翻想找一些我能看得懂的方法名时看到了这个

我一看,这个方法好像和 getAS 有点关系就顺手 F5 了
简单看了看里面的代码,我估计我要找的是这个方法,为什么是这个方法而不是其他的
我分析了 X-App-Token 这个验证的组成,它长这样:
f2c29a109fde487e9350d3e6b881036a8513efac-09ea-3709-b214-95b366f1a1850x5d024391
我之前就获取到了我的 Device Id,我无意间看到了我的 device id就在里面,然后我把它拆分成了这样:
- f2c29a109fde487e9350d3e6b881036a
- 8513efac-09ea-3709-b214-95b366f1a185
- 0x5d024391
第一项很明显是md5密文,第二部分就是device id,最后是一个十六进制,不知道什么玩意儿,但我在那个 getAuthString 代码里看到了这段

这是一个字符串拼接的过程,其中 v82 是md5密文,也是字符串的头部,后面接着是 v43(device id)、字符串0x、最后是 hex_time (这是我改了后的命名),所以我就能确定这个方法就是我想要的;
上面说的也就是接下来要分析的,其中那个十六进制的东西就是时间戳,我们只需要分析出md5是怎么来的就行了,我们知道md5是 v61,v61 的加密代码在这
加密的内容是v58,v58是一个经过base64编码后的变量

我直接hook了md5加密类,有三个方法,一个是md5(应该是构造方法把)、update、finalize,hook 代码如下
var JNI_LOAD_POINTER = Module.getExportByName('libnative-lib.so', 'JNI_OnLoad'); // 首先拿到 JNI_OnLoad方法的地址
// 这里减去的是从so中得到的JNI_OnLoad的地址 0x31A04
var BASE_ADDR = parseInt(JNI_LOAD_POINTER) - parseInt('0x31A04'); // 用程序运行中JNI_OnLoad的绝对地址减去它的相对地址得到基址
// MD5

最低0.47元/天 解锁文章
651

被折叠的 条评论
为什么被折叠?



