前面一节我们说过,修改APK最终是通过修改smali来实现的,所以我们接下来介绍的工具就是如何把APK中的smali文件获取出来,当然同时也需要得到AndroidManifest.xml等文件。直接修改APK后缀为ZIP得到的xml文件是不能直接打开的,需要转换一下格式才能查看和修改。横观所有的工具中,最最最强大的当然还是ApkTool,所以下面后重点介绍!OK,开始正题。

一、查看xml文件

如果只是简单的需要查看xml中的内容(例如只是想看看AndroidManifest.xml中的配置信息、主启动Activity、permission权限或布局文件等等),那么可以使用AXMLPrinter2.jar这个工具。使用方法很简单,例如想查看AndroidManifest.xml文件内容,为了方便,把AndroidManifest.xml和AXMLPrinter2.jar放到同一个目录下,在cmd中定向到该目录并输入:

  1. java -jar AXMLPrinter2.jar AndroidManifest.xml > tmp.txt

则会在该目录下创建一个tmp.txt文档,内容就是解码后的AndroidManifest.xml的内容。

这个方法有个缺点就是只能查看,不能修改后再转换回原格式的xml文件,需要修改xml文件内容的,下面会有介绍。

二、查看java源代码

直接解压apk只得到Dalvik VM执行的classes.dex文件,要通过这个dex文件查看Java源代码的话,需要使用dex2jarjd-gui这两个工具。

我下载的是官方版本的dex2jar-0.0.9.9,解压后可以看到一大堆的bat和shell脚本。不过我们只需要用到其中的d2j-dex2jar或dex2jar.bat(Windows下)。具体操作步骤是:

1、把需要反编译的apk文件后缀改为zip,解压后取出其中的classes.dex文件,为了方便还是放到dex2jar-0.0.9.9目录下(和dex2jar.bat同一目录);

2、打开cmd,定位到该目录后输入:

  1. d2j-dex2jar.bat  classes.dex

几秒后程序就会在该目录下生成了一个classes-dex2jar.jar文件,这个jar文件就是原java代码编译后产生的文件;

3、打开jd-gui软件,点击左上角的“Open a file”按钮并找到2步骤生成的classes-dex2jar.jar文件,找到你想查看的java文件,还原度还是挺高的。如果有需要把java代码保存下来,点击File-Save Sources或者Save All Sources把当前java文件或全部java文件保存起来。

注意的是,这些java代码(基本上)不能直接重新编译,因为可能存在代码混淆,而且复杂一点的逻辑有时候还原不回来,显示出很奇怪的代码,所以这个软件还不是很完善,但是用来参考原java代码逻辑够用了。

三、获取和修改smali文件

获取smali文件是反编译的第一步,获取的方法有两种:

1、baksmali.jar和smali.jar

baksmali.jar用来把dex或odex文件解析为一个一个的smali文件,使用命令:

  1. java -jar baksmali.jar -x classes.dex

它会在目录下生成一个文件夹(默认是out),里面保存的就是这个dex中的smali文件,我们可以打开查看和修改,修改完毕后,使用smali.jar打包回dex文件:

  1. java -jar smali.jar out -o classes.dex

其中out就是刚才使用baksmali.jar创建的文件夹名字。

这样修改后,直接放回zip中然后把后缀改为apk是不能直接安装到机子上测试的,因为你修改了里面的文件,还需要使用签名工具进行重新签名(稍后介绍)。

2、ApkTool——目前最强大的反编译工具

以上所有工作,除了查看java源代码,其实有一个工具可以帮你轻松做到,那就是由一个外国开发者制作的ApkTool.jar工具。它可以反编译apk中的资源文件、解码xml文件、生成smali文件,还能把修改后的工程逆向生成apk文件。换言之,有了它可以抛弃AXMLPrinter2.jar、smali.jar和baksmali.jar了,使用也相当的方便。

(1)、反编译apk得到smali和资源文件

例如要反编译的apk为zheshiyige.apk,那么把该apk与ApkTool放到同一目录,cmd执行:

  1. java -jar apktool.jar d zheshiyige.apk APKFiles

等待一段时间后(视乎apk文件大小),可以看到该目录下生成了一个APKFiles文件夹,里面就是我们需要的解码后的资源文件、xml文件和smali文件等。xml文件不需要再使用AXMLPrinter2.jar来解码即可直接查看。

(2)、回编译成apk文件

对反编译得到的文件进行修改后把它回编译也是很简单的:

  1. java -jar apktool.jar b APKFiles

同样等待一段时间后,如果修改正确没有错误的话,回编译产生的apk将会在APKFiles下的dist文件夹中,当然它也是没有重新签名的,不能直接安装使用。

四、对Apk进行签名

关于签名,可以有些童鞋会感到疑惑,下面先简要提一提:

1、为什么需要签名?

(1)发送者的身份认证,由于开发商可能通过使用相同的PackageName来混淆替换已经安装的程序,以此保证签名不同的包不被替换;

(2)保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中内容不被替换,防止交易中的抵赖发生,Market对软件的要求。

2、签名的一些说明

(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序;

(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;

(3)如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布;

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能;

(5)Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序;

(6)签名后需使用zipalign优化程序。

3、如何签名

签名工具有不少,这里仅提及其中的一个:signapk.jar。signapk.jar本来就是包含在android源码包中的一个工具,用它可以把上面经过反编译-回编译后得到的apk进行签名,由于直接使用signapk.jar进行签名很麻烦,而且最终使用的是下面最后谈及的综合工具,所以这里仅提及签名流程:

(1)、使用OpenSSL生成公钥/私钥对;

(2)、使用signapk.jar和(1)的公私玥对对apk进行签名。

这样经过签名后的apk才能安装到设备上进行测试。

五、推荐一个网友制作的综合工具:ApkTool + SignApk

程序员是最怕麻烦的,所以早就有网友用脚本把所有操作都帮我们整理好了,它其实就是帮我们做好了自动反编译、自动回编译和签名的工作,不用再每一次都输入大串的命令。需要下载的请点击下面的链接,使用方式直接打开就知道,说明中已经说得很明白了。

==工具下载链接请戳我==

六、其他辅助工具

1、UltraFileSearch:这是个很!有!用!的软件!UltraFileSearch 允许你指定多个文件掩码和多驱动器和/或文件夹在同一时间,它能够整理出的文件和文件夹根据自己的性质(如更新日期),找到其中包含某特定词或句子的所有文件。

2、如果使用NotePad++修改smali文件,推荐使用一个语法高亮文件userDefineLang.xml,使用方法:放置到C:\Users\<用户名>\AppData\Roaming\Notepad++下即可。

Reference:

Android apk 签名: http://www.cnblogs.com/not-code/archive/2011/05/15/2047057.html

APK反编译之二:工具介绍的更多相关文章

  1. Android APK反编译(二)

    参考:APK反编译 工具介绍 apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar 作用:将apk反编译成java源码(classes.dex转化成jar文件) ...

  2. linux下的APK反编译软件及过程介绍 .

    需要工具: 1.apktool apk打包工具 下载地址:http://android-apktool.googlecode.com/files/apktool1.5.2.tar.bz2 安装:直接解 ...

  3. apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]

    ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...

  4. apk反编译之二——smali学习

    在apk被反编译后,原来的java程序会以smali文件呈现.这就需要补充smali的知识.依旧参考官方文档,择日我将把官方文档做一下翻译.今日先贴出链接地址: 1:了解smali字节码的寄存器 请参 ...

  5. Android反编译和二次打包

    参考:APK反编译 一.工具介绍: 1.解压工具 2.JDK 3.apktool: aapt.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,反编译生 ...

  6. APK反编译之一:基础知识—APK、Dalvik字节码和smali文件

    refs: APK反编译之一:基础知识http://blog.csdn.net/lpohvbe/article/details/7981386 APK反编译之二:工具介绍http://blog.csd ...

  7. APK反编译之一:基础知识

    作者:lpohvbe | http://blog.csdn.net/lpohvbe/article/details/7981386 这部分涉及的内容比较多,我会尽量从最基础开始说起,但需要读者一定的a ...

  8. APK Multi-Tool强大的APK反编译工具终极教程

    一.APK Multi-Tool介绍    APK Multi-Tool 是APK Manager的升级版,是一个强大的APK反编译工具,集多种功能于一身,是居家必备.做ROM必选的工具!    这是 ...

  9. apk反编译工具

    反编译工具: apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件) jd-gui:查看APK中 ...

随机推荐

  1. hadoop之计数器和管道的mrunit测试

    引言 hadoop的调试真心让人灰常恼火,而且从企业实际出发,集群的资源是有限的,不可能在集群上跑一遍又一遍根据log去调试代码,那么使用MRUnit编写测试单元,显得尤为重要.MRUnit中的Map ...

  2. 机器学习基础 --- numpy的基本使用

    一.numpy的简介 numpy是Python的一种开源的数值计算扩展库.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该 ...

  3. IIS 无法加载 CSS,JS的问题

    IIS 能加载 aspx,但不能加载里面的 js,css ,感觉有点坑. 解决方案如下:http://www.pageadmin.net/article/20121001/479.html 原来是没有 ...

  4. 使用python实现用微信远程控制电脑

    首先,我们要先看看微信远程控制电脑的原理是什么呢? 我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我 ...

  5. 随手记录-linux-Linux目录结构

    转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...

  6. 解决 vuex mapGetters 语法报错 (Unexpected token )

    在使用vuex2的mapGetters 和 mapActions 的方法时,借助 stage2 的 Object Rest Operator 特性,可以写出下面代码:  computed: { ... ...

  7. java程序设计课程实验报告1

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:陈都  学号:20135328 成绩:             指导 ...

  8. YQCB冲刺第二周第一天

    今天的任务为实现查看消费明细的功能. 遇到的问题是按类别显示. 站立会议为: 任务面板为:

  9. OTCL,面向对象的脚本一

    Otcl 简介 面向对象的脚本语言 类变量和类方法 Otcl的基类称为Object(类的名字,不是面向对象中的"对象"),所以的Otcl类都是从Object派送来的. 直接贴代码, ...

  10. HDU 1003 最大连续子段和

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)M ...