90_ 发表于 2016-2-18 15:02:44

360加固静态脱壳

本文章转自看雪@UndeadFu

执行脚本360,可以直接获得classes_final.dex,即还原的dex文件。
代码内部逻辑为:
key_short->key_long->class_begin->class_media->class_almost->class_final
其中每个过程的功能如下:
1.从当前classes.dex文件中,根据数据固有的特征,获得加密后的classes.dex文件保存在当前文件中的长度和文件中保存的key的长度,根据前面获得的key的长度获得一串字符。对数据进行简单的处理,可以得到一个长度为0x10的有效数据作为原始的key。
2.新建一个长度为0x100的字符数组,用0-0xFF按顺序填充。然后利用key,按照一定算法将该数组打乱,作为解密数据直接使用的key值。
3.从当前classes.dex文件中,根据数据特征,获得经过加密的原classes.dex数据。
4.将第3步获得的数据与第2步获得的key相互作用,得到初始解密的classes.dex数据。
5.第4步获得的初始解密的classes.dex数据是被压缩过的。将数据进行解压操作,会获得一段接近原classes.dex的数据。
6.将第5步获得的数据的前0x70个字节与一个特殊的数据进行异或操作,将得到被还原的classes.dex文件。

详细过程:
1.从当前classes.dex文件中寻找key。
在文件中寻找一段”9RRTRRRB ……的字符串。该字符串前面8个字节处记录了原classes.dex保存在当前文件中的信息长度,前4个字节处记录了保存在文件中的key_1的长度。从这段字符串的起始位置开始,根据刚获得的key_1的长度读取key_1。
对获得的字符串进行处理。将获得的key_1作为一个字符数组,每个值与自身下标进行异或处理后重新赋值。从第二个元素开始,每个元素与前一个元素进行异或处理后重新赋值。得到一个全新的数组。
取该数组的后16位,按照其下标除16的余数排序后存入一个长度为0x10的数组中。得到全新的key_2。



2.根据获得的key_2将一个有0-0xFF按顺序组成的数组buf_1打乱,组成新的key_3。
打乱方法:key_2复制9份,组成长度为0x100的buf_2;
          取一个临时变量tem = 0;
          做循环(i从0递增到0xFF):         
               tem = (tem + buf_2 + buf_1)& 0xFF;
               交换buf_1和buf_1的数值;
3.同样寻找第一步中的特征字符串,在key_1后8个字节即原classes.dex文件加密后的数据code_1。读取长度在这段数据前4个字节处。可以得到完整的加密文件。
4.将key_3与code_1按顺序进行异或操作。在key_3结束后再从头开始,一直循环到整个code_1结束。获得code_2。(对应文件classes)
5.获得的code_2是一段被压缩过的数据。进行解密操作,可以得到接近原classes.dex文件的数据,只有前0x70个字节与原文件不同。


6.将最后获得的数据的前0x70个字节与一个数字进行异或即可。该数据可以由第一个字节与’d’异或得到。

代码请到看雪自行下载:**** Hidden Message *****

青青子衿、 发表于 2016-2-18 21:23:50

本帖最后由 青青子衿、 于 2016-3-26 21:39 编辑

666,前排支持

风之舞者 发表于 2016-2-18 23:47:47

看看什么代码?是安卓的吧?

Lucifer 发表于 2016-2-19 01:49:39

支持中国红客联盟(ihonker.org)

wilist 发表于 2016-2-19 07:34:33

支持中国红客联盟(ihonker.org)

s1986q 发表于 2016-2-19 11:04:56

谢谢楼主的分享。

wilist 发表于 2016-2-19 13:21:43

菜鸟小羽 发表于 2016-2-20 01:56:10

小龙 发表于 2016-2-20 05:33:21

支持,看起来不错呢!

ljy07 发表于 2016-2-20 10:17:19

页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 360加固静态脱壳