皮皮搞笑sign算法分析

#### 1、反编译apk,找到java层sign加密逻辑。
使用jadx、全局搜索sign=  可发现sign调用的方法为:
皮皮搞笑sign算法分析
该方法是一个native方法, 使用ida进行分析libnet_crypto.so, 找到Jni_Onload查看RegisterNatives函数,皮皮搞笑sign算法分析
点击off_5A010查看注册函数基址
皮皮搞笑sign算法分析
很遗憾,该so对字符串进行加密,来到init段发现如下函数![1e725f5be98764a5368e3ffddef06396.png](en-皮皮搞笑sign算法分析
这是上海交大GoSSIP小组开源的“孤挺花“, 以前写过一个还原孤挺花加密的脚本,这里使用一下,可以看到字符串已经解密完成。

皮皮搞笑sign算法分析皮皮搞笑sign算法分析正在上传…重新上传取消
进入sub_10EEA处皮皮搞笑sign算法分析

sign为sub_11758函数返回,追下去

皮皮搞笑sign算法分析转存失败重新上传取消皮皮搞笑sign算法分析
皮皮搞笑sign算法分析
其中有一大堆函数,通过动态调试,发现最终的加密是 sub_231E8函数,前面的函数是对字符串进行一些简单处理,具体处理代码如下
```
String newStr = "Y0MTBlODcx" + postParams.substring(10) + "ZD" + 
postParams.substring(0, 10);
```
其中postParams为加密的字符串。
sub_231E8 函数的cfg图如下
皮皮搞笑sign算法分析
很明显,这是经过ollvm混淆的一个函数,这个混淆比较简单,分支较小。改sign算法流程如下:
1、把字符串分割成(字符串长度)/ 64块。
2、每块数据经过16次循环,与固定数值进行与、或等位运算,得到4个uint的数据。
3、把得到的数据与271733878, -1732584194,-271733879,1732584193相加。
4、把得到的4个uint的数据反序,得到一个32位的sign。

放一张算法验证图
皮皮搞笑sign算法分析
程序计算的sign
皮皮搞笑sign算法分析
结果正确,收工

写着写着,发现只有自己能看懂。。。。。。。 下一篇,有时间尝试对sub_231E8进行反混淆