我笔记本电脑上的硬盘刚刚崩溃,我丢失了过去两个月一直在开发的应用程序的所有源代码。我只有一个APK文件,它存储在我发给朋友的电子邮件中。
有没有办法从这个APK文件中提取我的源代码?
我笔记本电脑上的硬盘刚刚崩溃,我丢失了过去两个月一直在开发的应用程序的所有源代码。我只有一个APK文件,它存储在我发给朋友的电子邮件中。
有没有办法从这个APK文件中提取我的源代码?
当前回答
用于反向工程第三方、封闭的二进制Android应用程序的Apktool。
它可以将资源解码为几乎原始的形式,并在进行一些修改后重建它们。
它使逐步调试smali代码成为可能。此外,它还使使用应用程序变得更容易,因为它具有类似项目的文件结构和一些重复任务的自动化,如构建apk等。
http://ibotpeaches.github.io/Apktool/
其他回答
市场上有很多应用程序和方法可以将apk文件反编译为java类,但是如果应用程序是用ProGuard规则编译的,那么你就遇到了很大的麻烦,因为这个规则会将所有的dex文件缩成一个小字符的名称,然后你就无法追溯实现。看见https://developer.android.com/studio/build/shrink-code用于模式澄清。
快乐编码。。。
几天来,我一直想让dex2jar在一台软呢帽31笔记本电脑上与一台无法工作的apk进行比较,这让我发疯了。这个python3脚本在几分钟内就完成了这个任务,安装jdgui使类文件变得可读。
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
那就打开你的课堂文件吧!
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/CodovaApp-debug.apk或类似于platforms/android/ant build/*-debug.pk的东西。
即使这是一个调试版本,它仍然非常有用。安装了7-zip或类似文件后,右键单击APK文件并选择解压缩。在解压缩的目录中,您现在应该可以访问所有基于web的源文件。我说基于web是因为ApacheCordova使用的任何Java文件都将被编译成类文件。但是,CSS、HTML和JavaScript文件不会被触及。
您刚刚看到了获取混合应用程序源代码是多么容易。那么你能做些什么来更好地保护自己呢?
您可以使代码变丑,这是一种混淆。
这样做不会加密您的代码,但会使其变得更加难以理解。
如果你想让你的代码变丑,我建议你安装UglifyJS,因为它现在基本上是标准的。如果您喜欢使用任务管理器,Grunt和Gulp也有用于UglifyJS的模块。
Play Store上还有一个新的应用程序,它可以反编译apk(系统应用程序),并在智能手机上查看源代码。它将文件保存到SD卡中,以便您也可以在计算机上查看。它不需要根或其他东西。
只需安装并享受乐趣。我认为这是反编译应用程序最简单的方法。
最简单的方法:使用在线工具Decompiler,上传apk并获取源代码。
解码.apk文件的过程,分步方法:
步骤1:
创建一个新文件夹并复制您要解码的.apk文件。现在将.apk文件的扩展名重命名为.zip(从filename.apk重命名为filename.zip)并保存。现在您可以访问classes.dex文件。在这个阶段,您可以看到可绘制文件,但不能看到.xml和.java文件。
第2步:
现在在同一文件夹或新文件夹中提取这个.zip文件。下载dex2jar(不要下载代码,单击右侧的releases按钮,然后下载名为dex2jar-X.X.zip的文件)并将其解压缩到同一文件夹或新文件夹。将classes.dex文件移动到dex2jar文件夹中。现在打开命令提示符并将目录更改为该文件夹。然后编写d2j-dex2jar classes.dex(适用于Mac或Ubuntu write./d2j-dex2-jar.sh classes.dex)并按enter键。现在,classes.dex.dex2jar文件位于同一文件夹中。下载java反编译程序,右键单击jdgui,单击Open File,然后从该文件夹中打开classes.dex.dex2jar文件:现在您得到了类文件。按src名称保存所有这些类文件(在jdgui中,单击File->SaveAllSources)。在这个阶段,您得到了Java代码,但.xml文件仍然无法读取。
步骤3:
现在打开另一个新文件夹
放入要解码的.apk文件下载apktool和apktool安装窗口的最新版本(两者都可以从同一链接下载),并将它们放在同一文件夹中打开命令提示符现在,运行命令apktool if framework-res.apk(如果没有,请在此处获取),然后apktool d myApp.apk(myApp.apk表示要解码的文件名)
现在,您在该文件夹中获得了一个文件文件夹,可以轻松地读取.xml文件。
步骤4:
这不是任何步骤,只需将两个文件夹(两个新文件夹)的内容复制到单个文件夹
享受源代码!