-
-
[旧帖] [原创]Android防逆向之伪装zip64 0.00雪花
-
发表于: 2016-6-20 23:31 2538
-
在论坛看在网友求助把一个小的app去广告,下载一看是清理内存的,刚开始让他禁掉联网权限就好了,不过想了想还是帮忙改一下吧。
不过软件扔到Android killer(jeb也不行)里边反编译的时候却报错了,显示如下:
反编译失败,无法继续下一步源码反编译!
根据报错信息看出应该是解压apk时出了问题,用好压试了试却可以正常打开。
尝试了用好压解压之后再重新打包,扔到Android kill里边却可以了。
但是这种防御方法原理是什么呢?
首先根据报错信息invalid CEN header 搜索了一下,发现这个错误和zip64有关,Java1.6版本的ZipFile不支持zip64格式。并且在wiki上查到

Android6.0系统才支持zip64格式,所以可以猜测这不是一个zip64格式的文件,而是一个普通的zip文件被软件作者伪装成了zip64格式,在安装时Android系统并不进行判断,但却让反编译程序发生了崩溃。
既然是伪装成了zip64格式,那么应该是修改了文件的一些标志位。
早期的zip格式最大只能为4GB,zip64格式突破了这个限制
it uses a "normal" central directory entry for a file, followed by an optional "zip64" directory entry, which has the larger fields
接着搜了一下zip压缩文件的数据结构
zip文件由以下这些部分组成:
[local file header]
[encryption header]
[file data] [data descriptor]
[archive decryption header]
[archive extra data record]
[central directory header]
[central directory header]
[zip64 end of central directory record]
[zip64 end of central directory locator]
[end of central directory record]
每一部分都有一些固定的比特位对这一段本身进行描述
比如Data descriptor
Offset Bytes Description
0 4 Optional data descriptor signature = 0x08074b50
4 4 CRC-32
8 4 Compressed size
12 4 Uncompressed size
开头4个字节大小的signature来作为起始标志
zip64有关的就是zip64 end of central directory record 和 zip64 end of central directory locator这两个部分他们的signature分别为0x06064b50和0x07064b50
接下来再样本文件中搜索着两个标志位

果然可以查到
再看一下自己用好压重新打包的文件

在文件末尾只搜所到了end of central directory record这一段的signature,并没有与zip64有关的signature。
所以将样本文件中 50 4B 06 06 -------50 4B 05 06(不包括50 4B 05 06)这一段删除后重新放入Android killer

可以看到反编译完成。
由此可以判断:
软件作者通过反编译软件不支持zip64格式而android系统在安装app时不对apk文件做这方面检测的特点,向apk文件添加了zip64的signature,来防止第三方发修改
当然最简单的方法就是用压缩软件(如好压)解压后重新打包。
对于数据结构不并不了解,所以说法上可能不太恰当,欢迎纠正
相关资料
f3aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3K9%4N6S2M7X3g2Q4x3X3g2U0j5h3y4Z5k6h3k6D9P5g2)9J5k6h3&6W2N6q4)9J5c8Y4N6W2j5X3c8G2j5%4y4Q4x3V1k6U0j5i4y4W2M7%4c8#2k6r3W2W2M7#2)9J5c8V1q4b7f1p5&6a6g2p5g2Q4x3X3g2f1h3q4b7`.
66dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6K9K9i4m8Q4y4h3k6Q4x3U0f1J5z5r3k6A6L8r3g2Q4y4h3k6X3L8%4u0E0j5i4c8Q4x3U0f1J5z5g2)9J5x3$3y4A6N6r3g2Q4y4h3k6F1L8%4c8W2i4K6u0V1x3U0V1`.
不过软件扔到Android killer(jeb也不行)里边反编译的时候却报错了,显示如下:
I: 使用 ShakaApktool 2.0.0-20150914> Exception in thread "main" b.a.D: b.d.f: java.util.zip.ZipException: invalid CEN header (bad signature)> at b.a.E.g(Unknown Source)> at b.a.E.a(Unknown Source)> at b.b.a.a(Unknown Source)> at b.b.a.a(Unknown Source)> at com.rover12421.shaka.cli.Main.main(Unknown Source)>Caused by: b.d.f: java.util.zip.ZipException: invalid CEN header (bad signature)> at b.d.j.<init>(Unknown Source)> at b.d.j.<init>(Unknown Source)> at b.a.d.c.a.a(Unknown Source)> .. 5 more> Caused by: java.util.zip.ZipException: invalid CEN header (bad signature)> at java.util.zip.ZipFile.open(Native Method)> at java.util.zip.ZipFile.<init>(ZipFile.java:220)> at java.util.zip.ZipFile.<init>(ZipFile.java:150)> at java.util.zip.ZipFile.<init>(ZipFile.java:164)> ... 8 moreAPK
反编译失败,无法继续下一步源码反编译!
根据报错信息看出应该是解压apk时出了问题,用好压试了试却可以正常打开。
尝试了用好压解压之后再重新打包,扔到Android kill里边却可以了。
但是这种防御方法原理是什么呢?
首先根据报错信息invalid CEN header 搜索了一下,发现这个错误和zip64有关,Java1.6版本的ZipFile不支持zip64格式。并且在wiki上查到

Android6.0系统才支持zip64格式,所以可以猜测这不是一个zip64格式的文件,而是一个普通的zip文件被软件作者伪装成了zip64格式,在安装时Android系统并不进行判断,但却让反编译程序发生了崩溃。
既然是伪装成了zip64格式,那么应该是修改了文件的一些标志位。
早期的zip格式最大只能为4GB,zip64格式突破了这个限制
it uses a "normal" central directory entry for a file, followed by an optional "zip64" directory entry, which has the larger fields
接着搜了一下zip压缩文件的数据结构
zip文件由以下这些部分组成:
[local file header]
[encryption header]
[file data] [data descriptor]
[archive decryption header]
[archive extra data record]
[central directory header]
[central directory header]
[zip64 end of central directory record]
[zip64 end of central directory locator]
[end of central directory record]
每一部分都有一些固定的比特位对这一段本身进行描述
比如Data descriptor
Offset Bytes Description
0 4 Optional data descriptor signature = 0x08074b50
4 4 CRC-32
8 4 Compressed size
12 4 Uncompressed size
开头4个字节大小的signature来作为起始标志
zip64有关的就是zip64 end of central directory record 和 zip64 end of central directory locator这两个部分他们的signature分别为0x06064b50和0x07064b50
接下来再样本文件中搜索着两个标志位

果然可以查到
再看一下自己用好压重新打包的文件

在文件末尾只搜所到了end of central directory record这一段的signature,并没有与zip64有关的signature。
所以将样本文件中 50 4B 06 06 -------50 4B 05 06(不包括50 4B 05 06)这一段删除后重新放入Android killer

可以看到反编译完成。
由此可以判断:
软件作者通过反编译软件不支持zip64格式而android系统在安装app时不对apk文件做这方面检测的特点,向apk文件添加了zip64的signature,来防止第三方发修改
当然最简单的方法就是用压缩软件(如好压)解压后重新打包。
对于数据结构不并不了解,所以说法上可能不太恰当,欢迎纠正
相关资料
f3aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3K9%4N6S2M7X3g2Q4x3X3g2U0j5h3y4Z5k6h3k6D9P5g2)9J5k6h3&6W2N6q4)9J5c8Y4N6W2j5X3c8G2j5%4y4Q4x3V1k6U0j5i4y4W2M7%4c8#2k6r3W2W2M7#2)9J5c8V1q4b7f1p5&6a6g2p5g2Q4x3X3g2f1h3q4b7`.
66dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6K9K9i4m8Q4y4h3k6Q4x3U0f1J5z5r3k6A6L8r3g2Q4y4h3k6X3L8%4u0E0j5i4c8Q4x3U0f1J5z5g2)9J5x3$3y4A6N6r3g2Q4y4h3k6F1L8%4c8W2i4K6u0V1x3U0V1`.
赞赏
赞赏
雪币:
留言: