在对某app抓包的过程中发现请求报文里有密文字段,想知道下密文传输了什么信息:
如上图所示,请求报文里协议的key为plaintext,但是value值却被加密,逆向分析一下。
首先,用apk改之理打开apk搜索key值:
很容易搜索到了,接着查看其java代码:
同时发现apk做了混淆保护。
如上图,最终str3也就是plaintext作为key,advara作为value放到了hashmap里面。因此加密前的adVar就是我们想要的数据。搜索encryptRequest()函数:
转换为java源码:
跟进NativeUtils:
发现encryptString方法为native层方法。那么分析libdfjk.so:
首先先进行静态分析:so文件库函数列表里面搜索不到java_com/java_*之类的函数猜测是动态注册。
搜索下jni发现:
能找到jni_onLoad函数,f5伪代码看一下:
自定义的实现方法应该是off_14008这个函数,跟进:
发现自定义的方法名好像和java层一样没有变,应该是开发人员的疏忽。
既然找到了so文件中加密方法的位置,那么进行动态调试。
moudle list里面找到encryptString方法:
f5看下伪代码:
这就是其加密后返回的字符串。根据伪代码推断,v3寄存器的值用为加密前的源数据。
直接在encryptString处下断点,f8一路跟进:
获取了设备的imei值,并且在打开app时没有提示我要获取权限。
再试一下hook java层的方法:
1)Frida
hook一下encryptString方法:(动态插桩log应该也能解决,不过hook不用再修改smali重新打包)
启动frida:
触发逻辑(刷新下首页):
2)Xposed
与Frida一样,hook相应的方法:
安装插件后,运行app查看log日志,可以显示明文: