我笔记本电脑上的硬盘刚刚崩溃,我丢失了过去两个月一直在开发的应用程序的所有源代码。我所拥有的只是我将其发送给朋友时存储在我的电子邮件中的 APK 文件。
有没有办法从这个APK文件中提取我的源代码?
我笔记本电脑上的硬盘刚刚崩溃,我丢失了过去两个月一直在开发的应用程序的所有源代码。我所拥有的只是我将其发送给朋友时存储在我的电子邮件中的 APK 文件。
有没有办法从这个APK文件中提取我的源代码?
简单的方法:使用在线工具https://www.decompiler.com/,上传 apk 并获取源代码。
解码 .apk 文件的程序,分步方法:
创建一个新文件夹并复制要解码的 .apk 文件。
现在将此.apk 文件的扩展名重命名为.zip(例如,从filename.apk 重命名为filename.zip)并保存。现在您可以访问 classes.dex 文件等。在这个阶段您可以看到 drawables 但看不到 xml 和 java 文件,所以继续。
现在将这个 .zip 文件解压到同一个文件夹(或 NEW FOLDER)中。
下载 dex2jar并将其解压缩到同一文件夹(或 NEW FOLDER)。
将 classes.dex 文件移动到 dex2jar 文件夹中。
现在打开命令提示符并将目录更改为该文件夹(或 NEW FOLDER)。然后写入d2j-dex2jar classes.dex
(对于 mac 终端或 ubuntu 写入./d2j-dex2jar.sh classes.dex
)并按回车键。您现在在同一文件夹中拥有 classes.dex.dex2jar 文件。
下载java反编译器,双击jd-gui,点击打开文件,然后从那个文件夹打开classes.dex.dex2jar文件:现在你得到了类文件。
通过 src 名称保存所有这些类文件(在 jd-gui 中,单击 File -> Save All Sources)。在这个阶段,您获得了 java 源代码,但 .xml 文件仍然无法读取,因此请继续。
现在打开另一个新文件夹
放入要解码的 .apk 文件
下载最新版本的apktool和apktool 安装窗口(都可以从同一个链接下载)并将它们放在同一个文件夹中
打开命令窗口
现在运行命令apktool if framework-res.apk
(如果你没有它在这里得到它)和下一个
apktool d myApp.apk
(其中 myApp.apk 表示您要解码的文件名)
现在您在该文件夹中获得了一个文件夹,并且可以轻松读取 apk 的 xml 文件。
这不是任何步骤,只需将两个文件夹(在本例中为两个新文件夹)的内容复制到单个文件夹
并享受源代码...
这是另一种描述——以防万一有人被上面的描述卡住了。按照步骤:
apktool.bat
(或apktool
用于 Linux)并apktool_<version>.jar
从 http://ibotpeaches.github.io/Apktool/install/ apktool.jar
并将两个文件放在同一个文件夹中cmd.exe
)并切换到该文件夹;验证是否安装了 Java 环境(对于 Linux,请检查有关所需库的说明)apktool decode [apk file]
中间结果:资源文件,AndroidManifest.xml
中间结果:classes.dex
dex2jar-0.0.9.15.zip
从http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=下载并解压classes.dex
到dex2jar.bat
(或<path_to>\dex2jar.bat classes.dex
在 DOS 框中输入;供 Linux 使用dex2jar.sh
)
中间结果:classes_dex2jar.jar
classes_dex2jar.jar
(根据使用的反编译器可能是可选的)结果:源代码
注意:不允许反编译第三方包;本指南旨在仅从 APK 文件中恢复个人源代码;最后,生成的代码很可能会被混淆
虽然您可能能够反编译您的APK
文件,但您可能会遇到一个大问题:
它不会返回您编写的代码。相反,它将返回编译器内联的任何内容,变量给定随机名称,函数给定随机名称。尝试反编译并将其还原为您拥有的代码可能需要比重新开始更多的时间。
可悲的是,这样的事情已经扼杀了许多项目。
对于未来,我强烈建议学习版本控制系统,如CVS、SVN和git等。
以及如何备份它。
Play Store上还有一个新应用程序,可以使用它反编译 apk(系统应用程序)并直接在智能手机上查看源代码。它将文件保存到您的 SD 卡,因此您也可以在计算机上查看它。它不需要root或其他东西。
只需安装并玩得开心。我认为这是反编译应用程序的最简单方法。
apktool是您可以尝试的最好的东西。我已经用它保存了一些 xml,但老实说,我不知道它如何与 .java 代码一起使用。
即使您是唯一的编码员,我也会建议您拥有一个代码存储库。我一直在为自己的项目使用Project Locker 。它为您提供免费的 svn 和 git repos。
这两篇文章描述了如何结合使用apktool
和dex2jar
获取一个APK
文件并创建一个可以构建和运行它的 Eclipse 项目。
http://blog.inyourbits.com/2012/11/extending-existing-android-applications.html
http://blog.inyourbits.com/2012/12/extending-existing-android-applications.html
基本上你:
apktool
从 apk 中获取资源文件dex2jar
获取 jar 文件,其中包含 Eclipse 喜欢的格式的类。JDGui
查看源代码JDGui
,将其粘贴到 Eclipse 中的一个类中并对其进行修改apktool 将工作。您甚至不需要知道密钥库即可提取源代码(这有点吓人)。主要缺点是源代码以 Smali 格式而不是 Java 格式呈现。其他文件,如 icon 和 main.xml 都可以正常运行,至少值得您花时间恢复这些文件。最终,您很可能需要从头开始重新编写 Java 代码。
你可以在这里找到 apktool 。只需下载 apktool 和适当的帮助程序(适用于 Windows、Linux 或 Mac OS)。我建议使用 7-zip 之类的工具来解压它们。
有几种方法可以做到这一点:
使用 Android Studio 3.0 中的“配置文件或调试 APK”功能。
它允许您在 Android Studio 中打开和探索 APK。类被反编译成 smali。资源不会被提取,如果没有源代码(android studio 3.0 canary 9),诸如“转到定义”、“查找所有引用”和调试之类的东西就无法工作。一些额外的 smali 功能可能适用于smalidea。
使用jadx。
Jadx 将给定 APK 中的代码反编译为 java 源文件。
使用apktool。
Apktool 是一个命令行工具,它为给定的 apk 提取资源并将代码反编译为 smali。您也可以使用 apktool 重新编译。这是它的一个例子:
$ apktool d test.apk
I: Using Apktool 2.2.4 on test.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
$ apktool b test
I: Using Apktool 2.2.4 on test
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
I: Copying unknown files/dir...
可能是很容易看到来源的:
在 Android Studio 2.3 中,Build -> Analyze APK -> Select the apk that you want to decompile
.
你会看到它的源代码。
参考链接:
https ://medium.com/google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2
该站点https://www.apkdecompilers.com/自动完成。
我首先尝试了接受的答案中提到的网站,但这对我不起作用。
我个人推荐Show Java Android App来获取源代码。您可以从 Play 商店或从此处下载
在线工具下方:
http://www.javadecompilers.com/apk
一键完成所有操作:反编译的.java 文件 + 资源 + xml(在一个 .zip 文件中)具有非常好的反编译器(jadx 在其他编译返回函数内部的注释的地方/函数中返回 java 代码,例如“无法反编译”或一些android 汇编程序/机器代码)
我将向您展示反编译.apk文件的其他方法。
您可以按照“ prankul garg ”中的前两个步骤进行操作。所以你还有另一个机会:
步骤 3':
下载“JD-GUI”,很容易找到这个。在“jd-gui.exe”中打开您的.jar文件。(文件 > 打开文件 > '找到你的.jar文件')。完成此过程后,您可以将所有资源保存在.zip文件中。
所以,
1st - 您必须将.apk文件重命名为.zip
第二 - 您必须解码.dex文件(如果需要,将.apk文件解码为dex2jar,这是可能的)
3rd - 您必须使用JD-GUI解码.jar文件
根据您的情况,如果您的 android apk:
如:
去:
从 apk 自动解码到 java 源代码
脚步:
upload
apk 文件 + 单击Run
+ 等待一段时间 + 单击Download
以获取 zip + 解压缩 ->
sources/com/{yourCompanyName}/{yourProjectName}
是你预期的java源代码
使用相关工具自行反编译/破解:
jadx
/jadx-gui
转换apk
为java sourcecode
下载jadx-0.9.0.zip然后解压到 got bin/jadx
,然后:
jadx-0.9.0/bin/jadx -o output_folder /path_to_your_apk/your_apk_file.apk
sources
和resources
sources/com/{yourCompanyName}/{yourProjectName}
是你的预期java sourcecode
jadx-0.9.0/bin/jadx-gui
(Linux's jadx-gui.sh
/ Windows's jadx-gui.bat
)apk
文件save all
或者save as Gradle project
例如:
主要方法3 steps
:
apk/app to dex
dex to jar
jar to java src
详细解释:
apk/app to dex
使用工具(FDex2
/DumpDex)dex
从正在运行的应用程序中转储/挂钩(一个或多个)文件
脚步:
root
编辑机器人
FDex2
/ DumpDex安装到 XPosed 并启用它
dex
从正在运行的应用程序中转出运行FDex2
然后单击您的 apk 名称以启用以后捕获/挂钩 dex
/data/data/com/yourCompanyName/yourProjectName
dex
文件dex to 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
jar to java src
使用其中一种工具:
转换jar
为java src
对于从 jar 到 java src 的转换效果:
Jadx
> Procyon
> CRF
>>JD-GUI
所以推荐使用:Jadx
/jadx-gui
脚步:
jadx-gui
dex
文件File
->save all
例如:
导出的 java src:
更详细的解释可以看我的在线电子书中文教程:
Apktool用于逆向工程第 3 方、封闭、二进制 Android 应用程序。
它可以将资源解码为几乎原始的形式,并在进行一些修改后重建它们。
它使逐步调试 smali 代码成为可能。此外,由于类似项目的文件结构和一些重复性任务(如构建 apk 等)的自动化,它还使使用应用程序变得更容易。
apktool是要走的路。在线 apktool 服务也存在:http ://www.javadecompilers.com/apktool
显然,由于服务“在线性质”而存在一些限制:您可以提取和研究资产和清单文件,但目前无法重新编译应用程序。
尽管如此,这仍然是一种“打开”安卓应用程序的便捷方式。
Android Studio 让您可以分析任何 apk 文件。
1 - 从构建菜单中选择分析 apk 选项并选择 apk 文件。2 - 这将为您生成 classes.dex 文件和其他文件。3 - 单击 classes.dex,它将为您提供文件夹、包、库和文件的列表。4 - 从和 android studio 设置安装一个名为“Dex to Jar”的插件 5 - 单击提取项目的任何活动文件,然后从构建菜单中选择 dex to jar。
这将为您生成 java 文件的实际代码。
干杯。
第 1 步:创建一个新文件夹并复制要解码的 .apk 文件。
现在将此.apk 文件的扩展名重命名为.zip(例如,从filename.apk 重命名为filename.zip)并保存。现在您可以访问 classes.dex 文件等。在这个阶段您可以看到 drawables 但看不到 xml 和 java 文件,所以继续。
第 2 步:现在将这个 .zip 文件解压缩到同一文件夹(或 NEW FOLDER)中。
下载https://github.com/pxb1988/dex2jar/releases/tag/2.0:dex2jar-2.0 _
现在打开命令提示符并将目录更改为该文件夹(或 NEW FOLDER)。然后执行:
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 文件。
将两个文件夹的内容复制到一个文件夹
完毕 !
最简单的方法是使用 Apk OneClick Decompiler。这是一个反编译和反汇编 APK(android 包)的工具包。
特征
要求
必须安装 Java 运行时环境 (JRE)。
您可以从此链接下载它Apk OneClick Decompiler
享受那个。
我发现以下是最简单的方法:
有一个应用程序,通常只需点击几下即可完成。 https://github.com/Nuvolect/DeepDive-Android
之后,您可以浏览源代码,使用 elFinder 将其下载到另一台计算机或使用 Lucene 搜索。
除了 Jadx,它还有 CFR 和 Fernflower 反编译器。
1. 从原生 Android 应用程序中提取源代码
原生 Android 应用程序的源代码并不难获得,但它确实需要与 Windows、Mac 和 Linux 兼容的额外工具。我个人最喜欢的工具是dex2jar和JD-GUI。
如果您不熟悉这些工具,dex2jar 将读取 Dalvik 可执行文件并将它们转换为标准 JAR 格式。JD-GUI 将读取 JAR 文件并反编译其中找到的类文件。
为了使提取过程更容易理解,让我们从创建一个全新的原生 Android 项目开始:
android create project --target 19 --name TestProject --path . --activity TestProjectActivity --package com.nraboy.testproject
上述命令将在您当前的命令提示符路径中留下一个 Android 项目。
由于我们的项目已经包含一个 Activity 类,让我们直接进入构建过程。你可以让我整天为使用 Ant 而不是 Gradle 或 Maven 而烦恼,但对于本教程,我将坚持使用它。
ant debug
上述命令将创建一个通常位于bin/TestProject-debug.apk的调试版本。
使用您最喜欢的解压缩工具,解压缩 APK 文件。7-zip 是一种流行的工具,但如果您使用的是 Mac,您可以从终端运行以下命令:
unzip TestProject-debug.apk
这会给我们留下一堆文件和文件夹,但其中一个对我们很重要。记下 classes.dex,因为它包含我们所有的源代码。要将其转换为可读的内容,我们需要在其上运行 dex2jar。您可以在 Mac、Linux 和 Windows 上使用 dex2jar,但我将从 Mac 的角度进行解释。
使用解压后的dex2jar目录中的classes.dex文件,从终端运行以下命令:
./dex2jar.sh classes.dex
打开您下载的 JD-GUI 应用程序,因为现在是解码 JAR 和打包类文件的时候了。打开新创建的classes_dex2jar.jar文件,您应该会看到如下内容:
看看获取原生 Android APK 的源代码是多么容易?现在你能做些什么来更好地保护自己?
Android SDK 附带Proguard,这是一个混淆模块。你问什么是混淆?
通过维基百科混淆:
混淆(或混淆)是在交流中隐藏预期意义,使交流变得混乱、故意模棱两可且难以解释。
虽然混淆不会加密您的源代码,但它会使其更难理解。配置 Proguard 后,在发布模式下运行 Ant,您的代码应该在构建时被混淆。
2. 从混合 Android 应用程序中提取源代码
混合应用程序的源代码是迄今为止最容易提取的。您不需要在计算机上安装任何额外的软件,只需访问 APK 文件即可。
为了让事情更容易理解,让我们首先创建一个新的 Apache Cordova 项目,然后将其解压缩。首先执行以下操作:
cordova create TestProject com.example.testproject TestProject
cd TestProject
cordova platform add android
在项目创建过程中,您将使用默认的 Apache Cordova CSS、HTML 和 JavaScript 模板。在这个例子中,这对我们来说很好。让我们继续将我们的项目构建成一个分布式 APK 文件:
cordova build android
您将留下platforms/android/ant-build/CordovaApp-debug.apk 或类似platforms/android/ant-build/*-debug.apk 的东西。
即使这是一个调试版本,它仍然非常有用。安装7-zip或类似文件后,右键单击 APK 文件并选择解压缩或解压缩。在提取的目录中,您现在应该可以访问所有基于 Web 的源文件。我说基于 Web 是因为 Apache Cordova 使用的任何 Java 文件都将被编译成类文件。但是,CSS、HTML 和 JavaScript 文件不会被触及。
您刚刚看到获得混合应用程序源代码是多么容易令人沮丧。那么你能做些什么来更好地保护自己呢?
您可以丑化您的代码,这是一种混淆形式。
这样做不会加密您的代码,但会使其更难理解。
如果你想丑化你的代码,我建议你安装UglifyJS,因为它几乎是现在的标准。如果您更喜欢使用任务运行器,Grunt 和 Gulp 也有用于 UglifyJS 的模块。
市场上有很多将apk文件反编译成java类的应用程序和方法,但是如果应用程序是用ProGuard规则编译的,那么你就有大麻烦了,因为这个规则会将所有的dex文件压缩成一个小字符名,然后您无法追溯实施。有关模式说明,请参阅https://developer.android.com/studio/build/shrink-code。
快乐的编码...
几天来,我一直在让自己发疯,试图让 dex2jar 在 Fedora 31 笔记本电脑上工作,而不是一个无法工作的 apk。这个 python 3 脚本在几分钟内完成了这个技巧,安装 jd-gui 使类文件成为人类可读的。
http://java-decompiler.github.io/
https://github.com/Storyyeller/enjarify
具体来说,这是我跑的:
# i installed apktool before the rest of the stuff, may not need it but here it is
$> cd /opt
$> sudo mkdir apktool
$> cd apktool/
$> sudo wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
$> sudo wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.4.1.jar
$> sudo mv apktool_2.4.1.jar apktool.jar
$> sudo mv apktool* /usr/bin/
$> sudo chmod a+x /usr/bin/apktool*
# and enjarify
$> cd /opt
$> sudo git clone https://github.com/Storyyeller/enjarify.git
$> cd enjarify/
$> sudo ln -s /opt/enjarify/enjarify.sh /usr/bin/enjarify
# and finally jd-gui
$> cd /opt
$> sudo git clone https://github.com/java-decompiler/jd-gui.git
$> cd jd-gui/
$> sudo ./gradlew build
# I made an alias to kick of the jd-gui with short commandline rather than long java -jar blahblahblah :)
$> echo "jd-gui='java -jar /opt/jd-gui/build/launch4j/lib/jd-gui-1.6.6.jar'" >> ~/.bashrc
现在应该能够朗姆酒以下内容来获取类文件:
$> enjarify yourapkfile.apk
并启动 jd-gui:
$> jd-gui
然后打开你的类文件!
使用这个工具 http://www.javadecompilers.com/
但最近,一波新的反编译器涌入市场: Procyon、CFR、JD、Fernflower、Krakatau、Candle。
以下是本网站上提供的反编译器列表:
CFR - 免费,没有可用的源代码,http ://www.benf.org/other/cfr/ 作者:Lee Benfield
非常好的反编译器!CFR 能够反编译现代 Java 功能——Java 9 模块、Java 8 lambdas、Java 7 字符串开关等。它甚至可以很好地将类文件从其他 JVM 语言转换回 Java!
JD - 免费用于非商业用途, http: //jd.benow.ca/ 作者:Emmanuel Dupuy
2015 年更新。拥有自己的可视化界面和 Eclipse 和 IntelliJ 插件。用 C++ 编写,速度非常快。支持 Java 5。
Procyon - 开源,https ://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler 作者:Mike Strobel
Fernflower - 开源,https ://github.com/fesh0r/fernflower 作者:Egor Ushakov
2015 年更新。非常有前途的分析 Java 反编译器,现在成为 IntelliJ 14 不可或缺的一部分。( https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler ) 支持 Java 最高版本 6 (注解、泛型、枚举)
JAD - 仅出于历史原因在此给出。免费,无源代码,jad 下载镜像作者:Pavel Kouznetsov
是的,有可能。
有大量软件可用于对 android .apk 文件进行逆向工程。
最近,我在我的网站上编制了47 个最佳 APK 反编译器的最终列表。我把它们分成4个不同的部分。
我希望这个合集对你有所帮助。
Android 应用的 APK 文件可以使用以下任何一种方法进行反编译:
为了反编译 APK 并从中获取代码,您有多个在线工具,我通常更喜欢使用Online APK Decompiler。
它非常易于使用,几分钟内您就可以从中下载源代码。
如果你想从 playstore 下载 APK并反编译. 您也可以轻松地从中下载它。
单击解决方案(仅限 Windows)
在阅读了这篇 loooooonnnnnngggg 帖子后,我决定创建一个自动化流程,只需单击一下即可反编译 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
就是这样,享受