《Android-APK反编译教程.doc》由会员分享,可在线阅读,更多相关《Android-APK反编译教程.doc(8页珍藏版)》请在课桌文档上搜索。
1、Android APK反编译教程Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似 Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中 去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译.所有的类调用、涉与到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法 来查看,当然这需要借助一些我们自己编写的跟踪程序.Google最
2、然在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是还原AndroidManifest.x
3、ml和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.jar -o cl
4、assout/ d:playclasses.dex复制代码baksmali可解析注意,是解析,不是反编译原java包以与引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:4 view plaincopy to clipboardprint?5 .class L/paul/test/a; 6 .super Landroid/view/View; 7 # static fields 8 .field private static final a:Landroid/graphics/Typeface; 9 # instance fields 10 .field private b:I 11
5、 .field private c:I 12 .field private d:Z 13 .field private e:J 14 .field private f:I 15 .field private l:Ljava/lang/String; 16 # direct methods 17 .method static constructor V 18 .registers 2 19 sget-object v0, Landroid/graphics/Typeface;-SANS_SERIF:Landroid/graphics/Typeface; 20 const/4 v1, 0x0 21
6、 invoke-static v0, v1, Landroid/graphics/Typeface;-createLandroid/graphics/Typeface; 22 move-result-object v0 23 sput-object v0, L/wiyun/ad/a;-a:Landroid/graphics/Typeface; 24 return-void 25 .end method 26 # 27 # other methods . 28 # 29 # virtual methods 30 .method public onKeyUpZ 31 .registers 4 32
7、 const/16 v0, 0x42 33 if-eq p1, v0, :cond_8 34 const/16 v0, 0x17 35 if-ne p1, v0, :cond_b 36 :cond_8 37 invoke-direct p0, L/paul/test/a;-dV 38 :cond_b 39 const/4 v0, 0x0 40 invoke-virtual p0, v0, L/paul/test/a;-setPressedV 41 invoke-super p0, p1, p2, Landroid/view/View;-onKeyUpZ 42 move-result v0 43
8、 return v0 44 .end method 45 .class L/paul/test/a;46 .super Landroid/view/View;47 # static fields48 .field private static final a:Landroid/graphics/Typeface;49 # instance fields50 .field private b:I51 .field private c:I52 .field private d:Z53 .field private e:J54 .field private f:I55 .field private
9、l:Ljava/lang/String;56 # direct methods57 .method static constructor V58 .registers 259 sget-object v0, Landroid/graphics/Typeface;-SANS_SERIF:Landroid/graphics/Typeface;60 const/4 v1, 0x061 invoke-static v0, v1, Landroid/graphics/Typeface;-createLandroid/graphics/Typeface;62 move-result-object v063
10、 sput-object v0, L/wiyun/ad/a;-a:Landroid/graphics/Typeface;64 return-void65 .end method66 #67 # other methods .68 #69 # virtual methods70 .method public onKeyUpZ71 .registers 472 const/16 v0, 0x4273 if-eq p1, v0, :cond_874 const/16 v0, 0x1775 if-ne p1, v0, :cond_b76 :cond_877 invoke-direct p0, L/pa
11、ul/test/a;-dV78 :cond_b79 const/4 v0, 0x080 invoke-virtual p0, v0, L/paul/test/a;-setPressedV81 invoke-super p0, p1, p2, Landroid/view/View;-onKeyUpZ82 move-result v083 return v084 .end method复制代码认真一看,就知道:# static fields 定义静态变量的标记# instance fields 定义实例变量的标记# direct methods 定义静态方法的标记# virtual methods
12、 定义非静态方法的标记以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:85 :cond_886 invoke-direct p0, L/paul/test/a;-dV复制代码调用.paul.test.a的d方法不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:87 :cond_b88 const/4 v0, 0x089 invoke-virtual p0, v0, L/paul/test/a;-setPressedV90 invoke-super p0, p1, p2, L
13、android/view/View;-onKeyUpZ91 move-result v0复制代码大概意思就是调用.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法最后92 return v0复制代码 该方法,能把外部引用的lib包类也解析出来,能开到包的全貌.缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概.一、反编译Apk得到Java源代码首先要下载两个工具:dex2jar和JD-GUI前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源
14、代码.以下是下载地址:本帖隐藏的内容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-GUIjd-gui.exe,打开上面生成的jar包,即可看到源代码了HelloAndroid源码编译前的apk源码对照如下:二、反
15、编译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文件 输
16、出文件夹反编译的文件如下AndroidManifest.xml为例:特别注意:你要反编译的文件一定要放在C盘的根目录里将反编译完的文件重新打包成apk,很简单,输入apktool b c:*文件夹你编译出来文件夹即可,命令如下:打包apk后的文件在目录C:HelloAndroid下,生成了两个文件夹:builddist其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,Ok注 :上述android反编译教程,是在Windows 7 Ultimate 64bit ,测试通过系列教程:android应用、ROM开发者入门FAQJDK环境搭建以与APKTool和signapk整合工具与使用教程Android平台ROM的定制与精简教程Android APK反编译教程Android ROM界面美化定制基础教程第一屏开机动画修改Android ROM定制界面美化基础framework-res、SystemUI修改.