反编译APK - silence鼬 - 博客频道 - CSDN.NET silence鼬 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! 消灭0回答,赢下载分 “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 反编译APK 分类: Android 2011-12-13 11:18 1777人阅读 评论(2) 收藏 举报 反编译工具androidjarjavaeclipse插件工具 Android程序的反编译 APK是Android Package的简称,是Android平台安装包的标准封装格式,实际上是标准的zip压缩文件,里面包含清单文件,数字签名文件,压缩后的资源文件,以及二进制dex字节码文件,Android程序的反编译包括两部分,三个流程,二部分是资源文件resources.arsc的反编译和字节码文件classes.dex的反编译;三流程是资源文件反编译为人类可读的XML文本格式和图片文件,字节码文件dex反编译为标准的Java压缩格式jar(标准的Java Class文件),然后将class文件反编译为Java源代码。下面说明各个流程的方法和所需要的工具: 1. 资源文件的反编译 资源文件包括resources.arsc和res目录中的XML文件,如果直接打开是乱码,resources.arsc是压缩过的二进制文件,XML也是压缩过的二进制格式的文件,我们要做的是还原他们的本来面目:二进制格式的图片,和文本格式的XML文件。我们使用最方便的工具:Android Apktool,这个工具的作者是XDA的高手,他同时还是Brut版Google Maps的作者。这个工具使用非常方便。 Android Apktool发布地址:http://forum.xda-developers.com/showthread.php?t=640592 Android Apktool项目地址:http://code.google.com/p/android-apktool/ 以Windows系统为例,需要下载这两个文件: 写好的bat批处理脚本:/files/apktool-install-windows-2.2_r01-3.tar.bz2 apktool可执行文件:/files/apktool1.3.2.tar.bz2 将它们解压到同一个文件夹就可以了,使用方法如下, 以Android系统自带的Gallery.apk文件为例: 反编译资源文件,并将字节码反编译为smali文件:命令行输入 apktool.bat d Gallery.apk ,当前目录下会生成一个Gallery目录,里面就是反编译好的文件,res目录里为反编译好的资源文件,smali目录里为反编译好的smali字节码文件。由于我们只需要资源文件,所以可以使用下面的命令。仅反编译资源文件,命令行输入 apktool.bat d -s Gallery.apk 同样会生成Gallery目录,里面的res目录里为反编译好的资源文件,但是classes.dex没有反编译为smali文件。 2. 二进制字节码文件的反编译 解压apk文件可以发现里面的classes.dex,这就是二进制字节码文件,我们要把它反编译为标准的Java Class文件,需要的工具是dex2jar,该工具是国人开发的,目前还在不断更新中。 dex2jar项目地址: http://code.google.com/p/dex2jar/ dex2jar下载地址: /files/dex2jar-0.0.7.5-SNAPSHOT.zip 使用方法非常简单,还是以上面的Gallery程序为例,取出里面的classes.dex文件后,命令行输入 dex2jar.bat classes.dex 就会在同级目录下发现反编译好的jar文件classes.dex.dex2jar.jar,下面的步骤就是将Jar文件反编译为Java源文件了,需要是的工具是JD-GUI,或者DJ Java Decompiler。 JD-GUI是著名的Java反编译工具JAD的GUI版本,下载地址: http://java.decompiler.free.fr/?q=jdgui,此程序还提供一个Eclipse插件,使用方法,直接用JD-GUI打开刚才反编译好的Jar文件就可以看到Java源代码了,如果原始程序没有经过混淆,那么你会发现代码非常清晰,很容易看懂。 3. 使用Logcat查看代码的功能 反编译出来后一般还有很多代码对应的功能不容易弄懂,此时可以打开程序,对照Logcat里面的调试信息,很容易看到代码对应的功能,至于代码里的资源文件ID,由于都是数字,需要到R.java里面去查找对应的资源文件名称。这是一种很好的学习的方法,但也可能被用作非法用途。 ============================================================================================================= 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。 在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。 一、反编译Apk得到Java源代码 首先要下载两个工具:dex2jar和JD-GUI 前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址: dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip JD-GUI:http://laichao.googlecode.com/files/jdgui.zip 具体步骤: 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的; 解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录 运行 dex2jar.bat classes.dex 生成 classes.dex.dex2jar.jar 生成jar文件的截图如下: 运行JD-GUI(jd-gui.exe),打开上面生成的jar包,即可看到源代码了 HelloAndroid源码(编译前的apk源码对照)如下: 二、反编译apk生成程序的源代码和图片、XML配置、语言资源等文件 如果是只是汉化软件,这将特别有用。 首先还是下载工具,这次用到的是apktool 下载地址:http://code.google.com/p/android-apktool/downloads/list 下载:apktool1.4.1.tar.bz2 和 apktool-install-windows-r04-brut1.tar.bz2(两个包都下载) 具体步骤: 将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar 在命令行下定位到apktool.bat文件夹,输入以下命令:apktool d C:\*.apk C:\*文件夹,如下图: 命令行解释:apktool d [apk文件 ] [输出文件夹] 反编译的文件如下(AndroidManifest.xml为例): 特别注意:你要反编译的文件一定要放在C盘的根目录里 将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可,命令如下: 打包apk后的文件在目录C:\HelloAndroid下,生成了两个文件夹: build dist 其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,Ok 注:本android反编译教程,是在Windows 7 Ultimate 64bit ,测试通过 上述反编译工具包下载 更多 上一篇:那些惊艳死人的句子 下一篇:详细介绍java虚拟机 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 perfect2011 访问:79137次 积分:1695分 排名:第6576名 原创:78篇 转载:152篇 译文:0篇 评论:21条 新浪微博 我的新浪微博 文章分类 C/C++(20) Android(47) Ruby(1) C#(9) Java(63) .net(10) Office(6) Unix(1) 日语(9) Javascript学习(6) 闲言碎语(9) 系统修复(0) 数据库(25) 算法(31) Spring(1) 服务器(5) 前端(2) Lucene(3) Php(5) 文章存档 2014年01月(4)2013年12月(1)2013年08月(3)2013年07月(13)2013年06月(12)2013年05月(2)2013年04月(1)2013年03月(1)2012年12月(5)2012年11月(3)2012年10月(2)2012年08月(2)2012年07月(3)2012年06月(2)2012年05月(10)2012年04月(8)2012年03月(3)2012年02月(7)2012年01月(4)2011年12月(31)2011年11月(46)2011年10月(40)2011年09月(19)2009年12月(1)2009年11月(8) 阅读排行 mongo db 使用方法(3821) Android SimpleAdapter的参数(3090) Java语法总结 - 线程(2362) C++ODBC连接数据库(2206) Excel表格高级筛选教程(1983) J2EE面试题集(1807) 反编译APK(1777) 迪杰斯特拉算法(1540) 在Excel中如何引用其它位置的数据(1536) 微软日语输入法IME使用(1193) 评论排行 C++ODBC连接数据库(4) Lucene4.3入门(2) Android SimpleAdapter的参数(2) 反编译APK(2) Android 面试题(1) Java软件工程师面试(1) 归并排序(1) Android开发指南-用户界面-事件处理(1) OSGI笔记(一)HelloWorld(1) JavaScript中ActiveXObject操作本地文件夹(1)