某语音APP的简单分析
脱壳
- 该APP使用某数字加固, 可直接使用r0ysue的frida dump脚本或者xposed 反射大师模块进行脱壳
抓包截图
几乎所有请求协议头都带有"pkg"以及"imei", 我们随便取一条数据测试.
算法过程
jdax载入dex文件后, 直接搜索"pkg"定位到以下加密位置
我们先看下,imei的处理过程
aO.aO(com.taobao.accs.common.Constants.KEY_IMEI, str)
其中aO.aO()这个方法是添加数据到协议头, 而imei的值对应的是str,也就是Constants.IMEI, 直接在变量名上右键"查找用例"
很直观就能确定到给imei赋值的地方, 再看加密方法名, 直接告诉了我们加密算法, 对手机imei进行md5而已
import hashlib
imei = '35xxxxxxxx59503'
imei_md5 = hashlib.md5(imei.encode('utf-8')).hexdigest()
print(imei_md5)
# print('4761ec8e17c0f52bd25b7cba9343f972')
接着往下看"pkg"的加密过程
String headerPackage = SecurityLib.instance.getHeaderPackage(App.Ql());
if (headerPackage == null) {
headerPackage = "";
}
ab.a aO = Uj.Vw().aO("pkg", headerPackage.replaceAll(UMCustomLogInfoBuilder.LINE_SEP, "").replaceAll(" ", ""));
调用的是SecurityLib类下的getHeaderPackage方法进行处理 ,App.Ql()返回的是一个app对象
我们继续往下跟
这里可以看出, 最终加密逻辑是在native层方法 libnative-lib.so下的getPackage
是时候祭出我们的神器IDA了, 打开它并载入libnative-lib.so
这里别看代码这么长, 总结起来也就是一些字符串的赋值拼接而已
还有就是变量参数太多, 为了方便阅读, 可根据个人习惯修改命名
注:F5转C代码后,有些地方很难读懂, 就比如getAES传入的参数,我们切到汇编就很容易了
接着查看getAES
查看aes密钥 "TiMi#Chat@2020"
试着解密最后数据
OK~
我们再验证之前的sha1也就是"s"的值是否正确...完美
这个APP处理虽然简单,但没有借助frida objection之类的, 纯静态分析出来还是很满足的,哈哈哈