怎么反编译APK文件 - 已回答 - 搜搜问问 新闻 网页 音乐 图片 视频 地图 问问 购物 百科 更多» 登录 搜搜问问 问问首页 问题库 知识频道 用户频道 问问活动 圈子 问问团队 专家频道 问问商城 电脑/数码生活家居QQ专区游戏奥运体育娱乐/明星休闲/爱好艺术/文学社会/人文教育/科学健康/医疗商业/理财情感/家庭地区问题 匿名 |分类:软件 2011-12-15 怎么反编译APK文件 我来回答 匿名 回答(2) 生生世世爱/? 1级 2011-12-15 下载模拟器 评论(0) 0 0 发表评论 叶落清扬 7级 2011-12-15 一、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 ()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 ()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文件,可读性降低了,但仔细研究也能看出大概。 评论(0) 0 0 发表评论 Top 帮助 提意见 ©2014 SOGOU - 京ICP证050897号 关闭 在上方输入您感兴趣的知识,点击搜索答案后,下方将出现您感兴趣的问题列表。 --> 关闭 在上方输入您感兴趣的知识,点击搜索答案后,下方将出现您感兴趣的问题列表。 进入任一您感兴趣的问题查看,点选其满意答案处的4个评价按钮之一,即可完成对该满意答案的评价。 -->