Android apk反编译、重新编译和签名
将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.dex文件中得到.class,再将.class处理得到大家垂涎已久的java文件。
一、APK文件是什么?
Android application package文件。每个要安装到android平台的应用都要被编译打包为一个单独的文件,后缀名为.apk,其中包含了应用的二进制代码、资源、配置文件等。  
APK文件其实就是一个MIME为ZIP的压缩包,通过解压缩软件可以看到内部的文件结构,Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。
下面是一个BMI的apk示例文件 :

1、Manifest文件:AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。注意:在apk中的xml文件是经过压缩的,不可以直接打开。
2、Res文件:res文件夹下为所有的资源文件。
3、resources.arsc文件:为编译后的二进制资源文件,许多做汉化软件的人都是修改该文件内的资源以实现软件的汉化的。
4、META-INF目录:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在OPhone平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。
5、classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。
二、为什么要反编译android apk文件?
1、学习优秀的软件设计,解决封闭包特定的问题;
2、去除广告及吸费,修改别人的软件包名,重新打包发布;
3、 中文汉化;
三、反编译工具
android-apktool:(推荐)APKTool是GOOGLE提供的APK编译工具,能够反编译及回编译apk。通常用于生成程序的源代码和图片、XML配置、语言资源等文件。我们对图片和语言资源等文件修改后,可以再把它们编译打包成APK,签名后就是手机可以安装的本地化/修正版APK了。支持Linux 、Windows下工作,用该工具来汉化Android软件然后重新打包发布是相当简单的。下载地址:http://code.google.com/p/android-apktool/downloads/list
dex2jar:(强烈推荐)把dex文件反编译为jar文件的工具。classes.dex是java源码编译后生成的java字节码文件,但Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。 下载地址:http://code.google.com/p/dex2jar/downloads/list
jd-gui:(推荐)把jar反编译为java的工具,可以直接查看反编译后的jar包源代码。 下载地址:http://java.decompiler.free.fr/?q=jdgui
dexdump:Android模拟器中提供的一个dex文件的反编译工具。用法一:为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。用法二:可使用类似这样的命令将dex文件dump到txt文件中:D:\Program Files (x86)\Android\android-sdk\platform-tools\dexdump.exe -d classes.dex > spk.dump.txt。但是这样得到的结果,其可读性是极差的。
四、Apk反编译得到Java源代码
下载并解压dex2jar-0.0.9.14.zip文件,得到dex2jar-0.0.9.14文件夹,内含apk反编译成java源码工具,以及源码查看工具。
首先,将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的。在命令行下定位到dex2jar.bat所在目录,运行:dex2jar.bat   D:\Android\apk\Bmi\classes.dex
默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar。
然后,进入jdgui文件夹双击jd-gui.exe,打开上面生成的jar包classes_dex2jar.jar,即可看到源代码了,必须使用apktool来进行反编译,jd-gui得到的是不可逆的代码,无法编译回去,如下图:

五、apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
如果是汉化软件,这将特别有用。下载并解压apktool1.5.2.tar.bz2和apktool-install-windows-r05-ibot.tar.bz2文件,将两个文件夹下的文件合并到apktool-install-windows-r05-ibot文件夹下:aapt.exe,apktool.bat,apktool.jar 。在命令行下定位到apktool.bat文件夹,输入以下命令:apktool.bat  d  -f  D:\Android\decompile\input\Bmi.apk   D:\Android\decompile\output,如下图:
 
上图中,apktool.bat 命令行解释:apktool.bat   d  -f    [apk文件 ]   [输出文件夹]
反编译的文件如下(AndroidManifest.xml为例),此时可以修改资源文件:

六、重新打包成apk
在命令行中输入:D:\Android\decompile\apktool\apktool-install-windows-r05-ibot>apktool.bat b D:\Android\decompile\output(你编译出来文件夹,里面的资源文件已经修改完成)即可,命令如下:
 
 apktool.bat b xxx
其中b表示build,xxx表示解包出来的文件夹,我们可以对某一文件进行修改,重新打包。打包apk后的文件在D:\Android\decompile\output文件夹下,生成了两个文件夹:
build和dist其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,build存放该APK的具体组成信息。打包之前我们可以简单的替换资源也可以通过修改smali完成代码的修改。
七、用 KeyTool 产生证书文件
在命令行输入:C:\Users\hairui>keytool -genkey -keystore cmd.keystore -keyalg RSA -validity 10000 -alias cmd.keystore,按如下输入后在C:\Users\hairui目录下生成了cmd.keystore证书文件。

八、生成签名的APK文件
在命令行输入:C:\Users\hairui>jarsigner -verbose -keystore cmd.keystore -signedjar D:\Android\decompile\output\dist\nbmi.apk D:\Android\decompile\output\dist\Bmi.apk cmd.keystore,在D:\Android\decompile\output\dist文件夹下生成了经过签名的nbmi.apk文件。


九、安装并运行生成的apk
 运行模拟器,在命令行输入:D:\Program Files (x86)\Android\android-sdk\platform-tools>adb install D:\Android\decompile\output\dist\nbmi.apk,如下提示说明安装成功:

运行新安装的应用如下:

红色圈中是我们修改添加上去的。到此,我们完成了APK文件的反编译、修改和重新编译、打包、运行的全过程。接下来还会介绍如何修改编译后的java源码,使用另一种工具来完成上述同样的过程。

游走Android系列之APK文件的反编译、修改和重新编译打包相关推荐

  1. Android代码实现APK文件的安装与卸载

    Android代码实现APK文件的安装与卸载 Android程序使用代码的安装和卸载!!! 安装: String str = "/CanavaCancel.apk"; String ...

  2. 上载android应用的apk文件变成了zip-网下转载的解决方案

    下载android应用的apk文件变成了zip--网上转载的解决方案 下载android应用的apk文件变成了zip--网上转载的解决方案 解决方案一. 最近把开发的android应用放在公司网站上, ...

  3. Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法

    当我们将Android升级功能的中的下载新版本apk文件存放在data/data/xxx.apk位置时,在有的些版本的手机中安装可能会出现安装包解析出错的问题,对于该问题的解决方案是提升该文件的权限. ...

  4. Android中关于APK文件的下载、安装和卸载

    如果我们想开发一款App,而这款App的需求中有对Apk文件的下载.安装和卸载功能的话(就像豌豆荚,当然功能不会那强大,因为强大的功能背后总是一些比较NB的技术在支持),那么这篇博客还是比较适合你的. ...

  5. android apk包解压缩,Android 解压APK文件

    最近一个项目里需要得到Android已安装程序的签名文件(CERT.RSA)的SHA1值,所以就调研解压APK文件. 通过包名来得到已安装程序在系统的安装包路径. private static Str ...

  6. android如何打开apk文件怎么打开方式,apk是什么文件格式?.apk文件怎么打开?

    apk文件在安卓系统的普及后为人熟知,作为我们最最常用的软件安装包,你对它的了解又有多少呢? apk是什么文件 APK是AndroidPackage的缩写,即Android安装包(apk).APK是类 ...

  7. android 电视安装apk文件损坏,android - 无法在Android电视盒上安装APK - 堆栈内存溢出...

    我正在为Android TV编写应用程序. 它可以在模拟器上正常运行,并在Android电视盒上以调试模式运行. 但是,当我使用Android Studio生成apk并尝试将该apk安装在同一盒子上时 ...

  8. 【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )

    文章目录 一.APK 文件处理脚本 ApkTool.py 二.ApkTool.py 脚本用法 三.ApkTool.py 脚本分析 APK 输出结果 一.APK 文件处理脚本 ApkTool.py Ap ...

  9. Kitten编程猫的工程文件 bcm,能发布成Android平台的apk文件吗

    根据Kitten编程猫社区的这个帖子: https://shequ.codemao.cn/community/367019 产生的不是可执行文件或者源码,产生的是配置文件,告诉执行文件的框架该怎么做的 ...

最新文章

  1. Deepin ROMS 安装详细流程
  2. 基于 HTML5 Canvas 的交互式地铁线路图
  3. Faster RCNN 训练中的一些问题及解决办法
  4. nginx rewrite
  5. 彻底清除计算机远程桌面连接的历史记录
  6. Confirm的用法!
  7. mysql 主从热备份 5.6 参数_MySQL主从热备份
  8. (67)FPGA面试题-为priority encoder编写Verilog代码,实现MUX4_1
  9. vue ---- webpack中loader
  10. Membership三步曲之入门篇 - Membership基础示例
  11. 模拟https类型的get,post请求时,碰到证书不信任,无法正常获取返回内容的异常
  12. Perl的模块判断及安装
  13. DB2 sqlCode错误信息
  14. 使用Hackintool工具生成全新的序列号及更改黑苹果SN三码序列号简易版教程
  15. c1语言实验报告怎么写,c语言程序设计实验报告模板
  16. 自媒体原创检测工具,了解了这个离收获大量粉丝不会远啦!
  17. 使用OpenSSL生成证书
  18. RTKLIB2.4.3中一些问题的修复---RTKLIB学习系列文章(二)
  19. 微信小程序多音频场景处理 - 背景音频
  20. Tomcat指定war包路径部署

热门文章

  1. 银行运维过程中遇到的客户销户的问题解决
  2. mysql command line client 使用_MySQL 5.7 mysql command line client 使用命令详解
  3. 揭秘蚂蚁金服智能风控平台“蚁盾”:它如何守护你的每一分财产?
  4. kaggle手机验证方法
  5. iView Table表格带搜索功能的Table组件
  6. 【SpringCloud】Hystrix断路器【五】
  7. 是选择短信群发还是微信群发呢?
  8. 如何在linux下配置java环境变量详解
  9. python网络数据爬取及分析从入门到精通pdf_Python网络数据爬取及分析从入门到精通...
  10. 四月,这些星空“美景”别错过