皮皮搞笑sign算法分析
#### 1、反编译apk,找到java层sign加密逻辑。
使用jadx、全局搜索sign= 可发现sign调用的方法为:
该方法是一个native方法, 使用ida进行分析libnet_crypto.so, 找到Jni_Onload查看RegisterNatives函数,
点击off_5A010查看注册函数基址
很遗憾,该so对字符串进行加密,来到init段发现如下函数 + "ZD" +
postParams.substring(0, 10);
```
其中postParams为加密的字符串。
sub_231E8 函数的cfg图如下
很明显,这是经过ollvm混淆的一个函数,这个混淆比较简单,分支较小。改sign算法流程如下:
1、把字符串分割成(字符串长度)/ 64块。
2、每块数据经过16次循环,与固定数值进行与、或等位运算,得到4个uint的数据。
3、把得到的数据与271733878, -1732584194,-271733879,1732584193相加。
4、把得到的4个uint的数据反序,得到一个32位的sign。
放一张算法验证图
程序计算的sign
结果正确,收工
写着写着,发现只有自己能看懂。。。。。。。 下一篇,有时间尝试对sub_231E8进行反混淆