admin 管理员组

文章数量: 1184232


2024年3月22日发(作者:idea官网是什么)

息,但实在是不好读啊~~~~

二、dex2jar + XJad 方法

该方法是使用包,将文件解包成jar,在通过XJad(或者其他class反编译工具)进

行java反编译。如:

1、 d:

默认的输出路径同,生成的文件名为

2、使用XJad反编译该jar包

之后的使用方法,大家都懂的:)

该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时

的java文件,而开发时使用的lib包不能反编译出来。

三、 + + 方法

这个方法就强大了,AXMLPrinter2是还原和的工具,直接打开这两个

xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加

的密)。

是反解析dex的工具,则是再还原成dex的工具

操作方式如下:

1、java -jar D: >

2、java -jar D: >

3、java -jar -o classout/ d:

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

调用.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

大概意思就是调用.a的setPressed方法,然后再调用父类View的onKeyUp方法

最后 return v0

该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不

是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。


本文标签: 反编译 解析 文件 使用 定义