82

我需要修改现有的 APK,修改源代码,然后重新编译。

  • 我可以使用 dex2jar 或 apktool 对其进行反编译,效果很好
  • 从 jar 文件中我可以获得 java 源代码(使用 jd-gui)
  • 然后我可以修改java文件

但是现在我想知道如何重新编译java文件并将它们放回jar文件中!(jar部分应该很简单,主要问题似乎是如何为android重新编译java文件)

我知道另一种解决方案是使用apktool,然后修改smali文件,但是当我们要添加大量代码时,它似乎真的很复杂!

我的应用程序是一个基本的 HelloWorld whitout 混淆。

4

8 回答 8

53

多亏了 Chris Jester-Young,我设法让它工作了!

我认为我设法做到这一点的方式只适用于非常简单的项目:

  • 使用 Dex2jar,我获得了 Jar。
  • 使用 jd-gui 我将我的 Jar 转换回 Java 文件。
  • 使用 apktool 我得到了 android 清单和资源文件。

  • 在 Eclipse 中,我创建了一个与旧项目具有相同设置的新项目(检查清单文件中的所有信息)

  • 创建项目后,我将所有资源和清单替换为我使用 apktool 获得的资源和清单
  • 我将从 Jar 中提取的 java 文件粘贴到 src 文件夹中(尊重包)
  • 我用我需要的东西修改这些文件
  • 一切都在编译!

/!\ 确保您从设备中删除了旧的 apk,将会抛出一个错误,指出 apk 签名与旧的不同!

于 2012-09-11T13:35:27.847 回答
37

我知道这个问题仍然得到了回答,我想传递一个信息,如何在没有 dexjar 的情况下从 apk 获取源代码。

有一个针对 android apks的在线反编译器

  1. 从本地机器上传 apk
  2. 稍等片刻
  3. 下载 zip 格式的源代码

我不知道这有多可靠。

@darkheir答案是进行反编译 apk 的手动方式。它有助于我们了解 Apk 创建的不同阶段。

获得源代码后,请按照接受的答案中提到的步骤进行操作

在此链接上报告这么多广告 另一个在线 Apk 反编译器@Andrew Rukinhttp ://www.javadecompilers.com/apk

还是值得的。向创作者致敬。

于 2014-02-10T06:38:52.557 回答
15

答案已经有点过时或不完整。这可能适用于不受保护的 apk(没有 Proguard),但现在没有人部署不受保护的 apk。我能够修改(我的)受到良好保护的apk(Proguard,检查“黑客工具”的安全检查,检查应用程序是否以调试模式重新打包的安全检查,...)的方式是通过apktool作为这里的其他人已经提到过。但没有人解释,你必须再次签署该应用程序。

apktool d app.apk
//generates a folder with smali bytecode files. 

//Do something with it.

apktool b [folder name] -o modified.apk
//generates the modified apk.

//and then
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore modified.apk androiddebugkey
//signs the app the the debug key (the password is android)

//this apk can be installed on a device.

在我的测试中,原始版本的 apk 没有日志记录。在我用 apktool 反编译后,我交换了一个完整的字节代码文件,而不用一个完整的字节代码文件记录,重新编译并签名它,我能够将它安装在我的设备上。之后,当我将应用程序连接到它时,我能够在 Android Studio 中看到日志。

在我看来,使用dex2jarandJD-GUI进行反编译只会有助于更好地理解类在做什么,只是为了阅读目的。但是由于一切都是预先保护的,我不确定你是否可以将这个半生不熟的 Java 代码重新编译成一个可以工作的 apk。如果是这样,请告诉我。我认为,唯一的方法是操纵字节码本身,如本例中所述。

于 2019-12-15T15:24:01.763 回答
11
  1. 首先从以下链接下载 dex2jar 工具 http://code.google.com/p/dex2jar/downloads/list

  2. 提取它创建dex2jar文件夹的文件

  3. 现在您选择您的 apk 文件并在更改扩展名后将其扩展名 .apk 更改为 .zip 它似乎是 zip 文件然后解压缩这个您找到的 zip 文件classes.dex文件

  4. 现在选择 classes.dex 文件并将其放入dex2jar文件夹

  5. 现在打开cmd窗口并输入dex2jar文件夹的路径

  6. 现在输入命令dex2jar.bat classes.dex并按 Enter

  7. 现在打开dex2jar你找到 classes_dex2jar.jar文件的文件夹

  8. 接下来,您从以下链接 http://java.decompiler.free.fr/?q=jdgui下载 java 反编译器工具

  9. 最后一步classes_dex2jar.jar用java反编译工具打开文件现在可以看到apk代码

于 2013-03-11T05:28:22.757 回答
5

我知道这个问题已经得到解答,我不想在这里给出更好的答案。我只是分享我在这个主题上的经验。

一旦我丢失了我的代码并且我只有apk文件。我使用下面的工具对它进行了反编译,这让我很开心。

这些工具必须在这种情况下使用,否则,这是不道德的,甚至有时是非法的(窃取别人的努力)。所以请明智地使用它。

这些是我最喜欢的工具:

javadecompilers.com

要从 google play 获取 apk,您可以 google 或查看这些网站:

在发布此答案之日,我测试了所有链接,它对我来说非常完美。

注意: Apk 反编译在 proguarded 代码的情况下无效。因为Proguard 会缩小和混淆代码并将类重命名为无意义的名称,这使得理解代码变得相当困难。

奖金:

使用 Proguard 基础教程

于 2016-01-18T13:48:41.950 回答
2

带有jd-gui的dex2jar将提供所有 java 源文件,但它们并不完全相同。它们几乎是等效的 .class 文件(不是 100%)。因此,如果您想更改 apk 文件的代码:

  • 使用apktool反编译

  • apktool将为每个具有相同名称的 java 文件生成 smali(dex 的汇编版本)文件。

  • smali 是人类可以理解的,在相关文件中进行更改,使用相同的apktool ( apktool b Nw.apk <Folder Containing Modified Files>)重新编译

于 2015-06-06T06:01:20.753 回答
-3

这是一种方式:

  1. 用于apktool解码:

     $ apktool d -f {apkfile} -o {output folder}
    
  2. 接下来,使用 JADX(在 github.com/skylot/jadx)

     $ jadx -d {output folder} {apkfile}
    

2个工具提取和反编译到相同的输出文件夹。

简单的方法:使用在线 APK 反编译器

于 2017-05-15T00:54:08.167 回答
-3

我知道这个问题仍然得到回答,我不想在这里变得聪明。我只想分享关于这个主题的另一种方法。

使用apk grail下载应用程序

APK Grail 提供应用程序的免费 zip 文件。

于 2018-03-01T06:18:30.587 回答