这次有点sao了,破解安卓某 APP 低层加密

今天给大家分享一下如何逆向分析 Native 层的加密 , 整个过程的思路值得借鉴 , 接下来由小帅b的朋友 Houser 给大家进行演示 , 搞起:
 
所需设备和环境
 
设备:
Android/ target=_blank class=infotextkey>安卓手机(获取root权限)
 
抓包:
fiddler + xposed + JustTrustMe
 
反编译:
jadx-gui , ida
 
抓包
 
按照惯例 , 这里隐去 App 的名称 , 开启 fiddler 抓包后 app 提示连接不到网络 , 判断是证书验证 , 开启 xposed 框架 , 再次请求 , 成功抓到包 , 连续请求两次来对比参数变化:

这次有点sao了,破解安卓某 APP 低层加密

文章插图
 

这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
可以看到 x-app-token 这个参数不一样 , 其他参数都是固定的 , 先简单看一下 x-app-token 的构成:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
这样做了一下换行 , 有没有发现什么规律?
 
我一眼就看出来第二行是手机的 deviceID , 因为爬虫写多了 , 这个字符串经常出现 , 第一行是 32 位 , 应该就是个 md5 ,  第三行是个 16 进制数 , 知道了这些 , 接下来就来反编译 , 搜索这个关键字 。
 
反编译
 
反编译之前先使用 ApkScan-PKID 查一下是否有壳 , 养成好习惯 , 这个 app 没有加壳 , 直接用 jadx 打开 , 全局搜索 “x-app-token” , 只有一处 , 应该就在这里了:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 

这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
从框中代码发现 x-app-token 的值就是 as , 而 as 是函数 getAS 生成的 , 按住鼠标左键 , 点击 getAS 进去看看详情:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
它把函数过程写到 native 层中去了 , 那只好去分析这个名为native-lib 的 so 文件了 , 解压目标 apk 获取到了如下图这些文件:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
so文件就在这个lib文件夹里:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
ida中打开这个文件 , 切换到 Export 导出函数选项卡 , 先来直接搜索getAS:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
没有搜到getAS , 倒是搜到了 getAuthString , 名字很像 , 打开看看吧 , 按 F5 可以把汇编代码转换为伪 c 代码 , 下拉分析一波 , 看到了 md5 关键字:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
【这次有点sao了,破解安卓某 APP 低层加密】代码有点难懂 , 连懵带猜 v61 应该是 MD5 加密后的结果 , 然后 append 似乎是在拼接字符串 , 看到了“0x” , 根据抓包的结果已经知道 x_app_token 的第三行是个 16 进制数 , 那应该是这里的v86了 , 向上看看它具体是什么:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
v86存的是 v40 的值 , 而 v40 就是当前的时间戳 , 那 x-app-token 第三行应该就是时间戳的 16 进制数 。接下来看看 md5 的入参为v58,v52,v53 , 重点来看v52 , 往上追朔看到其和 v51 是相等的 , 而 v51 是一个未知字符串经过 base64 编码得到的 , 先来hook这两个函数 , 写段脚本:
这次有点sao了,破解安卓某 APP 低层加密

文章插图
 
第1处和2处分别是目标函数的地址 , 鼠标点到目标函数处 , ida左下角会显示 , 加1是为何 , 只记得大学时候学过汇编语言讲到段地址 , 偏移地址 , 物理地址这些 , 猜测和这些知识有关 , 还需研究 , 这里先这样用 , 第3处的写法是当这个参数为字符串时的写法 , 运行一波 , 看看打印输出:


推荐阅读