吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11521|回复: 31
收起左侧

[Android 原创] apk文件伪装zip64格式案例

  [复制链接]
mmmmar 发表于 2016-5-30 19:25
本帖最后由 mmmmar 于 2016-5-30 20:17 编辑

软件样本见附件

在论坛看在网友求助把一个小的app去广告,下载一看是清理内存的,刚开始让他禁掉联网权限就好了,不过想了想还是帮忙改一下吧。
不过软件扔到Android killer(jeb也不行)里边反编译的时候却报错了,显示如下:
[Asm] 纯文本查看 复制代码
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
OffsetBytesDescription
04Optional data descriptor signature = 0x08074b50
44CRC-32
84Compressed size
124Uncompressed size

开头4个字节大小的signature来作为起始标志
zip64有关的就是zip64 end of central directory record zip64 end of central directory locator这两个部分他们的signature分别为0x06064b500x07064b50
接下来再样本文件中搜索着两个标志位

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

在文件末尾只搜所到了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,来防止第三方发修改
当然最简单的方法就是用压缩软件(如好压)解压后重新打包。
对于数据结构不并不了解,所以说法上可能不太恰当,欢迎纠正
相关资料
https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
https://en.wikipedia.org/wiki/Zip_%28file_format%29#cite_note-29

FMRMemoryCleaner.zip

120.67 KB, 下载次数: 59, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 9威望 +1 热心值 +8 收起 理由
miracles + 1 用心讨论,共获提升!
supperlitt + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
iamyrc + 1 用心讨论,共获提升!
州哥在江湖 + 1 用心讨论,共获提升!
Hmily + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
23king + 1 谢谢@Thanks!
Ericky + 1 我很赞同!
VII’s + 1 感觉好高深的样子
铅笔刀 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

多彩 发表于 2016-6-10 23:47 来自手机
以前看帖基本不回帖,后来我发现,这样不但会花掉我的金币,而且不厚道。于是我把这段文字保存在记事本里,每看一个帖子,就复制上去,以表达我对楼主的谢意,把帖子顶起来,顺便帮自己挣点金币
 楼主| mmmmar 发表于 2016-6-13 12:33
州哥在江湖 发表于 2016-6-13 08:06
不太懂这些,如何插进去?可否给个思路?谢谢!

用16进制工具,比如WinHex,按ins键进去插入模式,然后把我帖子里删除的那一段插入到最后那个signature前边
946885280 发表于 2016-5-30 20:00
VII’s 发表于 2016-5-30 20:09
感觉好高深的样子
矢泽爱 发表于 2016-5-30 20:25
感觉好像很厉害的样子
小猫咪Panda 发表于 2016-5-30 20:29
写的还是比较容易理解的,支持一下
qtfreet00 发表于 2016-5-30 21:20
最简单的方法,解压缩,再压缩成zip,改后缀为apk
lucifer2046 发表于 2016-5-31 00:17 来自手机
赞。。。通俗易懂。。。压压压
AntiDebug 发表于 2016-6-2 17:00
感谢分享
yege0201 发表于 2016-6-3 13:26
时不时的发现一些好玩的对抗反编译的方法,挺有意思的,感谢LZ~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 02:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表