皮皮搞笑sign算法分析

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

皮皮搞笑sign算法分析_第5张图片
进入sub_10EEA处皮皮搞笑sign算法分析_第6张图片

sign为sub_11758函数返回,追下去

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

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

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

最近整理了下代码, 发现之前翻译的皮皮搞笑和最右有的md5特征。把生成的字符串用来md5一下, 发现还真是。 自己对着arm汇编翻译了差不多600行代码,最后发现是md5, 头疼。。。


 

你可能感兴趣的:(android逆向)