温馨提示:这篇文章已超过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
(图片来源互联网,侵删)
.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文件,可读性降低,但仔细研究一下还是能大概了解的。