在APK上反编译.smali文件

136
我下载了一个名为 APK Manager 的工具,它可以帮助我解包 APK 文件。

但它只能解包文件,不能将 .smali 文件反编译成 .java 文件。

有没有可能将 .smali 文件反编译成 .java 文件呢?

6个回答

118

APK Manager并不会解编译 .dex 文件为人类可读的 xml,而是将其转换成 .smali 和二进制 .xml 的形式。

在 APK Manager 4.9 中,操作步骤为:首先选择要处理的包,然后按下 9 进行反编译。如果按下1,那么只会进行解压(仅在需要交换 .png 图像时有用)。

目前没有可用的工具将反编译回 .java 文件,很可能也不会有这样的工具。不过有一种替代方案,就是使用 dex2jar 将 dex 文件转换成 .class 文件,再使用 jar 反编译器(比如免费的 jd-gui)将其转换成纯文本的 java 代码。虽然该过程远非最佳,生成的代码也不能正常工作,但足以让人阅读。

dex2jar: https://github.com/pxb1988/dex2jar

jd-gui: http://jd.benow.ca/

编辑:我知道在 StackOverflow 上有一个非常相似的问题,也有类似的答案……decompiling DEX into Java sourcecode


1
那么如何将编辑后的文件(.java/.class/.smali/.jar)重新打包成apk文件呢?请帮忙。 - Ashok Raj
8
JD-GUI的表现相当不错,但还不够完美。 - Kevin Parker
4
你的意思是APK Manager还是APKTool?我在任何地方都没有找到APK Manager的安装页。然而,像你所说的,APKTool “将.dex文件反编译为.smali和二进制.xml以便于人类阅读的xml”。 - IgorGanapolsky
JD-GUI现在有点过时了。尝试一些命令行工具,如CFR或Krakatau,用于较新版本的Java。 - toster-cx

36

1
这个工具在启动时弹出了Java异常 - fnc12
一个简单的解决方案来处理启动时的 Java异常 是在命令行中使用jdk7运行:java -jar BytecodeViewer x.y.z.jar。为了确保您正在使用jdk7,请检查 java -version 的输出。 - denolk
4
Classyshark并不输出Java代码。引用描述:“它可以可靠地浏览任何Android可执行文件并显示重要信息,如类接口和成员、dex计数和依赖项。” - Jack Miller
Classyshark的正确链接是这个:https://github.com/google/android-classyshark - Mr Washington
1
Classyshark完全不起作用。它显示了所有没有主体的函数。所有函数都显示为function Name() { ... },非常无用。 而BytecodeViewer非常慢,有很多问题无法反编译几个函数,显示“无法反编译”。 我使用JADX的体验更好。它非常快速,具有出色的彩色文本编辑器,良好的搜索功能,虽然它也无法反编译一些函数,但它的工作效果要好得多。 - Elmue

28

dex2jar可以帮助您反编译apk,但不是100%有效。您将在.smali文件上遇到一些问题。Dex2jar无法将其转换为java。我知道有一个应用程序可以反编译您的apk源文件,并且不会出现.smali文件的问题。这是链接 http://www.hensence.com/en/smali2java/


1
请解释一下,为什么我的回答被踩了? - Daryn
8
我不知道其他人为什么要给它点“踩”,但可能是因为该链接提供了一个没有源代码的Windows .exe文件下载。执行这个文件对于任何人来说都会非常不负责任。 - Sky Kelsey
1
谢谢,这刚刚救了我一命!我的电脑在保存过程中崩溃了,我丢失了两个类!但我得到了构建 APK 文件,并避免了重新编写代码。 - RuAware
2
此网站已被Firefox和Windows的Norton/Symantec视为恶意网站。请访问http://search.norton.com/。 - Ravi Parekh
4
下载链接失效。 - Zirui Wang
显示剩余7条评论

3
我的建议是使用Virtuous Ten Studio进行APK反编译。该工具免费,但建议捐赠。它将所有必要的步骤(解包APK、baksmaliing、反编译等)组合成一个易于使用的基于UI的导入过程。在五分钟内,您就可以获得Java源代码,比上述工具中任何一个命令行选项更容易理解。
将smali反编译为Java是一个不精确的过程,特别是如果smali构件经过混淆器处理。您可以在网上找到几个反编译器,但只有一些仍在维护。其中一些会给您比其他人更好的反编译代码。"更好"指的是比其他反编译器更易于理解。不要期望反向工程的Java代码可以直接编译。 Virtuous Ten Studio带有多个免费的Java反编译器,因此您可以轻松尝试不同的反编译器(“生成Java源”步骤)以查看哪个提供最佳结果,节省了您找到这些反编译器并学习如何使用它们的时间。其中之一是CFR,它是少数几个免费且仍在维护的反编译器之一。
作为输出,您将收到包含所有反编译Java源代码的文件夹结构等内容。然后,您可以将其导入IntelliJ IDEA或Eclipse进行进一步编辑、分析(例如,转到定义、查找用法)等操作。

Christoph,Virtuous Ten Studio支持在smali中进行方法/类重构吗? - Dennis L
10
请问您与Virtuous的关系是什么? - Allison
1
Virtuous 无法正确地将 Smali 转换为 Java。它会出现错误,指出应该自动生成的 .java 文件未找到。浪费时间。 - Buddy
@Sirens:我与Virtuous没有任何关联。我只是碰巧使用了他们的工具,并发现它非常有用。我还更新了我的答案,提供了更多反编译方面的信息。 - Christoph
@Dennis:是的,可以。然后你只需按一下按钮就可以创建一个更新的APK。 - Christoph
显示剩余3条评论

1
我赞成这个观点。
Dex2jar将生成一个工作中的jar文件,您可以将其添加为项目源,并使用apktool获取的xml文件。
但是,JDGUI生成的.java文件往往会有错误。
我想这与代码混淆有关。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接