前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

反编译APK文件的三种方法 - Android开发教程 首页/购机行情/连锁加盟/网购/小游戏/数码/游戏库/Hi科技/下载/中文游戏/游戏专题/论坛/巴士游戏 PSP|PSV|NDS|3DS|PS3|PS4|X360|XONE|WiiU|安卓|iPhone5|苹果|iPad|腾讯游戏|网游|单机|页游|手游 您现在的位置: 安卓中文网 >> Android开发教程 >> 开发教程 >> 正文 反编译APK文件的三种方法 2011-3-18 9:24:15来源:Android中文网我有话说 因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个... ps:对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。 一、dexdump方法 dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中: D:\Program Files\android-sdk-windows-1.6_r1\platforms\android-1.6\tools>dexdump.exe -d classes.dex > spk.dump.txt 得到的文件内容,描述了类的信息,但实在是不好读啊~~~~ 二、dex2jar + XJad 方法 该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如: 1、dex2jar.bat d:\play\classes.dex 默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar 2、使用XJad反编译该jar包 之后的使用方法,大家都懂的:) 该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。 三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法 这个方法就强大了,AXMLPrinter2是还原AndroidManifest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。 baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具 操作方式如下: 1、java -jar AXMLPrinter2.jar D:\play\AndroidManifest.xml > AndroidManifest.txt 2、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml > main.txt 3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dex baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段: view plaincopy to clipboardprint?.class Lcom/paul/test/a; .super Landroid/view/View; # static fields .field private static final a:Landroid/graphics/Typeface; # instance fields .field private b:I .field private c:I .field private d:Z .field private e:J .field private f:I .field private l:[Ljava/lang/String; # direct methods .method static constructor <clinit>()V .registers 2 sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface; const/4 v1, 0x0 invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; move-result-object v0 sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface; return-void .end method # # other methods .......... # # virtual methods .method public onKeyUp(ILandroid/view/KeyEvent;)Z .registers 4 const/16 v0, 0x42 if-eq p1, v0, :cond_8 const/16 v0, 0x17 if-ne p1, v0, :cond_b :cond_8 invoke-direct {p0}, Lcom/paul/test/a;->d()V :cond_b const/4 v0, 0x0 invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z move-result v0 return v0 .end method .class Lcom/paul/test/a;.super Landroid/view/View; # static fields.field private static final a:Landroid/graphics/Typeface; # instance fields.field private b:I.field private c:I.field private d:Z.field private e:J.field private f:I.field private l:[Ljava/lang/String; # direct methods.method static constructor <clinit>()V .registers 2 sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface; const/4 v1, 0x0 invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; move-result-object v0 sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface; return-void.end method## other methods ..........## virtual methods.method public onKeyUp(ILandroid/view/KeyEvent;)Z .registers 4 const/16 v0, 0x42 if-eq p1, v0, :cond_8 const/16 v0, 0x17 if-ne p1, v0, :cond_b :cond_8 invoke-direct {p0}, Lcom/paul/test/a;->d()V :cond_b const/4 v0, 0x0 invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z move-result v0 return v0.end method 认真一看,就知道: # static fields 定义静态变量的标记 # instance fields 定义实例变量的标记 # direct methods 定义静态方法的标记 # virtual methods 定义非静态方法的标记 以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程: :cond_8 invoke-direct {p0}, Lcom/paul/test/a;->d()V 调用com.paul.test.a的d()方法 不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程: :cond_b const/4 v0, 0x0 invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z move-result v0 大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法 最后 return v0 该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。 --> (编辑: kezz ) HTC One X S720e手机信号设置方法HTC ONE X如何限制后台运行程序数量小技巧 强制你的Android手机检查系统更新安卓智能手机如何备份手机里的文件提高GPRS手机上网速度的小技巧手机电子书解决乱码问题的最佳方法Android安卓手机进入系统的工程模式方法安卓手机GPS导航模块设置教程安卓手机新手教程之如何修改手机语言新手须知 安卓手机如何进行上网设置 androidAndroid 4.1推送android sdk 4.1android 手机推送android 推送lg nexus 4售价google nexus 手机金山毒霸2012猎豹e960sw金山手机毒霸 您可以使用“← | →”键快速翻页,或者进入全文阅读模式! 事件进展: 分享到: 观后感: 相关文章: 热门新闻排行本周本月 7寸/2K屏幕/3GB运存 盘点智能手机圈N宗最 (14153) 每周二12点 小米3/红米/移动电源官网再抢购 (8052) 别以为只有红米 市售各价位最超值手机推荐 (6450) 移动联通三个版本 华为荣耀3C官网京东抢购 (5982) 买的就是性价比!千元级国产安卓手机精选 (5350) 超值八核 荣耀3X华为官网易迅商城10点抢购 (3622) 新增49元新电源 小米3/电视/红米官网再抢购 (3291) 黄章:删魅族微博撤论坛首页全都是我干的! (3181) 魅族MX3仅需1799? 十款冰点价格手机盘点 (3080) 小米3电信版来啦!小米3电信版25日正式发售 (2030) 你中枪了吗? 盘点十大最危险手机使用方法 (18271) 春节特供专场 小米/红米/盒子12点官网抢购 (16291) 2014新年马上换新机 年终超值热门手机推荐 (16280) 7寸/2K屏幕/3GB运存 盘点智能手机圈N宗最 (14153) 荣耀3C超越红米! 本周淘宝手机销量排行榜 (12691) 能买到就是赚了 节前高人气遭疯抢手机盘点 (10883) 明12点!小米3/红米/移动电源官网开启抢购 (10662) 每周二12点 小米3/红米/移动电源官网再抢购 (8052) 三个版本 华为荣耀3C官网京东重新开启预约 (7570) 2GB联通版首发 华为荣耀3C官网京东再抢购 (7371) 巴士图库 --> 关于我们 广告投放 联系我们 网站地图 友情链接 诚聘英才 版权声明 WAP手机版 皖ICP备12012248号-15 ICP:皖B2-20130011 皖公网安备34020302200005 Copyright 2004-2014 TGBUS Corporation, All Rights Reserved