反编译APK,对其进行修改,然后重新编译


76

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

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

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

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

我的应用程序是一个基本的HelloWorld混乱处理。


7
当然,您将使用Android SDK以与任何Android开发人员相同的方式构建Java文件。
克里斯·杰斯特·杨

Answers:


45

多亏了克里斯·杰斯特·杨(Chris Jester-Young),我才得以使它成功!

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

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

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

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

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


7
这不适用于复杂的应用程序(Dex2jar并不完美-一些开发人员还通过使用proguard或silar技术来设法锁定其应用程序)。但是对于某些人来说,它可能会起作用
Ahmad 2012年

是的,您是对的,这就是为什么我说“我认为我设法做到的方式仅适用于非常简单的项目”
darkheir 2012年

4
我设法用一个真正巨大的应用这种方式,我认为这完全适用于一些复杂的应用来说
穆罕默德Refaat

@MuhammedRefaat您可以在庞大的应用程序上使用它吗?
loveisbug,2015年

@loveisbug是的,我不是,该应用不是我的,并且这种方式设法反编译了apk,但是它的代码很可疑,因为该应用是使用混合技术而非本机编码进行编码的,因此将其转换为本机不会给我完美的结果但是至少我可以查看我想看到的类和方法
Muhammed Refaat

36

我知道这个问题仍在回答,我想传递一个信息,说明如何使用dexjar从apk获取源代码。

适用于Android Apks的在线反编译器

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

我不知道这有多可靠。

@darkheir答案是手动反编译apk的方法。它可以帮助我们了解Apk创建的不同阶段。

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

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

仍然值得。向创作者致敬。


29
But now I would like to know how to recompile the java files and put them back into a jar file!核心问题对吗?这没有回答。
C4d

记住要在javadecompilers.com/apk网站上点击尽可能多的广告 ,因为这很好
Igor Lerinc

@IgorLerinc,当我回答此问题时,此网站上没有广告会将其从列表中删除
edwin

11
  1. 首先从以下链接http://code.google.com/p/dex2jar/downloads/list下载dex2jar工具

  2. 解压文件创建dex2jar文件夹

  3. 现在,您选择apk文件,并将其扩展名.apk更改为.zip,更改后的扩展名似乎是zip文件,然后解压缩您找到的该zipclasses.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 decompiler工具

  9. 下一步classes_dex2jar.jar在Java反编译器工具中打开文件,现在您可以看到APK代码


4
9.最后一步,在java decompiler工具中打开文件classes_dex2jar.jar,现在您可以看到apk代码。修改类文件后,如何从此处反向创建apk文件
Dario Dias 2014年

2
@DarioDias我认为可以
loveisbug,2015年

4
@loveisbug DarioDias询问如何,而不是是否可能
Denny

9

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

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时,便能够看到日志。

我认为,仅出于阅读目的,使用dex2jar和进行反编译JD-GUI仅有助于更好地理解类的作用。但是,由于一切都受到保护,所以我不确定您是否可以将这个半熟的Java代码重新编译为可以正常工作的apk。如果是这样,请告诉我。我认为,唯一的方法是如本示例中所述操作字节码本身。


3

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

  • 使用apktool反编译

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

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


3

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

一旦我丢失了代码,我就拥有了 apk文件。我使用下面的工具对它进行了反编译,这让我非常满意。

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

这些是我最喜欢的工具:

javadecompilers.com

并要从Google Play获取APK,可以对它进行Google搜索或查看这些网站:

在发布此答案之日,我测试了所有链接,并且对我来说非常理想。

注意:如果使用受保护的代码,则Apk反编译无效。因为Proguard会收缩并混淆代码,并将类重命名为无意义的名称,这使得理解代码相当困难。

奖金:

使用Proguard的基本教程



-2

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

apk grail下载应用程序

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.