【问题标题】:Android applications repackaging: Why does it not break the code?Android 应用程序重新打包:为什么它不会破坏代码?
【发布时间】:2013-05-25 07:56:46
【问题描述】:

我已经阅读了很多关于恶意软件编写者如何重新打包现有的 benigh android .apk 并将其重新打包以添加恶意功能的信息。

现在,根据我对 .apk 文件结构的理解,每个 .apk 文件都包含一个 .dex 文件,该文件本质上是将 java 字节转换为 .dex 格式。此外,该应用程序有一个名为 manifest.xml 的二进制 XML 和其他资源文件和资产。如果我们必须向应用程序添加额外的恶意功能,那么我们必须修改 manifest.xml(可以通过将二进制 xml 转换回普通 xml 轻松完成)、资源(可以直接替换)和 .dex 文件.

但 .dex 文件具有特定的结构。据我说,对其进行的任何修改都应该破坏代码。这些工具使用什么技术来防止代码被破坏,因为如果向原始应用程序添加一些恶意功能,我们实质上就是添加了一个额外的模块。

有哪些支持 .apk 文件重新打包的工具?

谢谢。

编辑:有些成员可能会觉得讨论逆向工程令人不快。我是研究 Android 安全的研究生。我需要知道 .apk 文件重新打包是如何工作的,因为这是我的研究课题。此外,公开谈论逆向工程并不是恶意行为——关于逆向工程的书籍已经写过——将逆向工程用于恶意目的是恶意的:)

【问题讨论】:

  • 在发布模式下启用 proguard。这将使逆向工程变得更加困难。还要检查这个developer.android.com/training/articles/security-tips.html
  • @Simon 我理解您的担忧,但我是一名研究 Android 安全的研究生。我需要了解 .apk 文件重新打包的概念。这是我的研究课题。
  • @Raghunandan 谢谢!但我并没有问如何防止我的应用程序重新打包,而是如何重新打包现有的应用程序。
  • 重新打包成什么.apk?您将所有内容打包到 android 中的 .apk 文件中。
  • @Raghunandan 是的。恶意软件作者使用的技术之一是他们采用现有的良性应用程序。将其解包,添加一些恶意功能,然后将其重新打包回 .apk 文件并上传到其他应用商店。

标签: android security malware software-packaging


【解决方案1】:

安全信息

在发布模式下启用 proguard。这将使逆向工程变得更加困难。还要检查this developer training documentation on security

(来自对此问题的评论)

包签名验证

您可以通过检查签名来验证包是否已重新打包。一些文章可以帮助解决这个问题:

Retrieving APK signature during runtime
Self checking an APK signature.
How to check APK signature.

(原贴广告Verify Android apk has not been repackaged?

将DEX反编译成Java

我之前回答过一个关于反编译 DEX 代码的问题。我原来的答案现在可能已经过时了,但其他人已经更新了这个问题。以下是其中列出的一些工具的概述。

更完整的版本 fredanswer:

手动方式

首先,您需要一个工具来提取所有(已编译)类 DEX 到 JAR。有一个叫dex2jar,它是由一个 中国学生。

然后,您可以使用jd-gui反编译 JAR 上的类 到源代码。生成的源代码应该非常可读,因为 dex2jar 应用了一些优化。

1:http://code.google.com/p/dex2jar/
2:http://java.decompiler.free.fr/?q=jdgui

自动方式

您可以使用APKTool。它 将自动提取所有类 (.dex)、资源 (.asrc),然后它将二进制XML转换为人类可读的XML, 它还会为您反汇编类。
反汇编总是比反编译更强大,尤其是使用 Pro Guard 混淆的 JAR!

只需告诉 APKTool 将 APK解码到一个目录中,然后修改 你想要什么,最后将其编码回一个 APK。就是这样。

重要提示: APKTool 反汇编。它不会反编译。生成的代码不会是 Java 源代码。但你应该能够 阅读它,如果您熟悉它,甚至可以编辑它 jasmin。如果你想要 Java 源代码, 请查看手动方式

(原问题:decompiling DEX into Java sourcecode

【讨论】:

  • 好的。因此,要重新打包应用程序,我首先使用 dex2jar,然后使用 jd-gui。使用jd-gui生成的源码,在上面写额外的模块,然后重新打包,用自己的key签名?
  • @NarutoUzumaki 而且我认为这是最重要的一点,“你必须用自己的密钥签名,不能让它用原作者的密钥签名”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2017-12-04
  • 2011-05-06
相关资源
最近更新 更多