反编译一个 APK,修改它,然后重新编译它

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

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

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

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

我的应用程序是一个基本的 HelloWorld 模糊处理。

203485 次浏览

多亏了 Chris Jester-Young 我成功了!

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

  • 用 Dex2jar 我得到了罐子。
  • 使用 jd-gui,我将我的 Jar 转换回 Java 文件。
  • 通过 apktool 我得到了机器人清单和资源文件。

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

  • 当项目被创建时,我将用我通过 apktool 获得的资源替换所有的资源和清单
  • 我将从 Jar 中提取的 java 文件粘贴到 src 文件夹中(与包相关)
  • 我用我需要的东西修改了那些文件
  • 所有东西都在编译!

/!确保您从设备中删除了旧的 apk,将抛出一个错误,说明 apk 签名与旧的不一样!

我知道这个问题仍然是答案,我想传递一个信息,如何获得源代码从 apk 没有 dexjar。

Android apks 的在线反编译器

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

我不知道这有多可靠。

解答是反编译 Apk 的手动方法,它帮助我们理解 Apk 创建的不同阶段。

一旦您有了源代码,按照接受的答案中提到的步骤操作

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

还是值得的,向创造者脱帽致敬。

使用 JD-gui的 dex2jar 将提供所有的 Java 源文件,但它们并不完全相同。它们几乎是等价的。类文件(不是100%)。 因此,如果您想更改 apk 文件的代码:

  • 使用 Apktool反编译

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

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

  • 重新编译

我知道这个问题已经得到了回答,我并不想在这里给出更好的答案。我将分享我在这个话题上的经验。

一旦我丢失了我的代码,我只有 apk文件。我用下面的工具反编译了它,这让我很高兴。

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

这些是我最喜欢的工具:

Javadecompilers.com

如果你想从 google play 获得 apk,你可以谷歌一下或者浏览一下这些网站:

在发布这个答案的日期,我测试了所有的链接,它为我工作完美。

注意: Apk 反编译在保护代码的情况下是无效的。因为 前卫收缩和混淆代码,并将类重命名为无意义的名称,这使得理解代码相当困难。

意外收获:

使用 ProGuard 的基础教程 :

这是一种方法:

  1. 使用 apktool解码:

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

     $ jadx -d {output folder} {apkfile}
    

2工具解压缩和反编译到相同的输出文件夹。

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

我知道这个问题还是有答案的,我并不想在这里耍小聪明。我只是想分享关于这个主题的另一种方法。

使用 APK 圣杯下载应用程序

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

答案已经有点过时或者不完整了。这可能适用于不受保护的 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。如果有,请告诉我。我认为,唯一的方法是操作字节代码本身,正如本例中提到的。