今天给大家分享一下如何逆向分析 Native 层的加密 , 整个过程的思路值得借鉴 , 接下来由小帅b的朋友 Houser 给大家进行演示 , 搞起:
所需设备和环境
设备:
Android/ target=_blank class=infotextkey>安卓手机(获取root权限)
抓包:
fiddler + xposed + JustTrustMe
反编译:
jadx-gui , ida
抓包
按照惯例 , 这里隐去 App 的名称 , 开启 fiddler 抓包后 app 提示连接不到网络 , 判断是证书验证 , 开启 xposed 框架 , 再次请求 , 成功抓到包 , 连续请求两次来对比参数变化:
文章插图
文章插图
可以看到 x-app-token 这个参数不一样 , 其他参数都是固定的 , 先简单看一下 x-app-token 的构成:
文章插图
这样做了一下换行 , 有没有发现什么规律?
我一眼就看出来第二行是手机的 deviceID , 因为爬虫写多了 , 这个字符串经常出现 , 第一行是 32 位 , 应该就是个 md5 , 第三行是个 16 进制数 , 知道了这些 , 接下来就来反编译 , 搜索这个关键字 。
反编译
反编译之前先使用 ApkScan-PKID 查一下是否有壳 , 养成好习惯 , 这个 app 没有加壳 , 直接用 jadx 打开 , 全局搜索 “x-app-token” , 只有一处 , 应该就在这里了:
文章插图
文章插图
从框中代码发现 x-app-token 的值就是 as , 而 as 是函数 getAS 生成的 , 按住鼠标左键 , 点击 getAS 进去看看详情:
文章插图
它把函数过程写到 native 层中去了 , 那只好去分析这个名为native-lib 的 so 文件了 , 解压目标 apk 获取到了如下图这些文件:
文章插图
so文件就在这个lib文件夹里:
文章插图
ida中打开这个文件 , 切换到 Export 导出函数选项卡 , 先来直接搜索getAS:
文章插图
没有搜到getAS , 倒是搜到了 getAuthString , 名字很像 , 打开看看吧 , 按 F5 可以把汇编代码转换为伪 c 代码 , 下拉分析一波 , 看到了 md5 关键字:
文章插图
【这次有点sao了,破解安卓某 APP 低层加密】代码有点难懂 , 连懵带猜 v61 应该是 MD5 加密后的结果 , 然后 append 似乎是在拼接字符串 , 看到了“0x” , 根据抓包的结果已经知道 x_app_token 的第三行是个 16 进制数 , 那应该是这里的v86了 , 向上看看它具体是什么:
文章插图
v86存的是 v40 的值 , 而 v40 就是当前的时间戳 , 那 x-app-token 第三行应该就是时间戳的 16 进制数 。接下来看看 md5 的入参为v58,v52,v53 , 重点来看v52 , 往上追朔看到其和 v51 是相等的 , 而 v51 是一个未知字符串经过 base64 编码得到的 , 先来hook这两个函数 , 写段脚本:
文章插图
第1处和2处分别是目标函数的地址 , 鼠标点到目标函数处 , ida左下角会显示 , 加1是为何 , 只记得大学时候学过汇编语言讲到段地址 , 偏移地址 , 物理地址这些 , 猜测和这些知识有关 , 还需研究 , 这里先这样用 , 第3处的写法是当这个参数为字符串时的写法 , 运行一波 , 看看打印输出:
推荐阅读
- |卖出一块和田玉,真的能够吃三年吗?这种说法有点夸张
- QQ终于也能“修改”账号了,但和你想的有点不一样
- 金毛出门从不空手而归,这次它又把谁家的猪带回来了 金毛狗笼子
- 金银花泡水有点苦是正常吗 金银花泡水放多少根最合适
- 男人撒尿有点疼
- 最强JDK15 安装与讲解,有点想升级,终于要废弃偏向锁了
- 骁字取名好不好 骁字的寓意
- 如何按照条件向Spring容器中注册bean?这次我懂了
- HashMap这次是真的懂了,扰动函数、负载因子、扩容拆分全搞定
- 喝完茶有点晕怎么回事,交个如茶的朋友