前面一节我们说过,修改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中定向到该目录并输入:

[plain] view plaincopy
  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,定位到该目录后输入:

[plain] view plaincopy
  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文件,使用命令:

[plain] view plaincopy
  1. java -jar baksmali.jar -x classes.dex

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

[plain] view plaincopy
  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执行:

[plain] view plaincopy
  1. java -jar apktool.jar d zheshiyige.apk APKFiles

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

(2)、回编译成apk文件

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

[plain] view plaincopy
  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. Andorid Tools--强大的Apk反编译,Rom提取工具,从此告别枯燥的命令

    Andorid Tools--强大的Apk反编译,Rom提取工具,从此告别枯燥的命令 零.说明 1.本软件为兴趣而写,如有侵权,请告知. 2.本软件为本人所编写,未经允许,不得转载. 一.软件界面(当 ...

  2. android 反编译方法、工具介绍

    网上有很多的反编译文章,个人认为写的比较好的文章有  APK反编译得工具总结(转载) - hayhx - 博客园 .我也是参考其文章来的,本人写此文章目的.以及反编译运用场景 主要有以下几方面: 记录 ...

  3. APK 反编译可视化修改工具IDE

    好吧,我必须承认咱国人的强大,有同志把APK反编译工具集成起来了 使用的时候注意一定要放大非系统盘的没有空格和中文字符的全英文路径下 不多介绍,直接上图和下载地址,想看介绍的可以去官网 http:// ...

  4. Android APK 反编译的基本工具和步骤

    一站解决反编译 JADX是一个可以直接反编译apk的程序,无需下面繁琐的步骤.推荐使用! 准备材料 dex2jar Android .dex 文件和Java的.class文件的转换 ApkTool 反 ...

  5. rom diy进阶教程之apk反编译基础(插桩解析)

    [Android] [SMALI]smali文件内容具体介绍 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄 ...

  6. APK反编译之smali

    APK.Dalvik字节码和smali文件 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看 ...

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

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

  8. APK反编译得工具总结(转载)

    Android反编译技术总结 转自UncleChen's Blog,作者:UncleChen 一.Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后 ...

  9. apk反编译工具的使用,超实用

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  10. APK反编译工具及方法

    文章目录 一.下载工具 apktool dex2jar jd-gui 二.APK反编译方法 方法一:Apktool 方法二:dex2jar + jd-gui 三.APK文件的基本结构 一.下载工具 a ...

最新文章

  1. 关闭图片 pycharm_博士大佬总结的Pycharm 常用快捷键思维导图,收藏!
  2. Android 导出traces.txt 遇到的坑
  3. Java 网址短链接服务原理及解决方案
  4. mysql装一次后再装_MySQL再安装
  5. java线程方法_Java线程的三种方式
  6. 博图如何读取mysql数据_博途使用小结:从SQL中读取数据并给变量赋值
  7. 【学术相关】谈谈国自然申请中标的经验
  8. golang大量字符串拼接方法
  9. ROS笔记(28) Setup Assistant
  10. 如何用maven tycho构建自己的Eclipse RCP应用
  11. Windows常用运行库--VC++、DirectX、.NET
  12. 关于一些初级ACM竞赛题目的分析和题解(九)
  13. 第3章-线性概率模型(1)-logistics/probit模型
  14. 攻防世界 ics-05
  15. contextcapture多区块点云_Smart 3D (ContextCapture) 4.4.6版本最新功能
  16. Java项目-黄金矿工
  17. gluster容量显示处理
  18. 修改Echarts源码实现柱状图的炫彩闪烁效果
  19. JetBrains出品,一款好用到爆的数据库工具
  20. win10软件安装出现错误代码2503/2502,解决方案

热门文章

  1. 人工智能和金融是天作之合的5个理由
  2. pytorch torchvision的版本对应关系 pytorch历史版本
  3. 2020-10-01
  4. php 循环删除文件,php循环删除目录及目录下的文件
  5. ci github 通知_GitHub 欢迎一切 CI 工具
  6. c++语言取整为什么要加0.5_22. 为什么 Python 中的整除是向下取整?
  7. vue.js2.0 新手开发_vue.js2.0实战(1):搭建开发环境及构建项目
  8. mybatis开发中遇到的小问题
  9. 优秀的产品管理促进了IBM的成功转型--和谐生产方式百题03
  10. 为何HDFS是大数据分析的软肋