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

时间:2012-09-11 13:01:05

标签: java android decompiling recompile

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

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

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

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

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

10 个答案:

答案 0 :(得分:37)

感谢Chris Jester-Young,我设法让它发挥作用!

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

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

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

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

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

答案 1 :(得分:33)

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

an online decompiler for android apks

  1. 从本地计算机上传apk
  2. 等一下
  3. 以zip格式下载源代码
  4. 我不知道这有多可靠。

    @darkheir 答案是反编译apk的手动方式。它帮助我们理解Apk创建中的不同阶段。

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

    另一个在线Apk反编译器 @Andrew Rukin http://www.javadecompilers.com/apk

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

答案 2 :(得分:8)

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

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

  3. 现在你选择你的apk文件并在更改扩展名后将其扩展名.apk更改为.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代码

答案 3 :(得分:2)

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

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

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

这些是我最喜欢的工具:

javadecompilers.com

要从谷歌播放获取apk,你可以谷歌或查看这些网站:

在发布此答案的日期,我测试了所有链接,它对我来说非常适合。

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

<强>加成:

Basic tutorial of Using Proguard

答案 4 :(得分:1)

使用 jd-gui

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

  • 使用 apktool

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:-2)

这是一种方式:

  1. 使用apktool解码:

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

    $ jadx -d {output folder} {apkfile}
    
  3. 2个工具提取和反编译器到同一个输出文件夹。

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

答案 7 :(得分:-2)

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

使用apk grail

下载应用程序

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

答案 8 :(得分:-3)

使用luckypatcher 并删除您的许可证验证比您没有签署apk。使用WINRAR替换修改后的源代码而不反编译apk。

答案 9 :(得分:-5)

应该将文件扩展名从.apk更改为.zip。然后解压缩文件,修改它们,然后将它们压缩到.zip,并记住将扩展名重命名为.apk

为此,我们甚至不必使用任何计算机。我更喜欢ES文件浏览器,它也可以帮助查看和编辑源代码。