apk文件伪装zip64格式案例
软件样本:http://files.cnblogs.com/files/mmmmar/FMRMemoryCleaner.apk
在论坛看在网友求助把一个小的app去广告,下载一看是清理内存的,刚开始让他禁掉联网权限就好了,不过想了想还是帮忙改一下吧。
不过软件扔到Android killer(jeb也不行)里边反编译的时候却报错了,显示如下:
I: 使用 ShakaApktool - >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) > ... 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:) > at java.util.zip.ZipFile.<init>(ZipFile.java:) > at java.util.zip.ZipFile.<init>(ZipFile.java:) > ... more APK 反编译失败,无法继续下一步源码反编译!
根据报错信息看出应该是解压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这一段删除后重新放入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
apk文件伪装zip64格式案例的更多相关文章
- android初级篇之apk签名key keystore格式转pk8+x509.pem
转自:http://www.jianshu.com/p/3bd5c68cc44d 常用的android的签名工具有两个即jarsigner 和apksigner.这两种使用的key格式不一样,keys ...
- 关于ipa和apk文件的解压
移动互联网中,主要的两个平台是Android和ios,android上文件的安装包是后缀名为apk的文件,ios上文件的安装包是后缀名为ipa的文件,在本文分析一下这两种文件的特点,以及如何用程序去解 ...
- android APK 文件的生成过程
步骤: 1. 用 aapt工具生成R文件aapt package -m -J gen目录 -M AndroidManifest.xml -S res目录 -I 编译版本sdk的android ...
- [转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度 ...
- Java环境解析apk文件信息
概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...
- APK文件安装模拟器和ADB命令的使用
1.安装APK文件到模拟器 Android手机使用的执行文件为APK格式,类似于Windows平台的exe文件.在Android模拟器中安装APK文件有多种方法,如果你是开发人员,可以通过Eclips ...
- 【转】adb uninstall卸载apk文件说明
昨天在使用adb卸载程序,结果死活卸载不了.我输入的命令和系统提示如下: [plain] view plaincopy arthur@arthur-laptop:~$ adb uninstall ...
- [转]Android应用安装包apk文件的反编译与重编译、重签名
背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission androi ...
- 基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息
技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...
随机推荐
- UIGestureRecognizer手势识别
UIGestureRecognizer 1.#import "ViewController.h"2.3.@interface ViewController ()<UIGest ...
- 【OpenSSL】创建证书
[-] 1生成根证书 1 生成RSA私钥 2 生成证书请求 3 签发自签名证书 2 生成用户证书 1 生成RSA私钥 2 生成证书请求 3 签发证书 1)生成根证书 1.1) 生成RSA私钥 op ...
- Sql Server使用技巧
1.修改表的字段时,提示不能更改: 工具>选项>设计器>取消 阻止保存要求重新创建表的更改 2.更改选择多少行,编辑多少行: 工具>选项>Sql Server对象资源管理 ...
- java对mysql数据库进行单表筛选备份、还原操作
最近在做的一个项目需要对mysql数据库中的单个表格进行备份 其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份) 思路:java调用系统命令完成备份操作 假设现在有数据库tes ...
- javascript定义变量和优先级的问题
本文链接: javascript定义变量和优先级的问题.转载请保留. 看下面的代码: if (!("aa" in window)) { alert('oh my god'); ...
- underscorejs-map学习
2.2 map 2.2.1 语法: _.map(list, iteratee, [context]) 2.2.2 说明: 对集合的每个成员依次进行某种操作,将返回的值依次存入一个新的数组.接收3个参数 ...
- readn、write、readline
字节流套接字上的read和write函数所表现的行为不同于通常的文件IO 字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少,然而这不是出错的状态 这个现象的原因在于内核中用于 ...
- SQL数据库增删改查
数据类型 运行cmd 输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据库服务 输入net pause MSSQLserve ...
- JDBC与javaBean
1.JDBC的概念: Java数据库连接技术(Java DataBase Connectivity)能实现java程序对各种数据库的访问, 由一组使用java语言编写的类 和 接口(jdbc api) ...
- 转:你需要知道的NoSQL数据库10件事
你需要知道的NoSQL数据库10件事 NoSQL的5个优势 1.弹性扩展 多年来,数据库管理员一直依赖于向上扩展(scale up)-随着数据库负载的增加购买更大的数据库服务器―而不是向外扩展-随着负 ...