本文由DMITRY KALININ与2024年4月份发表于Securelist网站,介绍并分析了一款名为“SoumniBot”的Android恶意软件,主要重点围绕着该恶意软件所采用的分析检测规避技术。
很多恶意软件的开发人员经常会使用各种工具来阻止他们的恶意代码被检测或分析,当然也包括Android恶意软件在内。近期,我们的团队发现了一种名为“SoumniBot”的新型银行木马,该恶意软件主要以韩国地区的用户为主要目标,采用了一种非传统的分析与检测规避技术,即混淆Android Manifest文件。
SoumniBot混淆技术:利用Android Manifest提取和解析程序中的安全漏洞
任何APK文件,其本质上就是一个ZIP压缩文档,根目录中都会有一个AndroidManifest.xml文件。这个文件中包含了应用程序声明的组件、权限和其他应用程序数据的相关信息,并且能够帮助操作系统检索有关各种应用程序入口点的信息。就像操作系统一样,安全分析人员首先会检查Manifest文件来确定应用程序的入口点,这也是代码分析最开始的起始位置。而这一事实,很可能就是SoumniBot的开发人员研究Manifest文件解析和提取程序实现方式的原因,而且他们也确实成功地从中找到了一些混淆APK的机会。
技术一:无效的压缩方法值
这是一种相对知名的技术,包括SoumniBot在内的各种类型的恶意软件都在积极使用这种技术,这种技术跟Manifest文件的解包方式有关。在libziparchive库中,标准的解压函数只允许在记录Header中存在两个压缩方法值,即0x0000(未压缩)和0x0008(已压缩),否则就会返回一个错误。下图所示代码为libziparchive库的解压算法:

但是,除了使用这个函数之外,很多Android开发人员会选择实现另一种场景,而这种自实现的场景下会出现压缩方法字段验证错误的情况。
下图显示的是Manifest提取程序代码:
如果APK解析程序在目标APK程序AndroidManifest.xml入口点处遇到了任何非0x0008的压缩方法值,则会认为数据未压缩。此时,将允许应用程序开发人员在压缩方法中存储任何非0x0008的值,并写入未压缩的数据。虽然任何正确实现了压缩方法验证的解包工具都应该将这个Manifest文件视作是无效的,但Android APK解析程序却会将其视作是正常的,并允许应用程序执行安装操作。下图显示的是这种技术在文件