[转]Python 反反爬虫 – Frida 破解某盒子 hkey 反爬虫算法

本贴最后更新于 1724 天前,其中的信息可能已经时移世改

[转]Python 反反爬虫 – Frida 破解某盒子 hkey 反爬虫算法

前言

这盒子有个抽奖功能,但是中奖率感人~
故,hack!
用到的工具:

1.抓包软件:NetKeeper[安卓端]
2.jeb 分析工具[PC 端]
3.ida 分析工具[PC 端]
4.Frida [Python 模块以及服务端]

分析处理

先抓个包包吧

image.png

主要请求部分如下:

POST /account/data_report/?type=13&time_=1595993115&heybox_id=17584182&imei=xxxxx&os_type=Android &os_version=6.0&version=1.3.114&_time=1595993115&hkey=bd34ee4c62 &channel=heybox_yingyongbao HTTP/1.1

经过测试 hkey 会随 time_ 值变动而变动

jeb 分析

搜寻 hkey

image.png

v1v2 的值来源似乎不好处理,

为了减少脑细胞与头发的消耗,可以尝试从 NDKTools->encode 方法入手。

但是,到达 encode 位置后(Ctrl+双击),

image.png

啊,这得上 ida 了

ida 分析

进入 ida 的 encode 中,

image.png

image.png

看似没什么大问题,来 hook:

console.log("========Hook Start==========") String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, function (match, index) { if (values.length > index) { return values[index]; } else { return ""; } }); } var JNI_LOAD_POINTER = Module.getExportByName('libnative-lib.so', 'JNI_OnLoad'); // 首先拿到 JNI_OnLoad方法的地址 var BASE_ADDR = parseInt(JNI_LOAD_POINTER) - parseInt('0x1C6C'); // 用程序运行中JNI_OnLoad的绝对地址减去它的相对地址得到基址 // encode Java.perform(function() { var hookpointer = '0x' + parseInt(BASE_ADDR + parseInt('0x1B00')).toString(16) // 获取要hook方法的地址 var pointer = new NativePointer(hookpointer) // 根据方法地址构建NativePointer console.log('[encode] hook pointer: ', pointer) var arg0, arg1, arg2, arg3 Interceptor.attach(pointer, { onEnter: function(args) { arg0 = args[0] arg1 = args[1] arg2 = args[2] arg3 = args[3] console.log('\n') console.log('=====> [encode] -> [方法调用前]') console.log('参数1: {0} => {1}'.format(arg0, Memory.readCString(arg0))) console.log('参数2: {0} => {1}'.format(arg1, Memory.readCString(arg1))) console.log('参数3: {0} => {1}'.format(arg2, Memory.readCString(arg2))) console.log('参数4: {0} => {1}'.format(arg3, Memory.readCString(arg3))) console.log('参数5: {0} => {1}'.format(args[4], Memory.readCString(args[4]))) console.log('\n') }, onLeave: function(retval) { console.log('\n') console.log('=====> [encode] -> [方法调用后]:') console.log('返回值: ', retval) console.log('参数1: {0} => {1}'.format(retval, Memory.readCString(retval))) console.log('\n') } } ) })

但是,还是出了些问题:

image.png

额,我不觉得肉眼能看出这是什么东西

既然程序处理了一些不能看的东西,那就尝试去找出能看的东西吧 😑

我觉得选择 MDString 比较好,因为可以看到什么东西被拿去算 md5 了。

hook MDString:

console.log("========Hook Start==========") String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, function (match, index) { if (values.length > index) { return values[index]; } else { return ""; } }); } var JNI_LOAD_POINTER = Module.getExportByName('libnative-lib.so', 'JNI_OnLoad'); // 首先拿到 JNI_OnLoad方法的地址 var BASE_ADDR = parseInt(JNI_LOAD_POINTER) - parseInt('0x1C6C'); // 用程序运行中JNI_OnLoad的绝对地址减去它的相对地址得到基址 // MDString Java.perform(function() { var hookpointer = '0x' + parseInt(BASE_ADDR + parseInt('0x15C4')).toString(16) // 获取要hook方法的地址 var pointer = new NativePointer(hookpointer) // 根据方法地址构建NativePointer console.log('[MDString] hook pointer: ', pointer) var arg0, arg1, arg2, arg3 Interceptor.attach(pointer, { onEnter: function(args) { arg0 = args[0] arg1 = args[1] arg2 = args[2] console.log('\n') console.log('=====> [MDString] -> [方法调用前]') console.log('参数1: {0} => {1}'.format(arg0, Memory.readCString(arg0))) console.log('\n') }, onLeave: function(retval) { console.log('\n') console.log('=====> [MDString] -> [方法调用后]:') console.log('返回值: ', retval) console.log('返回: {0} => {1}'.format(retval, Memory.readCString(retval))) console.log('参数1: {0} => {1}'.format(arg0, Memory.readCString(arg0))) console.log('\n') } } ) })

输出:

image.png

可以发现,返回值正是将 /game/all_recommend/bfhdkud_time=1596004491 进行 MD5 加密:

image.png

结合抓包到的请求,可以得到 NDKTOOL->encode 的原理:

由路径 /game/all_recommend 与时间戳 1596004491 以及 /bfhdkud_time=

拼接成 /game/all_recommend/bfhdkud_time=1596004491 算出 32 位 小写 md5 837444501881f2af92b9cc0f0a9505fc

结论

hkey 的处理流程:

image.png

注:Hook 代码编写,参考:Python 反反爬虫 – Frida 破解某安卓社区 token 反爬虫

  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • 破解
    21 引用 • 41 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...