问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么反编译apk

发布网友 发布时间:2022-05-29 19:56

我来回答

1个回答

热心网友 时间:2023-11-17 20:21

一、dexmp方法

dexmp是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件mp到txt文件中:

D:\Program
Files\android-sdk-windows-1.6_r1\platforms\android-1.6\tools>dexmp.exe -d
classes.dex > spk.mp.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文件,可读性降低了,但仔细研究也能看出大概。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
挖矿笔记本电脑一般什么配置 ...全五分截图就可以返现两元,可是我截图了发了好评,他们就问我支付宝... 桂林数之城澜庭值得买吗? 华联都市澜庭可以买吗 云荟澜庭可以买吗 海和澜庭值得买吗 澜庭雅致能买吗 仿"瞧"写四个与"看"有关的词 用目旁表示眼的器官的字有那些 用瞅,瞧,盯,瞪,眺,瞥填空。你不要一直怎么着我,我又没做错事 淘宝上哪些品牌的普洱茶口碑比较好呀? 陶瓷用什么刀具加工 陶瓷零件公差国家标准是什么? 车石英陶瓷工件用什么材质刀具j加工 含有“雀”“鹊”的成语、俗语、诗文 CNC加工陶瓷件用什么刀具 俗语说早报喜晚报财,正晌报客来,讲的哪种动物? 车削陶瓷合金工件用什么刀具?刀具角度如何选择? 陶瓷材料作为一种难加工材料,进行机械加工时候要注意哪些问题 用车床能加工陶瓷吗 给出已知角和线段如何作等腰三角形?请附带图和过程! 陶瓷零件用什么刀具加工 陶瓷零件用什么刀具加工? 四年级关于角与线的手抄报 处理陶瓷工件应用什么砂料? 陶瓷可以车削加工吗? 角和线段均是轴对称图形,其对称轴是()是中垂线嘛?还是? 角和线段是属于中心对称图形还是轴对称图形?抑或两者都是? 国内玉米淀粉需求旺盛,那价格能“飞”多高 角和线段 有没有不需要java环境,可以直接反编译apk文件的软件啊?就是一个软件本身包含了所有需要的东西, 八月份在经济上能够脱离困境的星座有哪些? 经济因素决定食品的发展 某企业8月发生下列经济业务,要求编制会计分录: 会计基础题目:某公司八月份发生以下经济业务:(1)支付上月电费10000元 8月中国经济走向? 2011年9月10日,国家统计局公布8月份国民经济主要指标数据,其中居民消费价格指数(CPI)同比上涨6.2%。引 12年8月份经济危机能好转吗 新浪地产讯 国家统计局今日上午10时发布8月份国民经济主要指标数据,其中8月份居民消费价格同比上涨3.5%, 根据某工厂8月份发生的经济业务编制会计分录 美国疫情严重8月份会导致再次经济停产吗? 2011年8月份发生下列经济业务: 考研8月份开始 考带数学的 经济学 就考研复习规划 小学《呵护生命,平安成长》读后感 会计学原理作业 2011年8月份发生下列经济业务: 观《呵护生命,平安成长》有感。400字 雷柏mt550电池怎么取出 呵护生命作文 雷柏N18和双飞燕OP-550鼠标哪个好? NOPPOO 巧克力 白色全键无冲 参考价格550 雷柏V5 黑色 6键无冲 带手托 参考价格560 谁给推荐一下