Python反反爬虫 - Frida破解某安卓社区token反爬虫

Python反反爬虫 - Frida破解某安卓社区token反爬虫

前言

不多逼逼,这个安卓社区就是酷安,以前想过要爬这软件,但是都忘了,几天前抓了下它的包,发现请求 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 Windowoption+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是 v61v61 的加密代码在这在这里插入图片描述
加密的内容是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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值