apk文件伪装zip64格式案例

软件样本:http://files.cnblogs.com/files/mmmmar/FMRMemoryCleaner.apk

在论坛看在网友求助把一个小的app去广告,下载一看是清理内存的,刚开始让他禁掉联网权限就好了,不过想了想还是帮忙改一下吧。

不过软件扔到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 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

时间: 2024-10-11 04:28:42

apk文件伪装zip64格式案例的相关文章

【转】 Apk文件及其编译过程

Apk文件概述 Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包. 注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开.Apk包中的内容 解压缩一个apk文件后,目录结构一般如下: *.apk ├-res │ ├+layout │ └+drawable ├-META-INF │ ├-MANIFEST.MF │ ├-CERT.SF │ └-CERT.RSA ├-resources.arsc ├-cla

apk文件的反编译方法:

工作中有时我们需要进行apk文件的反编译工作,阅读优秀的代码和模式来帮助我们更好的完成我们的任务. 本篇介绍apk文件的反编译工作,两种反编译方式: 使用到的工具:apk逆向助手,aoktoolkit: 步骤: 1,新建桌面文件夹(不可包含中文,切记): 把我们用到的工具和apk文件拷贝进去: 2,打开我们的工具1和工具二,并将apk文件拖拽近框中,如图: 3,点击逆向助手中操作,或者apktoolkit中的反编译进行反编译apk,会在我们的文件夹下生成apk反编译后的文件夹,如图文件夹内容:

Java环境解析apk文件信息

概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文件的工具,借用终端shell调用命令解析输出信息; 代码: 这里贴出一些关键代码,并给出代码注释,如下 1 package com.apkutils; 2 3 import java.io.BufferedReader; 4 import java.io.Closeable; 5 import ja

[转]Android应用安装包apk文件的反编译与重编译、重签名

背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />权限.在只有被测试APP的apk文件的情况下,修改apk文件后缀名为zip,解压缩后,修改AndroidManifest.xml文件,删除META-INF文件夹,重压缩为apk文

【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用

你看到的这个文章来自于http://www.cnblogs.com/ayanmw 一个android apk的编译过程 请参考: http://www.2cto.com/kf/201312/261475.html 典型的编译过程: aapt( Android Asset Packaging Tool): 把你的应用程序资源文件(例如: AndroidManifest.xml file and the XML files for your Activities),编译成R.java .它可以让你从

apk去广告工具(利用apktool去除apk文件里的广告)

基本知识 apk安装包的文件结构 以知名桌面软件“LauncherPro”为例,apk安装包文件目录: 文件目录如下: - META-INF - res - anim - color - drawable - drawable-hdpi - drawable-land - drawable-land-hdpi - drawable-mdpi - drawable-port - drawable-port-hdpi - layout - layout-land - layout-port - xm

浅析:android的apk文件上线前加密和签名经验分享

第一步加密: 1.加密的意义 如果不对其软件进行加密很容易被人家反编译导致源代码的泄漏,查出服务器的地址而间接的收到攻击,等一系列问题. 2.加密的方法 可以使用爱加密网址:  http://www.ijiami.cn/     对apk进行加密,这是第三方提供的安全可靠!,详情可以参考:http://jingyan.baidu.com/album/925f8cb8151347c0dde0563d.html 第二部签名 第二部签名: 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开

反编译APK文件的三种方法(转)

因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个... ps:对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压

[转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)

在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度,算了,自己动手查阅了资料之后,具体实现如下: 在工程的根目录 创建2个文件,分别: 1.build.xml 2.build.properties build.xml的内容: [java] view plaincopyprint? <?xml version="1.0" encodi