如何提取无法运行的.apk文件的代码?

82

实际上,我试图提取一个名为cloudfilz.apk的.apk文件的代码,并希望在其源代码中进行操作,因此我按照以下步骤进行:

创建一个新文件夹并将 .apk 文件(您想要解密的文件)放入其中,现在将这个 .apk 文件重命名为 .zip 扩展名(例如:将 filename.apk 重命名为 filename.apk.zip)并保存它。现在您可以看到 classes.dex 文件等... 在这个阶段,您可以查看 drawable,但无法查看 XML 和 Java 文件... 所以继续...

第二步:

现在在同一文件夹(在此例中为 NEW FOLDER)中提取此 zip apk 文件。 现在从此链接http://code.google.com/p/dex2jar/下载 dex2jar 并将其提取到同一文件夹中(在此例中为 NEW FOLDER)。 现在打开命令提示符并到达该文件夹(在此例中为 NEW FOLDER)。到达后输入 "dex2jar classes.dex" 然后按 Enter 键。现在您会在同一文件夹中看到 classes.dex.dex2jar 文件。

=>问题:我成功完成了第1步,但在第2步中,在执行"dex2jar classes.dex"时,命令提示符显示错误信息 java.lang.UnsupportedClassVersionError ,我知道这是由于我的 JDK 版本与 classes.dex JDK 版本号不兼容导致的,所以我卡在这里,没有办法解决...


2
如果该应用程序的作者希望您查看源代码,他/她会将其发布为开源。我猜它不是开源的,您没有权利尝试提取它。 - NickT
10
@NickT 有时候你想知道为什么你新的安卓手机(CMAS)上的某个应用程序拥有比它应该拥有的权限更多。“我坚信人民。如果给予他们真相,他们可以依赖自己应对任何国家危机。关键是向他们传递真实的事实和啤酒。” ——亚伯拉罕·林肯 - Michael Blankenship
http://technikes.com/find-a-source-code-from-apk-file/ 为您的问题提供了两个新步骤。 - saksham agarwal
4个回答

109

注意:以下所有指令都是通用的(也就是适用于所有操作系统),除非另有说明。


前置条件

你需要:

  • 一个已安装并能正常工作的Java 安装包
  • 一个可运行的终端/命令提示符
  • 一台电脑
  • 一个 APK 文件

步骤

第一步:更改 APK 文件的文件扩展名

  1. 通过将 .apk 文件的扩展名更改为 .zip 或将 .apk 更改为 .zip,来更改 APK 文件的文件扩展名。

    例如,将 com.example.apk 更改为 com.example.zipcom.example.apk.zip。请注意,在 Windows 和 macOS 上,它可能会提示您是否确定要更改文件扩展名。如果您使用 macOS,请单击 OKAdd

macOS 添加扩展名确认对话框

第二步:从 APK 中提取 Java 文件

  1. 在一个特定的文件夹中提取重命名后的 APK 文件。例如,让该文件夹为 demofolder


    • 如果无法成功,请尝试使用其他应用程序(如 WinZip 或 7-Zip)打开该文件。

    • 对于 macOS,你可以在终端中运行 unzip(位于 /Applications/Terminal.app),其中包括一个或多个参数:要解压缩的文件+可选参数。请参阅 man unzip 以获取文档和参数。

  2. 下载dex2jar软件包,以及从GitHub上获取的所有发行版,将其解压到与前一个步骤中所述的同一文件夹中。

  3. 打开命令提示符(或终端),将当前目录更改为在前一个步骤中创建的文件夹,并键入命令d2j-dex2jar.bat classes.dex,然后按回车键。这将在同一文件夹中生成classes-dex2jar.jar文件。

    • macOS/Linux用户:d2j-dex2jar.bat替换为d2j-dex2jar.sh。换句话说,在终端中运行d2j-jar2dex.sh classes.dex并按回车键。
  4. 下载Java反编译器(在Github上查看所有版本),将其解压缩并启动(即双击)可执行文件。

  5. 从JD-GUI窗口中,将生成的classes-dex2jar.jar文件拖放到其中,或者转到File > Open File...并浏览jar包所在目录。

  6. 接下来,在菜单中选择文件 > 全部保存 (Windows: Ctrl+Alt+S, macOS: ++S)。这将打开一个对话框,询问您要保存名为 `classes-dex2jar.jar.src.zip" 的 zip 文件的位置,该文件包含所有包和 java 文件。(您可以重命名要保存的 zip 文件)

  7. 解压缩该 zip 文件 (classes-dex2jar.jar.src.zip),然后您应该可以获得该应用程序的所有 java 文件。

第三步: 从 APK 中获取xml文件

  • 有关更多信息,请参见apktool网站以获取安装说明和更多信息
  • Windows:

    1. 下载包装脚本 (可选)apktool jar (必需)并将它们放在同一个文件夹中 (例如,myxmlfolder)。
    2. 将当前目录更改为文件夹myxmlfolder,并将apktool jar文件重命名为apktool.jar
    3. .apk文件放在同一个文件夹中(即myxmlfolder)。
    4. 打开命令提示符(或终端),并将当前目录更改为存储apktool的文件夹(在这种情况下,是 myxmlfolder)。接下来,输入命令apktool if framework-res.apk

      我们正在进行的是安装框架。更多信息,请参阅文档

    5. 上述命令应该会出现 "Framework installed ..."。
    6. 在命令提示符中,键入命令apktool d filename.apk(其中filename是apk文件的名称)。这将对该文件进行解码。更多信息,请参阅文档

      这应该会导致输出一个名为filename.out的文件夹,其中filename是apk文件的原始名称,不包括.apk文件扩展名。在这个文件夹中包含了所有的XML文件,如布局、可绘制等等。

来源: 如何从APK文件获取源代码 - Comptech Blogspot


1
它对我生成XML文件很有效。 - Senthil
1
更好的JD-GUI链接是:http://jd.benow.ca/。 - Dut A.
现在打开命令提示符并进入上一步创建的文件夹,输入命令“dex2jar classes.dex”,然后按回车键。这将在同一文件夹中生成“classes.dex.dex2jar”文件。该GitHub链接中没有.bat文件。 - raklos
Ubuntu用户,请将'apktool'和'apktool.jar'文件移动到'/usr/local/bin'文件夹中。打开终端路径,指向apk文件夹位置,输入**apktool d <your-app-name.apk>**。 - KH_AJU
3
第三步中,你应该将 d2j-jar2dex.bat classes.dex 更改为 d2j-dex2jar.bat classes.dex。这将会将 Dex 文件转换成 Jar 文件。 - viion
显示剩余2条评论

30

从市场或未签名的任何.apk文件

  1. 如果您的apk是从市场下载并因此已签名,请从市场安装Astro文件管理器。打开Astro > 工具 > 应用程序管理/备份并选择要备份到SD卡上的应用程序。 将手机作为USB驱动器挂载并访问“backupsapps”文件夹以找到目标应用程序的apk(假设我们称其为app.apk)。 将其复制到本地驱动器,未签名的 .apk 同理。

  2. 从此链接下载Dex2Jar zip: SourceForge

  3. 解压下载的zip文件。

  4. 打开命令提示符,并在到达dex2jar exe所在的目录时编写以下命令,并将apk复制到同一目录中。

    dex2jar targetapp.apk file(./dex2jar app.apk on terminal)

  5. 从此链接下载反编译器:http://jd.benow.ca/

  6. 使用jd-gui打开'targetapp.apk.dex2jar.jar'。 文件 > 保存所有源文件以将类文件保存为Java文件的jar文件。


我会尝试这个…… - Shridutt Kothari

2
步骤1:
下载dex2jar,点击这里。创建一个Java项目,并将(dex2jar-0.0.7.11-SNAPSHOT/lib) jar文件粘贴进去。将apk文件复制到Java项目中。运行它,在刷新项目之后,你就会得到一个jar文件。使用java反编译器即可查看所有的java类文件。
步骤2:下载java反编译器,点击这里

感谢Sony的回复,但我无法获取jar文件,所以请您详细解释一下...您的屏幕截图显示dex2jar lib jar文件在另一个位置,但它应该保存在Java项目内,这是可行的吗?请澄清我的疑惑。 - Gaurav Chawla
只需将dext2jar库的jar文件复制到Java项目中,而不是src文件夹中。 - Ramesh Akula
我已经将apk文件放入src中。主类是什么?是这个com.googlecode.dex2jar.dump.Dump吗? - Piraba
Linux用户的操作步骤是否相同? - Snehal Poyrekar

0

点击这里 这是一个适用于Windows和Ubuntu的好教程。

  1. 这里下载apktool1.5.1.jar。

  2. 这里下载apktool-install-linux-r05-ibot。

  3. 这里下载dex2jar-0.0.9.15.zip。

  4. 这里下载jd-gui-0.3.3.linux.i686.tar.gz(Java反编译器)。

  5. framework-res.apk(位于您的Android设备/system/framework/中)

步骤:

  1. 将.apk文件重命名并将扩展名更改为.zip,

它将变成.zip。

  1. 然后提取.zip。

  2. 解压下载的dex2jar-0.0.9.15.zip文件,复制内容并粘贴到解压缩文件夹中。

  3. 打开终端并更改目录以解压缩“dex2jar-0.0.9.15”

- cd - sh dex2jar.sh classes.dex(此命令的结果“classes.dex.dex2jar.jar”将在您的提取文件夹中)。

  1. 现在,创建一个新文件夹并将“classes.dex.dex2jar.jar”复制到其中。

  2. 解压缩“jd-gui-0.3.3.linux.i686.zip”,并以全屏模式打开“Java反编译器”。

  3. 单击“打开文件”并选择“classes.dex.dex2jar.jar”到窗口中。

  4. “Java反编译器”中,转到文件>保存,并将源代码保存为.zip文件。

  5. 创建“source_code”文件夹。

  6. 提取保存的.zip文件并将内容复制到“source_code”文件夹中。

  7. 这将是我们保存源代码的地方。

  8. 解压缩apktool1.5.1.tar.bz2,您将获得apktool.jar

  9. 现在,解压缩“apktool-install-linux-r05-ibot.zip”

  10. 复制“framework-res.apk”,“.apk”和apktool.jar

  11. 将其粘贴到解压缩的“apktool-install-linux-r05-ibot”文件夹(第13行)中。

  12. 然后打开终端并键入:

    - cd

    - chown -R : ‘apktool.jar’

    - chown -R : ‘apktool’

    - chown -R : ‘aapt’

    - sudo chmod +x ‘apktool.jar’

    - sudo chmod +x ‘apktool’

    - sudo chmod +x ‘aapt’

    - sudo mv apktool.jar /usr/local/bin

    - sudo mv apktool /usr/local/bin

    - sudo mv aapt /usr/local/bin

    - apktool if framework-res.apk - apktool d .apk


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