从APK文件中获取源代码的方法有哪些?

1471

我的笔记本电脑上的硬盘刚刚崩溃了,我失去了过去两个月一直在开发的应用程序的所有源代码。我手头只有一份存储在邮件中的APK文件,当时是给朋友发送的。

有没有办法从这个APK文件中提取我的源代码呢?


36
FYI 这里有在线反编译检查工具 链接 - edwin
18
这是否意味着我们可以获得价值百万美元的应用程序(如WhatsApp或Facebook)的源代码? 这一切都是开源的吗? - Faizan
6
@Faizan,你听说过ProGuard吗? - Vishwajit Palankar
3
问题的措辞包含了无关的生活故事细节,因此可能会被解释为“推荐一种工具”。然而,答案可能是javac -decompile,这将符合SO准则。在我看来,答案是“离题的”,而不是问题本身。 - SwiftArchitect
2
这篇文章中,他们解释了如何逆向工程Pokemon Go。 - anders
显示剩余9条评论
33个回答

8

根据您的情况,如果您的Android APK:

条件1:未加固(由腾讯乐固/奇虎360等)

选择1:使用在线服务

例如:

使用www.javadecompilers.com

进入:

自动将APK解码为Java源代码

步骤:

上传APK文件+点击运行+等待一段时间+点击下载以获取zip文件+解压缩->

sources/com/{yourCompanyName}/{yourProjectName}

是您期望的Java源代码

选择2:自己反编译/破解

使用相关工具进行反编译/破解:

使用jadx/jadx-guiapk转换为Java源代码

下载jadx-0.9.0.zip然后解压缩到bin/jadx,然后执行以下步骤:

  • 命令行模式:
    • 在终端中运行:jadx-0.9.0/bin/jadx -o output_folder /path_to_your_apk/your_apk_file.apk
    • output_folder将显示解码后的sourcesresources
      • sources/com/{yourCompanyName}/{yourProjectName}是您期望得到的java源代码
  • 图形用户界面模式:
    • 双击运行jadx-0.9.0/bin/jadx-gui(Linux上的jadx-gui.sh/Windows上的jadx-gui.bat
    • 打开apk文件
    • 它会自动解码->查看您期望得到的java源代码
    • 全部保存保存为Gradle项目

例如:

条件2:加固(由腾讯乐固/奇虎360等完成)

主要方法为3个步骤

  1. apk/app转换为dex
  2. dex转换为jar
  3. jar转换为Java源代码

详细解释:

步骤1:apk/app转换为dex

使用工具(FDex2/DumpDex)从运行中的应用程序中转储/钩取出一个或多个dex文件

步骤:

准备环境

从正在运行的应用程序中转储dex

  • 运行FDex2,然后单击您的apk名称以启用稍后捕获/挂钩出dex

  • (在手机/模拟器中) 运行您的应用程序
  • 找到并复制/data/data/com/yourCompanyName/yourProjectName中的整个apk资源
    • 在其根文件夹通常会找到几个dex文件

步骤2:dex转换为jar

使用工具(dex2jar)将(特定的,包含应用程序逻辑的)dex文件转换为jar文件

下载dex2jar,获取dex-tools-2.1-SNAPSHOT.zip,解压缩得到dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh,然后执行以下命令:

sh dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f your_dex_name.dex

例如:

dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.xxx.yyy8825612.dex
dex2jar com.xxx.yyy8825612.dex -> ./com.xxx.yyy8825612-dex2jar.jar

步骤3: jar转Java源代码

使用以下工具之一:

jar 转换为 java src

转换效果: Jadx > Procyon > CRF >> JD-GUI

因此推荐使用:Jadx/jadx-gui

步骤:

  • 双击运行 jadx-gui
  • 打开 dex 文件
  • 文件 -> 全部保存

例如:

导出的Java源代码:


更详细的解释可以查看我的在线电子书中文教程:


8
我个人推荐使用Show Java Android App来获取源代码。您可以从Play商店或从此处下载它。

大多数在线编译器都不能正常工作,但是这个应用程序可以正常工作。谢谢。 - Sunil

8

我无法检索我的Java源代码...它显示了类似于附加文件的东西... - iman kazemayni
在上面的链接中,点击“浏览”选择你的APK文件,然后点击“反编译你的APK”。这个过程需要一些时间,如果代码没有加密,它就会给你源代码。 - M. Usman Khan
你知道Multidex对加密有什么影响吗? - iman kazemayni

6

我将向您展示另一种反编译.apk文件的方法。

您可以按照“prankul garg”的前两个步骤进行操作。因此,您还有其他选择:

第三步:

下载"JD-GUI",这很容易找到。 在"jd-gui.exe"中打开您的.jar文件(文件>打开文件> '找到您的.jar文件')。完成此过程后,您可以将所有资源保存在.zip文件中。

所以,

第一步-您必须将.apk文件重命名为.zip

第二步-您必须解码.dex文件(如果需要,可以将.apk文件解码为dex2jar

第三步-您必须使用JD-GUI解码.jar文件


20
这个答案提供了其他答案没有的内容吗? - Jørgen R
你不需要真的将它重命名为 zip。我可以直接用 7-zip 打开 apk 文件。 - miva2

6

apktool 是一个非常好的工具。

在线apktool服务也存在:http://www.javadecompilers.com/apktool

显然,由于在线服务的本质限制,一些限制是存在的:您可以提取和研究资源和清单文件,但目前无法重新编译应用程序。

尽管如此,这仍然是一种无需麻烦的方法来“打开”Android应用程序。


5

Apktool 是一款用于逆向工程第三方、闭源、二进制 Android 应用程序的工具。

它可以将资源解码为几乎原始形式,并在进行一些修改后重新构建它们。

它使得可以逐步调试 smali 代码成为可能。此外,由于其类似项目的文件结构和某些重复任务的自动化处理(如构建 apk 等),因此使用应用程序变得更加容易。

http://ibotpeaches.github.io/Apktool/


4

一键解决方案(仅适用于Windows)

阅读完这篇长篇大论后,我决定创建一个自动化过程,以一个单击的方式反编译APK文件,

我决定在GitHub上分享它:
https://github.com/shaybc/apk-decompiler

simply unzip,
copy the apk you want to decompile into "apk-source" folder
and run "go.bat"
find the result in the: "apk-output" folder

就是这样,享受吧


4
你可以尝试使用DexPatcher,它甚至与Android Studio集成。 它在内部使用ApktoolDex2Jar
你也可以单独使用这些工具。 Apktool用于反编译apk并提取.dex文件,可以使用Dex2Jar将其转换为.jar文件。可以使用JD-GUI反编译.jar文件中的Java代码。虽然不能保证反编译后的代码与实际代码的相似性,因为市面上有一些高级的代码混淆工具会混淆代码以使其难以被反编译或理解,例如Proguard。

你好,如何在Android Studio中使用DexPatcher? - ravi152
无法在注释中解释所有内容。 谷歌是你的朋友 :) 还有一些不错的YouTube教程。 - Lakshmikant Deshpande

3

Android Studio提供了分析APK文件的功能。

1 - 从构建菜单中选择"分析APK"选项并选择APK文件。 2 - 这将显示classes.dex文件和其他文件。 3 - 点击classes.dex,它会给出文件夹、包、库和文件列表。 4 - 从Android Studio设置中安装一个名为"Dex to Jar"的插件 5 - 从提取的项目中点击任何活动文件,然后从构建菜单中选择dex to jar。

这将使你获得Java文件的实际代码。

干杯。


3

步骤1: 创建一个新文件夹并复制您想要解码的.apk文件。 现在将此.apk文件的扩展名重命名为.zip(例如,从filename.apk重命名为filename.zip)并保存。现在,您可以访问classes.dex文件等。在这个阶段,您能够看到drawable但无法看到xml和java文件,因此请继续。

步骤2: 现在在同一文件夹(或新文件夹)中提取此.zip文件。 下载https://github.com/pxb1988/dex2jar/releases/tag/2.0:dex2jar-2.0 现在打开命令提示符并更改目录到该文件夹(或新文件夹)。然后执行: d2j-dex2jar.bat classes.dex

下载此反编译器http://java-decompiler.github.io/以反编译classes-dex2jar.jar

步骤3: 现在打开另一个新文件夹。 放入您想要解码的.apk文件。

下载最新版本的apktool和apktool(https://ibotpeaches.github.io/Apktool/install/)安装窗口(两者可以从相同的链接下载),并将它们放在同一个文件夹中

打开命令窗口

现在运行类似apktool if framework-res.apk(如果您没有它,请在此处获取)的命令,然后

apktool d myApp.apk(其中myApp.apk表示您要解码的文件名)

现在,在该文件夹中获得一个文件夹,可以轻松读取apk的xml文件。

将两个文件夹的内容复制到一个单独的文件夹中

完成!


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