Android反编译工具简介
16lz
2021-01-26
原文: http://www.eoeandroid.com/thread-66268-1-1.html http://blog.csdn.net/Android_Tutor/article/details/5724435
一、简介 大家都知道,将apk文件解压后有两部分文件需要处理,一种是 xml 文件,另一种一个 dex 文件(.dex), 我们可以从.dex文件中得到.class ,利用后者再得到大家垂涎已久的java文件。 下面分别针对这三种格式的文件进行反编译处理; 1. 对xml文件进行包的解析,一般有两种方式: apktool( 推荐)和 AXMLPrinter2.jar ; 2. 从dex到class公认 dex2jar.bat ,实现反编译;公认的强者; 3. 而class到java的方式要更多样化一些,因为只是查看反编译后的代码: jd-gui (推荐) ,Jodeclipse (Jode的Eclipse插件), JadClipse (Jad的Eclipse插件)。 还是作个大致介绍吧: 1. 首先把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。 2. 把class.dex拷贝到dex2jar.bat所在目录。运行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar。 3 .运行 JD-GUI 工具(绿色软件,好用的软件!),打开上面的jar文件,即可看到java源代码。 二、 apktool 的使用 apktool 通常用于生成程序的源代码和图片、XML配置、语言资源等文件。我们对图片和语言资源等文件修改后,可以再把它们编译打包成APK,签名后就是手机可以安装的本地化/修正版APK了。支持Linux 、Windows下工作 安装步骤: 1.安装JAVA环境(官方推荐jdk 1.6); 2.下载apktool.jar:http://code.google.com/p/android-apktool/downloads/list 点击下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 (不一定是这个,但最好选最新版本的吧!) 3.解压apktool1.3.2.tar.bz2得到apktool.jar; 解压apktool-install-windows.zip到任意文件夹,将apktool.jar拷入此文件夹中(也有人说是直接全部拷入C:/Windows,一样的); (目前此文件夹中有三个文件:apktool.jar/apktool.bat/aapt.exe) 4.cmd命令行进入到解压apktool-install-windows-2.2_r01-3.tar.bz2所得的文件夹,输入apktool测试是否安装成功; 安装成功后,下面开始反编译过程: 1. apktool d(要反编译的文件) (输出文件夹) 如: apktool d XXX.apk (目标文件夹) 反编译 geek.apk到文件夹test 2. apktool b(目标文件夹) 从目标文件夹中重建APK,生成的APK在"目标文件夹"\dist文件夹里,叫out.apk。 这个out.apk是没有签名的,所以不能直接装到手机里。签名工具和方法见http://www.hiapk.com/bbs/thread-21261-1-1.html,这里就不说了。签名后得到的APK,就是可以装到手机里的了。 三、 AXMLPrinter2.jar 的使用 AXMLPrinter2.jar 用于将apk中的xml转换成文本.将它放到android-sdk-windows-1.5_r3\tools文件夹中 运行cmd,进入tools目录,运行java -jar AXMLPrinter2.jar main.xml > main.txt; 于是我们就得到了反编译后的XML文件. 四、dex2jar的使用 dex2jar 用于把dex格式的文件转换成标准的class文件 下载: http://code.google.com/p/dex2jar/downloads/list 方法: 1.首先找到Android软件安装包中的classes.dex (解压得到); 它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件 2.把classes.dex拷贝到dex2jar.bat所在目录; 在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex ,生成 classes.dex.dex2jar.jar,成功了一半! 五、baksmali的使用 baksmali 也可以把dex格式的文件转换成标准的smali格式文件,透过这种格式的文件我就能猜出源代码了。 我们从apk中解出的smali,其实质是把dex转换为smali,dex文件格式相当紧凑,里面包含着指令,只不过都是16进制的看起来相当不便 下载地址: baksmali.jar 将apk文件里的classes.dex解压到baksmali.jar所在目录里,在cmd命令行里输入如下命令: java -jar baksmali.jar -o classout/ classes.dex .(如下图所示:) 你将会发现在tools里多一个classout文件夹里面(我代码的包目录结构清晰可见呀),如下图所示: 从上面看出除了Android本身资源的类R开头的,我的源程序里只有一个ApkInstaller.java,完全吻合 下面我们看一下ApkInstaller.smali内容是什么,如以下代码:
一、简介 大家都知道,将apk文件解压后有两部分文件需要处理,一种是 xml 文件,另一种一个 dex 文件(.dex), 我们可以从.dex文件中得到.class ,利用后者再得到大家垂涎已久的java文件。 下面分别针对这三种格式的文件进行反编译处理; 1. 对xml文件进行包的解析,一般有两种方式: apktool( 推荐)和 AXMLPrinter2.jar ; 2. 从dex到class公认 dex2jar.bat ,实现反编译;公认的强者; 3. 而class到java的方式要更多样化一些,因为只是查看反编译后的代码: jd-gui (推荐) ,Jodeclipse (Jode的Eclipse插件), JadClipse (Jad的Eclipse插件)。 还是作个大致介绍吧: 1. 首先把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。 2. 把class.dex拷贝到dex2jar.bat所在目录。运行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar。 3 .运行 JD-GUI 工具(绿色软件,好用的软件!),打开上面的jar文件,即可看到java源代码。 二、 apktool 的使用 apktool 通常用于生成程序的源代码和图片、XML配置、语言资源等文件。我们对图片和语言资源等文件修改后,可以再把它们编译打包成APK,签名后就是手机可以安装的本地化/修正版APK了。支持Linux 、Windows下工作 安装步骤: 1.安装JAVA环境(官方推荐jdk 1.6); 2.下载apktool.jar:http://code.google.com/p/android-apktool/downloads/list 点击下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 (不一定是这个,但最好选最新版本的吧!) 3.解压apktool1.3.2.tar.bz2得到apktool.jar; 解压apktool-install-windows.zip到任意文件夹,将apktool.jar拷入此文件夹中(也有人说是直接全部拷入C:/Windows,一样的); (目前此文件夹中有三个文件:apktool.jar/apktool.bat/aapt.exe) 4.cmd命令行进入到解压apktool-install-windows-2.2_r01-3.tar.bz2所得的文件夹,输入apktool测试是否安装成功; 安装成功后,下面开始反编译过程: 1. apktool d(要反编译的文件) (输出文件夹) 如: apktool d XXX.apk (目标文件夹) 反编译 geek.apk到文件夹test 2. apktool b(目标文件夹) 从目标文件夹中重建APK,生成的APK在"目标文件夹"\dist文件夹里,叫out.apk。 这个out.apk是没有签名的,所以不能直接装到手机里。签名工具和方法见http://www.hiapk.com/bbs/thread-21261-1-1.html,这里就不说了。签名后得到的APK,就是可以装到手机里的了。 三、 AXMLPrinter2.jar 的使用 AXMLPrinter2.jar 用于将apk中的xml转换成文本.将它放到android-sdk-windows-1.5_r3\tools文件夹中 运行cmd,进入tools目录,运行java -jar AXMLPrinter2.jar main.xml > main.txt; 于是我们就得到了反编译后的XML文件. 四、dex2jar的使用 dex2jar 用于把dex格式的文件转换成标准的class文件 下载: http://code.google.com/p/dex2jar/downloads/list 方法: 1.首先找到Android软件安装包中的classes.dex (解压得到); 它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件 2.把classes.dex拷贝到dex2jar.bat所在目录; 在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex ,生成 classes.dex.dex2jar.jar,成功了一半! 五、baksmali的使用 baksmali 也可以把dex格式的文件转换成标准的smali格式文件,透过这种格式的文件我就能猜出源代码了。 我们从apk中解出的smali,其实质是把dex转换为smali,dex文件格式相当紧凑,里面包含着指令,只不过都是16进制的看起来相当不便 下载地址: baksmali.jar 将apk文件里的classes.dex解压到baksmali.jar所在目录里,在cmd命令行里输入如下命令: java -jar baksmali.jar -o classout/ classes.dex .(如下图所示:) 你将会发现在tools里多一个classout文件夹里面(我代码的包目录结构清晰可见呀),如下图所示: 从上面看出除了Android本身资源的类R开头的,我的源程序里只有一个ApkInstaller.java,完全吻合 下面我们看一下ApkInstaller.smali内容是什么,如以下代码:
. class public Lcom / tutor / apkinstaller / ApkInstaller ; . super Landroid / app / Activity ; . source "ApkInstaller.java" # instance fields .field private apkWeb:Landroid/webkit/WebView; # direct methods .method public constructor <init>()V .registers 1 .prologue .line 8 invoke-direct {p0}, Landroid/app/Activity;-><init>()V return-void .end method # virtual methods .method public onCreate(Landroid/os/Bundle;)V .registers 5 .parameter "savedInstanceState" .prologue .line 13 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 14 const/high16 v2, 0x7f03 invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->setContentView(I)V .line 15 const/high16 v2, 0x7f05 invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->findViewById(I)Landroid/view/View; move-result-object v2 check-cast v2, Landroid/webkit/WebView; iput-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView; .line 16 iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView; invoke-virtual {v2}, Landroid/webkit/WebView;->getSettings()Landroid/webkit/WebSettings; move-result-object v1 .line 17 .local v1, webSettings:Landroid/webkit/WebSettings; const/4 v2, 0x1 invoke-virtual {v1, v2}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V .line 19 const-string v0, "http://frankiewei.net/apk/demos/main/index.html#home" .line 20 .local v0, apkUrl:Ljava/lang/String; iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView; invoke-virtual {v2, v0}, Landroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V .line 21 return-void .end method同样为了比对我们看一下ApkInstaller.java的源代码如下:
package com . tutor . apkinstaller ; import android . app . Activity ; import android . os . Bundle ; import android . webkit . WebSettings ; import android . webkit . WebView ; public class ApkInstaller extends Activity { private WebView apkWeb ; @Override public void onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ); setContentView ( R . layout . main ); apkWeb = ( WebView ) findViewById ( R . id . apk_web ); WebSettings webSettings = apkWeb . getSettings (); webSettings . setJavaScriptEnabled ( true ); String apkUrl = "http://frankiewei.net/apk/demos/main/index.html#home" ; apkWeb . loadUrl ( apkUrl ); } }六、smali的使用 smali的.jar可以把smali格式的文件打包成 classes.dex。 下载地址 我们上一步已经将classes.dex反编译成了.smali文件,好了,我们看看smali文件看够了,在偿试把它编译成classes.dex吧, 输入如下命令: java -jar smali.jar classout/ -o classes.dex . 如下图所示: 我们可以将新生成的classes.dex塞入apk里覆盖原来的classes.dex文件,这样我们的apk还是一样能用的哦~ 七、JD-GUI的使用 JD-GUI 既可以用于反编译标准的class文件,也可以用于反编译标准的class文件的jar文件包 下载: http://java.decompiler.free.fr/?q=jdgui 方便好用,直接解压得到JD-GUI,用它打开上面的jar文件, File--> Save JAR Source,即可看到梦寐以求的java源代码; 八、Jodeclipse和JadClipse 我们也可以解压标准class文件的jar文件包得到class文件,到这里,我们就要用到Jodeclipse和JadClipse了; Jodeclipse是Jode的Eclipse插件,JadClipse也是Jad的Eclipse插件 关于这两个Eclipse插件的安装可见下面链接: http://tgyd2006.javaeye.com/blog/553061 但也有人提出此问题: 自从eclipse升级到3.3以后jad插件就一直没有成功的安装上去,网上看了好多文章也是以前版本的安装方法,3.3目前通过eclipse的software update的插件安装方式已经不行了。 解决方法如下: 1.从http://www.kpdus.com/jad.html#download地址下载最新的jad,我目前下载的是jadnt158.zip; 2.从http://nchc.dl.sourceforge.net/s ... jadclipse_3.3.0.jar地址下载jadclipse_3.3.0.jar,拷贝到eclipse的plugins目录下; 3.启动或重起eclipse,修改window -> Preferences -> Java -> JadClipse 下的 Path to decompiler 如:D:\eric\jadnt158\jad.exe(jadnt158.zip解压后的目录); 4.Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer” 大功告成,之后在java类里按住ctrl点击类就可以看到它jad反编译后的源带码了; 如果发现安装了没有效果,可以删除eclipse主目录下的\configuration\org.eclipse.update后,再执行eclipse -clean试试 九、 DJ Java Decompiler 另外, DJ Java Decompiler也是很好的反编译标准class文件的工具。 十、总结 最后,将得到的java文件和得到的xml文件组合可得一个android工程,即可得到相对比较完整的apk源码;但也有些额外加的包没被编译出来。 十一、关于混淆 有人会说程序可以用混淆器扰乱代码,但刚从网上看到的一种关于混淆器的说法: “用混扰器的代码一般就是去掉所有注释和把变量名、方法名和类名变成一些没意义的名字。反编译后一般都变成a, b , c,...这样的名字,只能一点点的看懂,再利用Eclipse的改名方法,一次性的吧相关的名字改成有意义的名称。” 所以,大家的关键代码最好还是打成 .so库吧!要不会被一些人搞得内裤都没得穿! 如果大家有什么关于防止反编译比较好的的技巧,可以留言告知,所有程序员都会感谢你的!
更多相关文章
- 在ubuntu操作系统下配置android开发环境
- 导出已安装到手机中程序的apk文件
- android 新建工程,没R.java 文件
- Android(安卓)Preference使用
- File
- Unity3D项目引用第三方的Android(安卓)Sdk
- 2.2 Ubuntu下安装Android(安卓)Studio
- android studio升级失败提示 Connection failed解决方法
- Intellij Idea12第一个安卓程序开发(HelloWorld)及简单讲解Android