软件样本: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格式案例的更多相关文章

  1. android初级篇之apk签名key keystore格式转pk8+x509.pem

    转自:http://www.jianshu.com/p/3bd5c68cc44d 常用的android的签名工具有两个即jarsigner 和apksigner.这两种使用的key格式不一样,keys ...

  2. 关于ipa和apk文件的解压

    移动互联网中,主要的两个平台是Android和ios,android上文件的安装包是后缀名为apk的文件,ios上文件的安装包是后缀名为ipa的文件,在本文分析一下这两种文件的特点,以及如何用程序去解 ...

  3. android APK 文件的生成过程

    步骤: 1. 用 aapt工具生成R文件aapt  package  -m -J  gen目录 -M AndroidManifest.xml  -S res目录  -I 编译版本sdk的android ...

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

    在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度 ...

  5. Java环境解析apk文件信息

    概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...

  6. APK文件安装模拟器和ADB命令的使用

    1.安装APK文件到模拟器 Android手机使用的执行文件为APK格式,类似于Windows平台的exe文件.在Android模拟器中安装APK文件有多种方法,如果你是开发人员,可以通过Eclips ...

  7. 【转】adb uninstall卸载apk文件说明

    昨天在使用adb卸载程序,结果死活卸载不了.我输入的命令和系统提示如下: [plain] view plaincopy   arthur@arthur-laptop:~$ adb uninstall  ...

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

    背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission androi ...

  9. 基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

    技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...

随机推荐

  1. 知识点总结之HTML篇

    1.标签语义化: ①.在不依赖样式的情况下,页面能够呈现清晰的结构. ②.如果使用者有视觉障碍,屏幕阅读器会完全根据你的标记来选择读取你的网页. ③.有利于搜索引擎依赖于标记来确定上下文和各个关键字的 ...

  2. Shell 脚本编程笔记(一) Hello Shell

    最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...

  3. [FindBugs分析记录]Potentially dangerous use of non-short-circuit logic

    官网解释: This code seems to be using non-short-circuit logic (e.g., & or |) rather than short-circu ...

  4. Spring+SpringMVC+Mybatis+MAVEN+Eclipse+项目完整环境搭建

    1.新建一个Maven项目,创建父项目. 2.创建子项目模块 3.创建javaWeb项目 4.创建后的项目目录结构 5.Maven文件配置 parent父项目pom.xml文件配置 <?xml ...

  5. 【新手--android日记】实现IOS风格电话界面

    [前言--新手日记] 开始学习android开发,通过做一个通讯录练习,打算实现各种自己想实现的功能. 新手作品,技术含量很浅.主要是记录自己的学习过程. 纯学习之用,求评论,求建议,求教导. [正题 ...

  6. ubuntu 的远程桌面

    好久没有弄ubuntu 丢人的啊,先安装了个服务器版,发现好多命令都忘记了,命令行下根本搞不懂 又安装了个桌面版...但是服务器远程么,putty还是搞的头大,又乱码,有各种文件传输. 还好记得以前用 ...

  7. 3527: [Zjoi2014]力

    题目大意:给出n个数qi,定义 Fj为        令 Ei=Fi/qi,求Ei. 设A[i]=q[i],B[i]=1/(i^2). 设C[i]=sigma(A[j]*B[i-j]),D[i]=si ...

  8. 构建高可用web站点学习(二)

    web站点的缓存学习 缓存在web应用里面十分常见,也有各种各样的缓存,从请求开始一直到代码处理的阶段都可以采取缓存.下面就逐一介绍: 一.客户端缓存(浏览器和http方面) 前端页面缓存主要遵循ht ...

  9. 转:windows xp下如何安装SQL server2000企业版

    SQL2000企业版本 适用于WIN 2000 Server系统和Windows 2003系统,Windows XP一般装不了需要选用个人版或开发板.但是企业版也可以安装在xp系统下.这里介绍一个XP ...

  10. poj Cash Machine

    http://poj.org/problem?id=1276 #include<cstdio> #include<cstring> #include<cmath> ...