apk反编译(apk反编译/回编译)

admin

温馨提示:这篇文章已超过493天没有更新,请注意相关的内容是否还可用!

什么是反编译apk

第一:使用apktool直接反编译apk

二:apk中包含的内容

第三:进入hellodemo\smali\com\example\hello并打开MainActivity.smali。到场:

const-string v1, '\u4f60\u597d',

变成:

const-string v1, '你好',

第四:然后在命令行输入:apktool b hellodemo hellodemo1.apk。这次重新打包成hellodemo1.apk。

第五:然后对新生成的apk进行签名。将此apk复制到autosign目录下,然后切换到那里,在命令行输入:java -jar signapk.jar testkey.x509.pem testkey.pk8 hellodemo1.apk hellodemo.apk。

第六:将生成的hellodemo.apk安装到手机上。可以看到主界面显示的是hello,而不是hello。则说明反编译重新打包成功!

如何更改apk?反编译Android系统ui失败怎么办?

可能有错误。如果您尝试使用apktool 并使用命令行进行编译,您可以看到错误所在。然后看看如何解决

因为反编译失败,所以只有smali文件夹。

1.反编译Apk得到Java源代码

首先需要下载两个工具:dex2jar和JD-GUI

前者将apk中的classes.dex转换为Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。

2、反编译apk生成程序的源代码及图片、XML配置、语言资源等文件

1.可能出现的操作问题。您可以重新启动手机或电脑。

2、可能是内存不足,无法接收新信息。您可以使用软件来清理垃圾并释放内存。

3.下载的软件可能已损坏。您可以卸载原来的软件,然后重新下载并安装。

4. 日期或时间可能有误。您可以检查日期和时间以查看是否正确。如果日期和时间不正确,将会出现网络错误。

5、也有可能是软件的服务器出现了问题,只需等待一段时间就可以恢复。

apk反编译/反编译

再次记录一下apk反编译/重编译过程。如果链接失效,请留言,我们会及时更新。

参考博客: https://blog.csdn.net/w327918069/article/details/82761437

首先,我们需要一个apk。下图是Android Studio编写并打包的apk。

其实apk相当于一个zip压缩包,可以通过WinRar工具解压,像这个:

这时候就用我们的神器----apktool,当当当~~~~~~~。一行命令反编译apk : apktool d -r app-debug.apk 一定要加上参数-r,否则编译后会报错。

至此apk反编译结束。

反编译就是将apk反编译生成的目录文件转换为apk。非常简单的一行命令: apktool b app-debug

此时安装apk到手机上是无法安装成功的,需要对apk进行签名才可以安装。

1.生成key.keystore keytool -genkey -alias key.keystore -keyalg RSA -validity 30000 -keystore key.keystore

可以看到key.keystore已经生成了。

2. 对apk 进行签名。它可以用于未签名和已签名的apk,并重新签名。

jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkin] [别名]

命令格式及参数含义:

-verbose - 输出签名过程的详细信息

-keystore [keystorePath] - 密钥库的位置

-signedjar [apkOut] - 签名的输出文件名

[apkin] - 待签名的文件名

[alias] - 证书别名jarsigner -verbose -keystore key.keystore -signedjar app-debug_signed.apk app-debug.apk key.keystore

编译完成。

如何反编译apk

1.dexdump方法

dexdump是模拟器提供的查看dex文件的工具。您可以使用与此类似的命令将dex 文件转储到txt 文件中:

D:\程序

文件\android-sdk-windows-1.6_r1latforms\android-1.6\toolsdexdump.exe -d

类.dex spk.dump.txt

获取到的文件内容描述了类信息,但是真的很难读~~~~

2.dex2jar+XJad方法

这种方法是使用dex2jar.jar包,将classes.dex文件解压成jar,然后使用XJad(或者其他类反编译工具)来反编译Java。喜欢:

1. dex2jar.bat d:lay\classes.dex

默认输出路径与classes.dex相同,生成的文件名为classes.dex.dex2jar.jar

2.使用XJad反编译jar包

以后大家就知道怎么用了:)

这种方法的好处是,通过XJad反编译后,可以直接打开java源文件。缺点是只能反编译开发时使用的java文件,无法反编译开发时使用的lib包。

3.AXMLPrinter2.jar + baksmali.jar + smali.jar方法

这个方法很强大。 AXMLPrinter2是一个用于恢复AndroidManifest.xml和main.xml的工具。直接打开这两个xml文件是乱码,但是恢复后可以清晰地看到里面的内容(我猜字符还是用异或的方法加密的)。

baksmali.jar是反解析dex的工具,smali.jar是恢复dex的工具。

它的工作原理如下:

1. java -jar AXMLPrinter2.jar

D:lay\AndroidManifest.xml AndroidManifest.txt

2. java -jar AXMLPrinter2.jar

D:lay\res\layout\main.xml main.txt

3. java -jar baksmali-1.2.5.jar -o classout/

d:lay\classes.dex

baksmali可以解析(注意,是解析,不是反编译)原始java包和引用的lib包。解析出来的文件仔细看还是能看懂的,比如下面的片段:

查看纯文本复制到剪贴板打印?班级

Lcom/保罗/测试/a;

.super Landroid/视图/视图;

# 静态字段

.field 私有静态最终a:Landroid/graphics/Typeface;

#

实例字段

.field 私人b:I

.field 私人c:I。场地

私人d:Z

.field私人e:J

.field私人f:I。场地

私人l:[Ljava/lang/字符串;

# 直接方法

.方法静态

构造函数()V

.寄存器2

sget-对象v0,

Landroid/图形/字体;-SANS_SERIF:Landroid/图形/字体;

常量/4 v1,0x0

调用静态{v0, v1},

Landroid/graphics/Typeface;-create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;

移动结果对象v0

sput-对象v0,

Lcom/wiyun/ad/a;-a:Landroid/graphics/Typeface;

返回无效

.end方法

#

# 其他方法.

#

虚拟的

方法

.method public onKeyUp(ILandroid/view/KeyEvent;)Z

.寄存器4

常量/16 v0,0x42

if-eq p1, v0,cond_8

常量/16 v0,0x17

if-ne p1, v0,cond_b

:cond_8

调用直接{p0},Lcom/paul/test/a;-d()V

:cond_b

常量/4 v0,0x0

调用虚拟{p0,v0},

Lcom/paul/test/a;-setPressed(Z)V

调用超级{p0, p1, p2},

Landroid/view/View;-onKeyUp(ILandroid/view/KeyEvent;)Z

移动结果

v0

返回v0

.end方法

.class Lcom/paul/test/a;极好的

Landroid/视图/视图;

# 静态字段

.field 私有静态最终

a:Landroid/图形/字体;

# 实例字段

.field 私人b:I。场地

私人c:I

.field 私人d:Z

.field私人e:J

.field 私有

f:I

apk反编译(apk反编译/回编译)

(图片来源互联网,侵删)

.field 私有l:[Ljava/lang/String;

# 直接方法

.method 静态构造函数

()V

.寄存器2

sget-对象v0,

Landroid/图形/字体;-SANS_SERIF:Landroid/图形/字体;

常量/4 v1,0x0

调用静态{v0, v1},

Landroid/graphics/Typeface;-create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;

移动结果对象v0

sput-对象v0,

Lcom/wiyun/ad/a;-a:Landroid/graphics/Typeface;

返回无效。结尾

方法

#

# 其他方法.

#

# 虚拟方法。方法

公共onKeyUp(ILandroid/view/KeyEvent;)Z

.寄存器4

常量/16

v0,0x42

if-eq p1, v0,cond_8

常量/16 v0,0x17

如果-ne p1,

v0、cond_b

:cond_8

直接调用{p0},

Lcom/paul/test/a;-d()V

:cond_b

常量/4 v0,0x0

调用虚拟{p0, v0}, Lcom/paul/test/a;-setPressed(Z)V

调用超级{p0, p1, p2},

Landroid/view/View;-onKeyUp(ILandroid/view/KeyEvent;)Z

移动结果

v0

返回v0

.end方法

如果你仔细看,你就会知道:

# 定义静态变量的静态字段标签

# 定义实例变量的实例字段标签

# 定义静态方法的直接方法标签

# 虚拟方法定义非静态方法的标记

以onKeyUp方法为例,定义了处理逻辑,if-eq p1, v0,cond_8

表示如果p1和v0相等,则执行cond_8的过程:

:cond_8

直接调用{p0},

Lcom/paul/test/a;-d()V

调用com.paul.test.a的d()方法

不等于:if-ne p1,v0,cond_b则执行cond_b的过程:

:cond_b

常量/4 v0,0x0

调用虚拟{p0,v0},

Lcom/paul/test/a;-setPressed(Z)V

调用超级{p0, p1, p2},

Landroid/view/View;-onKeyUp(ILandroid/view/KeyEvent;)Z

移动结果v0

大致意思就是调用com.paul.test.a的setPressed方法,然后调用父类View的onKeyUp方法

最后返回v0

该方法还可以解析出外部引用的lib包类并打开完整包。缺点是解析出来的smali文件不是反编译后的java文件,可读性降低,但仔细研究一下还是能大概了解的。

版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com

目录[+]

取消
微信二维码
微信二维码
支付宝二维码