一、Android文件结构
Android操作系统以安卓应用程序包作为其应用的软件分发与安装格式。类似于Windows平台下的EXE文件,APK文件是一个经过打包的文件,包含应用程序正常运行所需的所有文件,如代码文件、资源文件、清单文件等。
APK文件的本质是ZIP格式的压缩包,由Android应用的各种文件与目录构成。以下是APK文件中常见组成部分及其描述:
META-INF目录:该目录包含与系统安全相关的数据,文件的发布名称、签名、验证签名有效性的证书等信息被存储于MANIFEST.MF、CERT.SF与CERT.RSA等文件中。
res目录:该目录下存储不同类型的应用资源,这些资源与应用的显示与外观相关,如界面布局信息、部分图像文件等。
assets目录:同样存储应用的资源文件。但是与前者不同,此目录下的文件不参与编译过程,而是以原生文件的形式存在,如音视频资源。
lib目录:包含与CPU架构相关的原生库文件,这些库文件通常是被编译为共享对象(so文件)的C/C++库。这些库文件被存放于对应CPU架构的子目录下,如armeabi-v7a、arm64-v8a、x86等。
AndroidManifest.xml文件:清单文件,是APK目录下的核心文件之一,描述了应用的基本信息,包括四大组件的静态注册信息、应用声明的权限信息与该应用适配的Android版本信息。
resource.arsc文件:与前面提到的存储资源的目录不同,一个Android应用的部分资源被编译后以二进制格式存储在该文件中。
classes.dex文件:DEX(Dalvik Executable)文件,即能够在Dalvik虚拟机(Dalvik Virtual Machine,DVM)环境下直接运行的可执行文件,是Android应用的代码文件。在Android 5.0及之后的版本中,DVM被安卓运行时(Android Runtime,ART)所取代,但DEX文件格式依然是应用程序代码的标准编译格式。
由以上描述可以看出,DEX文件是APK目录下的核心代码文件。虽然以二进制格式存储,但它仍然包含了大量的信息,包括字节码指令、字符串常量、类型信息等,这些信息描述了应用程序的逻辑和行为,可以被分析和利用来提取特征。
二、Android恶意软件生成与同源性
Android应用完成从代码转换到APK文件的过程包括代码编译、资源处理、打包和签名。首先,应用发布者使用Java/Kotlin语言编写源代码,对XML文件与资源文件进行声明。然后,源代码先被编译器编译为Java字节码(class文件),再通过D8或dx编译器完成多个class文件的结构优化与合并,并生成可执行的DEX文件。接下来,在完成部分资源的编译后,可执行文件、清单文件与资源文件被打包,同时为了应用的安全性,采用摘要与签名技术来确保文件的完整性与发布者的真实性。
与上述过程相反,当用户在Google Play或应用商店获取到APK文件后,经过解析、验证、预编译、文件复制与组件注册过程,Android应用程序就完成了在终端设备上的安装。
恶意软件通常采用复用和变种现有恶意代码的生成策略,从而以较小代价达到绕过检测与范围扩散的目的。具体地,应用开发者选择一个现有成熟的恶意软件作为基线,通过修改原始恶意代码的某些部分来生成变种。这些成熟的恶意软件可能具有有效的传播机制、难以检测的特性或者能够实现特定的恶意功能。
在该过程中,由于代码重用、共享的功能模块、相似的通信模式、共享的逃避检测技术、以及相似的攻击手段以及构建信息等多方面的一致性,恶意软件的同源性得到体现,并由此引出恶意软件家族的概念。
恶意软件家族是指一组具有相似特征、共享同一代码基础、展现相似行为模式,或由同一作者或团体创建的恶意软件集合。著名的恶意软件家族包括主要用于金融诈骗的Zeus、利用漏洞自动传播的勒索软件WannaCry等。