ANDROID反编译方法

来源:互联网 发布:box2d js 编辑:程序博客网 时间:2024/05/21 07:01
前提:操作系统需配置了jdk


一、找到apk中的class.dex:
把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。


二、得到java源文件


工具准备:
1、把dex文件反编译为jar文件的工具。(dex2jar)
http://code.google.com/p/dex2jar/downloads/list


2、把jar反编译为java的工具。(JD-GUI)
http://java.decompiler.free.fr/?q=jdgui


反编译步骤:
1.在cmd下进入dex2jar.bat所在路径,然后输入“dex2jar.bat XXX”,XXX指的是你要反编译的apk中的classes.dex文件所在路径及名称,比如:我的dex2jar.bat在D:\Android\apk_decode\dex2jar-0.0.7-SNAPSHOT路径下, classes.dex在D:\Android下,所以: 你进入dex2jar.bat路径下后,输入dex2jar.bat D:\Android\classes.dex,这样会生成一个jar文件。


2.用rar解压出jar文件中的class文件,然后用jad或DJ Java Decompiler反编译工具将.class文件反编译成.java文件


3、运行JD-GUI工具(它是绿色无须安装的),打开上面的jar文件,在File下有个Save JAR Source,它可以生成src源代码。


三、上面操作只能得到class文件,下面利用Google提供的apktool得到xml文件


1. 下载apktool,可以去Google的官方下载,地址:http://code.google.com/p/android-apktool/得,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。解压apktool-install-windows.zip到任意文件夹,然后解压apktool-1.0.0.tar.bz2得到apktool.jar,放到apktool-install-windows解压后的目录下。


2. Win+R 运行CMD,用cd命令转到apktool-install-windows所在文件夹,输入apktool看看。会列出一些帮助的话就成功了(解释d为加压 第一个路径为你的apk所在的位置。第二个是要输出的位置)
apktool d e:\a.apk(apk路径)ABC(文件夹名称)


这时当前目录下生成 ABC文件夹,里面就是反编译出的东西了


 

常见问题:


一,找不到R文件时:
一般放在res\values\public.xml里


比如,反编译的类里setContentView(2130903174); 2130903174是十进制的,转化成十六进制就能够在public.xml中找到文件名了。
个人推荐使用:WIN7中点击“开始”--”程序“--“附件”--“计算器”,按 “查看”再选“程序员”,就可以方便的进行各进制的转换了(如:你要转换10进制90000000为16进制,点“十进制”,输入90000000,再点一下“16进制”,就会看到55D4A80,转换就完成了。其他同理)。


 


二,连接不上ADB时:


报错信息:


ADB server didn't ACK * failed to start daemon *


ADB server didn't ACK 
* failed to start daemon *


在cmd中进入adb的路径,输入命令:adb kill-server,执行完毕后再输入命令adb start-server,重启eclipse即可


--------------------------------------------------------------------------


上述方法无效时:


当输入adb start-server不能够重启adb时,反而抛出如下信息:


adb server is out of date.
ADB server didn't ACK
* failed to start daemon *


出现这种问题的原因有可能是adb需要的端口被占用。


在cmd中查看adb需要的端口,输入命令:adb nodaemon server,显示结果:can't bind "tcp:5037"


下面就找找5037端口是被哪个进程占用了,输入命令:netstat -ano | findstr "5037",显示结果:


TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 5892
TCP 127.0.0.1:5037 127.0.0.1:1218 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:1220 TIME_WAIT 0


所以需要关闭PID为5892的进程。命令tasklist可以查看所有的进程,找到关闭即可。


另外,根据以上方法发占用5892端口的任务是db_adb.exe,这个是金山毒霸连接手机杀毒的任务,在任务管理器中没有办法关闭,在右下角的任务列表中右键单击金山毒霸的图标,关闭手机链接,就能够kill这个任务了。