Android反向工程工具如何提取Android应用中存在的包/包层次结构?


5

我一直参与使用baksmali和dexpler拆分Android应用程序。每当我反汇编应用程序时,我都会发现软件包和包层次结构(在开发场景中可用)完好无损。例如,当我拆卸一个任务管理器应用程序(MD5:3377f8527479ab4e72bf9fa5eec62abe)时,我得到如下图所示的包层次结构。 enter image description here

在这方面,我有以下问题,

  1. 将Java包的这个层次结构被保留,并在构建应用程序保留。当我们开发应用程序时,当然,我们使用很多软件包,并在构建应用程序时将其放入层次结构中。但是,开发人员编写的所有代码都将被转换为一个classes.dex文件。包和包层次结构信息是否会保留在这个classes.dex文件或apk文件的其他部分(如META-INF)中?
  2. 如果此信息不可从.dex获得,这是从哪里来的?每个反汇编/反编译工具如何设法提取这个包层次结构?
  3. 哪里可以找到与应用程序构建过程中的包和包层次相关的文档/文献?我试图徒劳地浏览Android的文档。
3

是的,包层次结构保存在dex文件中。更确切地说,如果一个类在源代码中被命名为foo.bar.baz.foo.Myclass,那么它的名字也将是.dex中的foo.bar.baz.foo.Myclass。任何“包层次结构”都将从这些类名称派生。

如果您想了解更多关于.dex文件格式的信息,那么Dalvik Executable Format Reference应该包含您需要的一切。

  0

感谢您的链接和答案。在dex文档中,我碰巧看到“** FullClassName是一个完全限定的类名,包括一个可选的包说明符,后跟一个必需的名称**”。这似乎包括包的名称是不是强制性的? 12 5月. 142014-05-12 14:42:00

  0

另外,在该文档中提到完全限定的类名称由字符'L'继续。假设这就是为什么我们在.smali文件中看到“Landroid/support/v4/widget”的原因,而实际的类是android/support/v4/widget? 12 5月. 142014-05-12 14:44:16


2

快速的答案是,在Java中,类的全名是其包级联类的实际名。对于类加载器,com.foo.Annamalai是它将在运行时加载的名称。这也是,随后为什么你不能在相同的包中有两个同名的类

这将是一个(半)人为设计的实例,但假设您的应用程序有两个不同的日志框架,并且您需要同时支持两者。

import java.util.logging.Logger; 
import org.apache.log4j.Logger; 

如果您尝试这样做,您的编译器应该barf,抱怨说您有两个具有相同名称的类。那么,这个版本将工作:

org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(DeleteMe.class); 
java.util.logging.Logger loggingLogger = java.util.logging.Logger.getLogger(DeleteMe.class.getName()); 

因为这个包/类的命名惯例,它是微不足道的提取逆向工程用途的应用程序的文件结构,因为在Java包名被指定为关联到一个文件结构。

在你问到关于不使用包的评论中,好吧,如果你这样做了,那么你将永远无法使用两个同名的类 - 编译器永远不会允许它。

上面的例子会变成这样:

Logger logger4j = Logger.getLogger(DeleteMe.class.getName()); 
Logger loggingLogger = Logger.getLogger(DeleteMe.class.getName()); 

Logger是编译器去,如果你有两个类路径上的挑不包名?

  0

感谢您的解释。我现在清楚地看到了这个观点。 '为了逆向工程目的而提取应用程序的文件结构是微不足道的,因为在java中,包名称被指定为与文件结构相关联。 - 当颠倒Android应用程序时(即使它们包含本地代码) ?纠正我,如果我错了。 12 5月. 142014-05-12 16:41:14

  0

是的,Google仍然需要遵循JLS或Oracle会起诉他们。 12 5月. 142014-05-12 17:04:39

+1

还有一件事我没有注意到,不把所有东西放在“默认”包(这意味着没有包名称)的最大原因是它可能会意外地写出与另一个类具有相同名称的类在库代码中。意思是你会得到奇怪的'Exceptions'并且没有反转每个库,可能不知道为什么,所以包名会给你带来相当多的效用。 13 5月. 142014-05-13 12:26:56

  0

这是一个很好的解释。谢谢。 13 5月. 142014-05-13 12:28:29