原文: 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内容是什么,如以下代码:

. 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源代码; 八、JodeclipseJadClipse 我们也可以解压标准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库吧!要不会被一些人搞得内裤都没得穿! 如果大家有什么关于防止反编译比较好的的技巧,可以留言告知,所有程序员都会感谢你的!

更多相关文章

  1. 在ubuntu操作系统下配置android开发环境
  2. 导出已安装到手机中程序的apk文件
  3. android 新建工程,没R.java 文件
  4. Android(安卓)Preference使用
  5. File
  6. Unity3D项目引用第三方的Android(安卓)Sdk
  7. 2.2 Ubuntu下安装Android(安卓)Studio
  8. android studio升级失败提示 Connection failed解决方法
  9. Intellij Idea12第一个安卓程序开发(HelloWorld)及简单讲解Android

随机推荐

  1. Android中的菜单-ContextMenu,PopupMenu
  2. Android:腾讯buglyDefaultApplicationLike
  3. 在notification中设置PendingIntent
  4. 新博andorid 初中级考试评测以及答案----
  5. [Android4.4]电池低电量告警提示
  6. Android(安卓)Studio 无法安装调试 apk
  7. Android(安卓)百分比、水波、流量剩余进
  8. android:allowBackup = false后编译报错
  9. TrafficStats ------- Android流量统计类
  10. Android(安卓)GreenDao数据库—基础详解