视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Android反编译教程
2025-09-29 09:08:21 责编:小OO
文档
息,但实在是不好读啊~~~~

二、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文件,可读性降低了,但仔细研究也能看出大概。下载本文

显示全文
专题