详解android应用程序的反编译

来源:互联网 发布:移动硬盘与mac不兼容 编辑:程序博客网 时间:2024/05/21 11:31
 

毕业设计不小心选了智能手机开发方向,而平台选择了android,所以最近自学了不少android程序开发的知识。但是作为一个懒散不堪,容易半途而废的人,android所自带的体系还是有点庞大,想要以此开发一个属于自己的独一无二的应用,难度对我这个小菜鸟来说实在大。所以难免生起“他山之石,可以攻玉”的想法。

毕设带队的老师说:代码都自己写的程序员不是好程序员。利用别人的代码,从中再修改一番变成自己的,这才是好的程序员。我不知道这话有没有道理,反正是说到了我的心坎了。懒人自有懒人的活法,天才是少数的,而懒惰的人是多数的。自然,我是多数人。

但是要修改别人的代码必须晓得他的代码,所以我们需要对android应用程序进行反编译。所幸andorid是个开放的平台,反编译比通常程序简单的多,下面就说说这个简单的过程。

基础知识

android上安装的应用程序后缀都是apk(Android application package),每个要安装到android平台的应用都要被编译打包为一个单独的文件,后缀名为.apk。而实际上这个apk格式的文件是一种变相的zip压缩包,你可以使用winrar打开看到里面的文件的结构。通常你可以看到这些内容:

|– AndroidManifest.xml
|– META-INF
|   |– CERT.RSA
|   |– CERT.SF
|   |– MANIFEST.MF
|– classes.dex
|– res
|   |– drawable
|   |   `– icon.png
|   |– layout
|       `– main.xml
|– resources.arsc

各个文件内容涵义不赘述了,可以看这篇文章http://www.ophonesdn.com/article/show/38

我们通常需要反编译出的有两部分:classes.dex和main.xml。一个是java经过google自制虚拟机dalvik编译出的字节码,一个是布局文件。大点的程序布局文件不止一个,我们这里只说只有一个的,其他类似。

需要的工具

1、把dex文件反编译为jar文件的工具。(dex2jar)
2、把jar反编译为java的工具。(JD-GUI)
3、AXMLPrinter2
三者下载链接分别是:
http://code.google.com/p/dex2jar/
http://java.decompiler.free.fr/?q=jdgui
http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.zip&can=2&q=

XML文件的反编译

apk文件中的xml文件都是经过压缩的,所以如果直接打开会看到一些乱码,所以需要工具AXMLPrinter2。

安装完java环境,然后cmd进入你把apk文件解压到的文件目录内,使用命令(注意,AXMLPrinter2.jar文件也要):

java -jar AXMLPrinter2.jar main.xml

成功后会在cmd里出现xml反编译出的文件

classes.dex文件反编译

Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器, 把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。但是这样得到的结果,其可读性是极差的。

所以我们使用了两个工具dex2jar和JD-GUI。

反编译的步骤:

1、从APK中提取classes.dex文件,对APK文件解压即可得到。 将其放到dex2jar的目录下,打开cmd,运行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar。

2、运行JD-GUI工具,打开上面的jar文件,即可看到源代码。

在JD-GUI上可以看到一堆a b c d ……的树形结构,这些都不是,真正要看的是activity。如图:

5356270065_997c64d080.jpg (500×334)

其实还是很羡慕那些自己写一堆代码的人,昨天史玉柱在自己的微博上说:

20年前创业初期,我是本公司的唯一研发人员(公司总人数才4人),编写文字处理软件,我一人写了50万行代码,关键模块都是使用极枯燥的汇编语言。公司很快就赚了数千万元,但那时我似乎并没想买豪宅买宝马,和现在一些85后研发人员有区别。究竟是时代不同了,还是因我是老板呢?思考中。。。

可能这辈子我也写不了50万行的代码,甚至十分之一都不太可能了。业内有句话说:珍爱生命,远离IT。

出自:http://www.lvleaf.com/windson/?p=977

 

 

 

 

 

 

 

Android APK反编译得到Java源代码和资源文件

2011年3月9日 iStar发表评论阅读评论

发现很多人都在关心apk的反编译,上传一个可视化的工具吧,原理和下面说的差不多,就是封装了一下。点我下载Android反编译工具

另外,作为应用开发者,肯定不希望自己的代码被反编译的,另外写了篇文章,讲述如何通过混淆代码放在反编译:《如何防止Android应用被反编译》

这段时间在学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

具体步骤:
  1. 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
  2. 解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录,运行
    dex2jar.bat classes.dex

     

    生成classes.dex.dex2jar.jar

  3. 运行JD-GUI,打开上面生成的jar包,即可看到源代码了。

二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件

如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool,下载地址:

http://code.google.com/p/android-apktool/,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。

具体步骤:
  1. 将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar;
  2. 在命令行下定位到apktool.bat文件夹,输入以下命令:
    apktool d C:\***.apk  C:\***文件夹

     

    命令行解释:apktool d [要反编译的apk文件 ] [输出文件夹],特别注意:你要反编译的文件一定要放在C盘的根目录里;

  3. 将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可。
    出自:http://www.maxhis.info/androiding/android-apk-decompile/

                                                            Android反编译方法

                                                            2011-05-31 14:52 佚名 论坛 我要评论(0) 字号:T |T
                                                            一键收藏,随时查看,分享好友!

                                                            反编译主要的目的在于学习,利用反编译进行相关的汉化或修改,还是尽量不要吧,毕竟人家写个程序不容易啊!参考内容如下。

                                                            AD:


                                                              对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

                                                              具体方法如下:

                                                              一:所需工具(点击各自连接进入下载页面):

                                                              AXMLPrinter2.jar

                                                              dex2jar:

                                                              查看Jar包的GUI工具

                                                              二,开始行动

                                                              1.用AXMLPrinter2.jar查看apk中的布局xml文件:

                                                              将apk文件(为了方便起见放到tools目录里)用WinRAR等工具打开,将res/layout/main.xml解压出来(也还是放在tools目录里哦)

                                                              打开main.xml文件,内容如下(一堆天文):

                                                              这时候AXMLPrinter2.jar派上用场了,打开cmd终端,一直进入到tools目录下,输入如下命令:

                                                              java -jar AXMLPrinter2.jar main.xml > main.txt. (如下图所示)

                                                              2:通过dex2jar工具进行反编译。

                                                              把apk中的class.dex拷贝到dex2jar.bat所在目录。运行dex2jar.bat class.dex,将会在其文件夹下生成classes.dex.dex2jar.jar。 

                                                              3、可以将jar文件重新命名后拷贝到GUI文件夹下,运行JD-GUI工具(它是绿色无须安装的),打开上面的jar文件,即可看到源代码。

                                                              1. <?xml version="1.0" encoding="utf-8"?>     
                                                              2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
                                                              3.      android:orientation="vertical"     
                                                              4.      android:layout_width="fill_parent"     
                                                              5.      android:layout_height="fill_parent"     
                                                              6.      >     
                                                              7. <WebView     
                                                              8.      android:id="@+id/apk_web"     
                                                              9.      android:layout_height="wrap_content"     
                                                              10.      android:layout_width="fill_parent"           
                                                              11. />     
                                                              12. </LinearLayout>   
                                                              13. <?xml version="1.0" encoding="utf-8"?>     
                                                              14. <LinearLayout       xmlns:android="http://schemas.android.com/apk/res/android"     
                                                              15.      android:orientation="1"     
                                                              16.      android:layout_width="-1"     
                                                              17.      android:layout_height="-1"     
                                                              18.      >     
                                                              19.      <WebView     
                                                              20.          android:id="@7F050000"     
                                                              21.          android:layout_width="-1"     
                                                              22.          android:layout_height="-2"     
                                                              23.          >     
                                                              24.      </WebView>     
                                                              25. </LinearLayout>   

                                                               

                                                              出自 :http://mobile.51cto.com/android-265964.htm


                                                              原创粉丝点击