AndroidAPK反编译教程_第1页
AndroidAPK反编译教程_第2页
AndroidAPK反编译教程_第3页
AndroidAPK反编译教程_第4页
AndroidAPK反编译教程_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android APK反编译教程原帖地址:Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似 Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中 去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法 来查看,当然这需要借助一些我们自己编写的跟踪程序。Go

2、ogle最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。 dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中:D:Program Filesandroid-sdk-windows-1.6_r1platformsandroid-1.6toolsdexdump.exe -d classes.dex spk.dump.txt得到的文件内容,描述了类的信息,但是不怎么好阅读这个方法就强大了,AXMLPrinter2是还原AndroidMani

3、fest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。 baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具操作方式如下:1 1、java -jar AXMLPrinter2.jar D:playAndroidManifest.xml AndroidManifest.txt2 2、java -jar AXMLPrinter2.jar D:playreslayoutmain.xml main.txt3 3、java -jar baksmali-1.2.5.j

4、ar -o classout/ d:playclasses.dex复制代码baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:456 view plaincopy to clipboardprint?7 .class Lcom/paul/test/a; 8 .super Landroid/view/View; 9 10 # static fields 11 .field private static final a:Landroid/graphics/Typeface; 12 13 # instance fields 1

5、4 .field private b:I 15 .field private c:I 16 .field private d:Z 17 .field private e:J 18 .field private f:I 19 .field private l:Ljava/lang/String; 20 21 # direct methods 22 .method static constructor ()V 23 .registers 2 24 sget-object v0, Landroid/graphics/Typeface;-SANS_SERIF:Landroid/graphics/Typ

6、eface; 25 const/4 v1, 0x0 26 invoke-static v0, v1, Landroid/graphics/Typeface;-create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; 27 move-result-object v0 28 sput-object v0, Lcom/wiyun/ad/a;-a:Landroid/graphics/Typeface; 29 return-void 30 .end method 31 # 32 # other methods . 33 # 34 #

7、virtual methods 35 .method public onKeyUp(ILandroid/view/KeyEvent;)Z 36 .registers 4 37 const/16 v0, 0x42 38 if-eq p1, v0, :cond_8 39 const/16 v0, 0x17 40 if-ne p1, v0, :cond_b 41 :cond_8 42 invoke-direct p0, Lcom/paul/test/a;-d()V 43 :cond_b 44 const/4 v0, 0x0 45 invoke-virtual p0, v0, Lcom/paul/te

8、st/a;-setPressed(Z)V 46 invoke-super p0, p1, p2, Landroid/view/View;-onKeyUp(ILandroid/view/KeyEvent;)Z 47 move-result v0 48 return v0 49 .end method 50 .class Lcom/paul/test/a;51 .super Landroid/view/View;5253 # static fields54 .field private static final a:Landroid/graphics/Typeface;5556 # instanc

9、e fields57 .field private b:I58 .field private c:I59 .field private d:Z60 .field private e:J61 .field private f:I62 .field private l:Ljava/lang/String;6364 # direct methods65 .method static constructor ()V66 .registers 267 sget-object v0, Landroid/graphics/Typeface;-SANS_SERIF:Landroid/graphics/Type

10、face;68 const/4 v1, 0x069 invoke-static v0, v1, Landroid/graphics/Typeface;-create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;70 move-result-object v071 sput-object v0, Lcom/wiyun/ad/a;-a:Landroid/graphics/Typeface;72 return-void73 .end method74 #75 # other methods .76 #77 # virtual met

11、hods78 .method public onKeyUp(ILandroid/view/KeyEvent;)Z79 .registers 480 const/16 v0, 0x4281 if-eq p1, v0, :cond_882 const/16 v0, 0x1783 if-ne p1, v0, :cond_b84 :cond_885 invoke-direct p0, Lcom/paul/test/a;-d()V86 :cond_b87 const/4 v0, 0x088 invoke-virtual p0, v0, Lcom/paul/test/a;-setPressed(Z)V89

12、 invoke-super p0, p1, p2, Landroid/view/View;-onKeyUp(ILandroid/view/KeyEvent;)Z90 move-result v091 return v092 .end method复制代码认真一看,就知道:# static fields 定义静态变量的标记# instance fields 定义实例变量的标记# direct methods 定义静态方法的标记# virtual methods 定义非静态方法的标记以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则

13、执行cond_8的流程:9394 :cond_895 invoke-direct p0, Lcom/paul/test/a;-d()V复制代码调用com.paul.test.a的d()方法不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:9697 :cond_b98 const/4 v0, 0x099100 invoke-virtual p0, v0, Lcom/paul/test/a;-setPressed(Z)V101102 invoke-super p0, p1, p2, Landroid/view/View;-onKeyUp(ILandroid/view/

14、KeyEvent;)Z103104 move-result v0复制代码大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法最后105 return v0复制代码 该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。一、反编译Apk得到Java源代码首先要下载两个工具:dex2jar和JD-GUI前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载

15、地址:本帖隐藏的内容dex2jar:JD-GUI:具体步骤:首先将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源码对照)如下: 二、反编

16、译apk生成程序的源代码和图片、XML配置、语言资源等文件如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool下载地址:本帖隐藏的内容下载: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下,生成了两个文件夹:builddis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论