【问题标题】:Decompile an APK, modify it and then recompile it反编译一个APK,修改它然后重新编译它
【发布时间】:2012-09-04 10:04:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 当然,您可以像任何 Android 开发人员一样使用 Android SDK 构建 Java 文件。

标签: java android decompiling recompile


【解决方案1】:

多亏了 Chris Jester-Young,我终于成功了!

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

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

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

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

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

【讨论】:

  • 这不适用于复杂的应用程序(Dex2jar 并不完美 - 一些开发人员也设法通过使用 proguard 或类似技术锁定他们的应用程序)。但对某些人来说,它可能会起作用
  • 是的,你是对的,这就是为什么我说“我认为我设法做到的方式只适用于非常简单的项目”
  • 我设法在一个非常庞大的应用程序上使用了这种方式,我认为它也适用于一些复杂的应用程序
  • @MuhammedRefaat 您是否让它在您的大型应用程序上运行?
  • @loveisbug 是的,我做到了,该应用程序不是我的,并且通过这种方式设法反编译了 apk,但它的代码很糟糕,因为该应用程序是使用混合技术而不是本机编码进行编码的,因此将其转换为本机不会给我完美的结果,但至少我可以查看我想查看的类和方法
【解决方案2】:

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

an online decompiler for android apks

  1. 从本地机器上传 apk
  2. 等一下
  3. 以 zip 格式下载源代码

我不知道这有多可靠。

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

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

报告此链接上的大量广告 另一个在线 Apk 反编译器 @Andrew Rukin : http://www.javadecompilers.com/apk

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

【讨论】:

  • But now I would like to know how to recompile the java files and put them back into a jar file! 是核心问题吗?这不是回答它。
  • 记得在javadecompilers.com/apk网站上点击尽可能多的广告,这样很好
  • @IgorLerinc 在我回答这个问题时,这个网站上没有广告会将这个从列表中删除
【解决方案3】:

答案已经有点过时或不完整。这可能适用于不受保护的 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 时,我能够看到它的日志。

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

【讨论】:

    【解决方案4】:
    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. 接下来从以下链接下载java反编译工具 http://java.decompiler.free.fr/?q=jdgui

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

    【讨论】:

    • 9.最后一步用java反编译工具打开classes_dex2jar.jar文件现在可以看到apk代码了。修改class文件后如何从这里反向创建apk文件
    • @DarioDias 我认为可以
    • @loveisbug DarioDias 询问如何,而不是是否可能
    【解决方案5】:

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

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

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

    这些是我最喜欢的工具:

    javadecompilers.com

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

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

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

    奖励:

    Basic tutorial of Using Proguard:

    【讨论】:

      【解决方案6】:

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

      • 使用apktool

      • 反编译
      • apktool 将为每个同名的 java 文件生成 smali(dex 的汇编版本)文件。

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

      • 重新编译

      【讨论】:

        【解决方案7】:

        这是一种方式:

        1. 使用apktool进行解码:

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

           $ jadx -d {output folder} {apkfile}
          

        2个工具解压和反编译到同一个输出文件夹。

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

        【讨论】:

        • 小心!标记-f 删除整个文件夹。
        【解决方案8】:

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

        使用apk grail下载应用程序

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-20
          • 1970-01-01
          • 2017-12-05
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 2014-05-03
          • 1970-01-01
          相关资源
          最近更新 更多