尝试了一下对 GiWiFi
的 Android
客户端网络请求的抓包和其中加密算法的逆向分析
准备阶段
本次逆向过程我并没有借助
PC
端处理, 直接就轻松的完成了…出乎意外
测试环境
- 设备:
Redmi K20 Pro
- 安卓版本:
11
- 特性: 已安装
magisk
- GiWiFi 版本:
2.4.1.4
使用工具
分析开始
抓包尝试
此步骤使用 httpcanary
进行抓包, 因为 GiWiFi
并没有用 SSL Pinning
等方式来阻止抓包
所以该过程异常轻松
最终我们能得到如下图的加密内容
可以轻松通过等号这种特征发现请求包中每一个属性都用了 base64
进行处理
初步怀疑是其他常用加密算法加密后再进行处理
最后经过多次抓包发现内容并没有改变, 可以推断并不是加上了动态内容(如timestamp
)再进行加密, 这使得我们的工作量会小很多
反编译尝试
使用 MT管理器
进行直接反编译发现我们什么有价值内容都得不到…你可以发现 百度SDK
相关的内容, 因为他加壳了
暴力脱壳
直接脱壳肯定是不现实的事情, 于是我们使用 Frida-dexdump
进行脱壳
因为我手机系统已经自带 magisk
这里使用 MagiskFrida
模块即可开机自动加载 Frida-server
服务并且自动开启相关 tcp
转发
所以我这步骤比较方便, 其他环境请自行研究
接下来在 termux
上安装相关工具, 用于控制 Frida-server
1 | $ pip install frida |
安装完成之后, 输入
1 | $ frida-ps |
查看 frida
服务是否正常连接
没问题后请保持 GiWiFi
在最前台运行 (这里我使用将 termux
窗口运行的方式), 再输入
1 | $ frida-dexdump |
即可获得相关 dex
包
反编译继续
使用 MT管理器
对抓取的多个 dex
包进行全选反编译, 即可进行正常分析
算法分析
在打开dex
包后进行简单搜索, 先随便搜索一个关键的属性名 staModel
可以看到一个可疑的 smali
文件
打开瞧一瞧
很快锁定一个函数 getEncrypt
, 定位到它所在的位置看看
可以看到一串像是密钥的东西 5447c08b53e8dac4
继续定位到所指向的 com/gbcom/gwifi/codec/d
看看
好家伙…算法一目了然, 也可以点一下右上角的 转java
选项使用 jadx
引擎转换为 java
更具可读性
再通过刚刚获得的密钥位数可以得出, 这是使用 aes128-ecb
加密且使用 PKCS5Padding
方式进行填充再最后转换为 base64
的加密逻辑
提示:
ecb
算法不需要iv
(初始化向量)
结果验证
随便打开个在线加解密的网站验证一下自己的想法吧
结果一致
好了…本次解密分析可以结束了