Android恶意软件混淆与对抗手艺专题

宣布时间 2024-11-25

第一章 概 述


近年来 ,Android恶意软件数目一直攀升 ,其接纳的攻击和对抗手艺也变得越来越重大。为了对抗清静剖析 ,绕过清静检测 ,窃取敏感数据或破损系统清静 ,恶意软件使用种种对抗手艺来伪装和隐藏其恶意行为和代码逻辑。这些对抗手艺中 ,针对资源、文件、字节码指令及机械码指令的混淆手艺被普遍地引入到恶意软件中 ,成为高级黑客与逆向工程师对抗的主要战场。


混淆手艺的焦点目的是增添剖析重大性来对抗逆向工程 ,同时也能提高免杀能力 ,主要对抗目的包括逆向工程师、静态剖析工具、动态调试工具以及自动化检测系统�;煜忠胀ü柚闷饰鱿葳濉⒏谋湮募峁埂⒃鎏碇噶钪仄蟆⑿槟饣噶睢⒁卮牒妥试吹戎种址痹拥氖忠绽囱谑纹湫形卣骱凸セ饕馔� ,同时给剖析职员尽可能大的制造剖析障碍 ,延后其恶意行为袒露的时间。同时 ,恶意软件通过组合运用种种各样的混淆与剖析对抗手艺 ,对现有清静检测工具和防护机制形成了严肃挑战。这需要一直跟进种种手艺的生长 ,对新的手段举行深入研究 ,制订有用且快速的应对要领 ,强化剖析工具和检测工具 ,同时也有助于快速应对高级且重大的恶意软件攻击。


本文将对我们剖析Android恶意软件历程中所遇到的常见混淆手艺举行总结和剖析 ,从恶意软件混淆与对抗的视角来叙述另一面的清静攻防手艺 ,以资助清静工程师和用户们越发深入明确这一领域的手艺情形 ,同时也有助于剖析职员更高效地剖析恶意代码。

第二章 Android恶意软件混淆手艺的演进

随着移动清静领域对抗的一直升级 ,Android 恶意软件的混淆手艺也履历了显著的生长 ,从简朴的标识符混淆逐步演进到重大的虚拟化�;ぃ╒MP)手艺 ,泛起出由浅入深、逐步升级的趋势。为更清晰地明确这一转变 ,我们将混淆手艺的生长大致划分为早期、中期和目今阶段 ,并从差别层面举行详细剖析。


2.1 早期阶段:基础伪装与简朴加密 


在早期 ,恶意软件的混淆手艺主要以掩饰代码和资源内容为目的 ,手段较为简朴直接 ,其混淆手艺主要集中于Java层 ,使用Android应用以Java语言开发的特征 ,通过简朴的混淆手段规避清静剖析和检测。在这一时期 ,恶意软件最先探索文件名堂相关的混淆战略。例如 ,通过修改ZIP名堂的APK伪加密 ,以及2012年黑帽大会上首次提出的使用DEX头隐藏代码的手艺 ,这一战略随后被Syrup恶意软件所接纳。同时 ,木马Obad使用商业混淆工具DexGuard(ProGuard的增强版)实现了Manifest字段的重大混淆以及基于clinit要领的动态代码解密 ,被誉为“史上最强Android木马”。


这一阶段 ,短信阻挡类和锁机勒索类恶意软件普遍接纳多种混淆手段 ,包括代码混淆、字符串加密、代码支解、垃圾代码注入 ,以及商业加固工具的使用。这些手艺只管相对基础 ,但在其时的清静情形中 ,已经显著提高了恶意软件的隐藏性和抗检测能力。下图展示了一款短信阻挡木马的混淆效果。


图片1.png

图1 一个短信阻挡木马的混淆示例


2.2 中期阶段:逻辑重大化与动态对抗 


随着清静检测手艺的一直提升 ,恶意软件逐步引入越发重大的混淆手段 ,以提高隐藏性并有用规避剖析。为规避静态剖析 ,它们使用动态加载和反射机制 ,通过反射动态挪用隐藏的要害代码。同时 ,恶意软件接纳多重加密与解压战略 ,对要害代码举行多条理加密 ,并在运行时通过重大的解密历程逐步释放真实的恶意逻辑。例如:在我们宣布的剖析报告《新型Android银行木马“MoqHao”使用社交网络隐藏C&C服务器》中 ,恶意软件将真正的恶意dex文件加密后 ,以Base64编码的形式生涯在原始APK的assets目录下。在这种情形下 ,原始APK仅作为一个外壳保存 ,其在运行时会动态解密并加载真正的恶意dex文件 ,以实现其攻击目的 ,其历程如下图所示:


图片2.png

图2 Java层混淆dex文件的示例


为了扰乱剖析路径 ,恶意软件引入控制流混淆手艺。通过插入无关的分支、循环和跳转语句 ,恶意软件使代码执行路径越发重大 ,阻碍剖析职员还原其逻辑。而在团结商业加固解决计划后 ,通过内存加载、指令抽取和指令转换等手艺 ,进一步提升了对抗剖析的能力 ,使得剖析职员难以准确还原着实际的执行逻辑。


随着反混淆手艺的前进和现代化反编译工具的普及 ,恶意软件逐渐将混淆战略向Native层转移 ,以进一步提升逆向剖析的难度。其常用手艺包括对会话数据加密以避免敏感信息泄露、加密要害函数体以隐藏恶意行为、插入花指令滋扰反汇编工具剖析、使用LLVM框架实验重大的代码混淆 ,以及通过反调试手艺检测和阻止调试器介入。这些战略相辅相成 ,不但显著增添了逆向工程的重大性 ,也进一步提高了清静研究职员剖析的手艺门槛。例如:在我们宣布的《一款通过SO举行自�;さ囊蠥PP挟制木马深度剖析报告》中 ,详细剖析了该木马的运行行为。详细而言 ,libload.so�?槿险娼饷懿⒓釉叵质档亩褚獯�。该�?槭褂肑ava反射机制挪用javax.crypto包中的加解密函数 ,对存储在assets目录下的mycode.so文件举行AES解密。解密后的文件通过自界说的DexClassLoader加载并执行 ,执行完毕后 ,解密的文件会被删除。这些全心设计的混淆手段有用隐藏了恶意行为 ,显著增添了清静剖析的重大性 ,使得恶意软件的检测和剖析变得越发难题。加载Native解密库的部分代码如下图所示:


图片3.png

图3 Natvie层混淆示例


别的 ,针对文件名堂的混淆战略也变得越发多样和重大。它们巧妙使用 Android系统对某些文件名堂字段宽松校验的特征 ,同时借助反编译工具对文件名堂的严酷剖析逻辑 ,设计了多种滋扰和隐藏机制。通过对这些文件名堂的无邪使用 ,恶意软件得以实现更高水平的隐藏性 ,进一步提高了逆向剖析和检测的难度 ,同时也为混淆手艺的一连生长涤讪了基础。


2.3 目今阶段:重大混淆与多层对抗 


在目今阶段 ,恶意软件的混淆手艺已经高度重大化 ,普遍团结动态和静态对抗手段 ,以增强隐藏性并对抗多种检测要领。通过将Java层代码混淆、动态加载与Native层加壳手艺融合使用 ,恶意软件将焦点逻辑漫衍于差别条理中 ,大幅提高了检测和剖析的重大性。以下是现在常见的混淆战略:


  • Java层与Native层相团结:恶意软件通过将Java层的代码混淆、动态加载、VMP等手艺与Native层的代码混淆手段相团结 ,将恶意逻辑疏散在差别条理中。这种跨层混淆战略显著增添了检测和剖析的重漂后 ,要求剖析职员同时掌握多种手艺 ,才华周全明确其运行机制。
  • 使用其他开发语言:恶意软件常使用Lua、GoLang、Flutter、易语言等非古板的 C/C++ 语言举行开发 ,从而显著增添逆向剖析的难度。这些语言奇异的特征进一步提高了剖析的重大性 ,同时削弱了古板逆向剖析工具的效率和效果。
  • 运行情形检测及反调试:恶意软件通过检查装备的系统属性、文件系统结构、系统权限状态等 ,判断目的装备是否为模拟器或已获取Root权限 ,并在检测到这些特征时阻止恶意逻辑的运行。同时 ,它们挪用系统API检查调试状态 ,监测调试工具特有的行为 ,甚至自动引发异常以捕获调试工具的反应 ,有用阻止动态剖析工具的滋扰。
  • 商业加固�;な忠眨阂恍┒褚馊砑褂蒙桃导庸瘫;な忠� ,进一步增强了代码的抗逆向能力 ,使得古板的清静工具和剖析要领难以奏效。
  • 代码虚拟化手艺:通过将代码翻译为自界说的虚拟指令集 ,并在运行时通过嵌入的虚拟机诠释执行 ,这种手艺极大地提高了逆向剖析的难度。

例如 ,某恶意软件通过使用Native代码实现对Frida和IDA的检测 ,其代码如下:


图片4.png

图4 Natvie层检测调试器的代码示例


Android恶意软件的混淆手艺已经从简朴的代码混淆逐渐生长到现在重大的跨层团结形式 ,其隐藏性一连增强 ,手艺手段也愈发多样化。这种生长趋势对古板清静检测工具而言是严肃的挑战 ,同时也促使研究职员必需一直立异应对战略 ,以此来应对恶意软件日益重大的混淆手段。在此配景下 ,深入相识并剖析常见的混淆手艺 ,是提升恶意软件剖析和检测能力的要害。接下来 ,我们将通过现实事情中常遇到的恶意软件混淆手艺举行详细剖析 ,探讨这些手艺的应用方法及响应的提防对策。


第三章 常见混淆手段与手艺剖析


在剖析Android恶意软件时 ,清静研究职员通常需要从静态剖析和动态剖析两方面入手。静态剖析往往是最先举行的办法 ,而混淆手艺通过修改代码的结构和表达方法(如字符串加密、代码拆分、动态加载等) ,使恶意软件的剖析难度显著增添。本文将以清静研究职员剖析APK文件的历程为切入点 ,逐步先容种种反混淆战略 ,资助研究职员有用应对差别条理的混淆手艺挑战。


3.1 APK反编译工具的对抗


在剖析Android应用时 ,首先需要使用APK反编译工具(如Apktool、Jadx)提取APK文件中的源代码和资源。然而 ,恶意软件往往会通过多种混淆手段对APK举行�;� ,以滋扰反编译历程。例如 ,恶意软件可能使用Android在剖析APK文件时未严酷校验ZIP名堂的某些字段 ,从而通过改动APK文件的ZIP名堂字段来绕过基于ZIP名堂剖析的反编译工具。这种手段尤其常见于一些基于Android的银行木马(如BianLian、Cerberus和TeaBot)中 ,目的是阻止清静研究职员和自动化剖析平台有用提取APK文件内容 ,进而对抗静态剖析和反病毒检测。


为了更好地明确恶意软件的混淆战略 ,尤其是怎样通过改动ZIP名堂字段来滋扰反编译历程 ,有须要相识一些ZIP文件结构的基本信息。虽然ZIP名堂的详细结构凌驾了本文的讨论规模 ,但我们可以简朴先容一些常见的、恶意软件经常改动的字段。我们以 Python 的zipfile.py �?橹械� ZipInfo 类为例 ,展示了 ZIP文件元数据中的多个要害字段。详细字段及其寄义如图所示:


图片5.png

图5 Zipinfo类的结构信息


其中 ,compress_type、extract_version、reserved和flag_bits都是恶意软件经常改动的字段。这些修改可以导致反编译工具在剖析文件时泛起过失或无法准确读取文件内容 ,从而有用地阻碍静态剖析历程。通过改动这些字段 ,恶意软件不但能够规避常见的反编译工具 ,还能增添被检测的难度 ,提高其在静态剖析中的隐藏性。


在相识了恶意软件怎样通过改动ZIP名堂字段来对抗静态剖析后 ,接下来我们需要关注Android应用中另一个常见的反编译手段——AndroidManifest.xml文件(以下简称“清单文件”)。清单文件是反编译历程中必需剖析的要害部分 ,它包括了应用的焦点设置 ,如组件、权限等信息。因此 ,提取、读取和剖析清单文件是静态剖析APK样本时的主要办法。为了规避反编译工具的识别 ,恶意软件通常通过全心改动清单文件来滋扰其正常剖析。由于清单文件在静态剖析中的主要性和重大性 ,它成为了恶意软件常用的反编译对抗手段之一。若是读者对清单文件的详细结构不太相识 ,可以自行会见以下链接(https://bbs.kanxue.com/thread-194206.html)查阅相关信息。


接下来 ,我们将先容几种常见的清单文件混淆手段 ,探讨恶意软件是怎样通过这些手段对抗反编译工具并隐藏其恶意行为的:


(1)修改XML文件的魔术:恶意软件通过改动清单文件中的魔术字段 ,使得静态剖析工具在剖析时泛起过失。这些修改通常不会影响应用的正常运行 ,但会导致剖析工具无法准确剖析清单文件的结构 ,甚至可能引发反编译工具的异常过失 ,从而阻止反编译历程 ,无法提取源代码。


图片6.png

图6 左图为正常的魔术 ,右图为混淆的魔术示例


(2)改动要害字段:恶意软件可能会改动清单文件中的要害字段 ,例如通过修改StringPool中字符串的个数。虽然Android系统在运行时并不依赖这个字段来盘算字符串的个数 ,而是通过动态盘算来处置惩罚字符串 ,但一些反编译工具却会依赖这个字段来剖析XML文件中的内容。通过改动这个字段 ,恶意软件可以滋扰反编译工具的正常剖析 ,导致工具读取到过失的字符串个数 ,从而无法准确剖析清单文件的结构 ,进而影响静态剖析的准确性和完整性。这种手段有用增添了静态剖析工具的剖析难度 ,提升了恶意软件的隐藏性。


图片7.png

图7 改动StringPoolSize的混淆示例


在上图中 ,我们可以看到 ,stringCount的值为2907 ,而StringOffsets最先于偏移位置36 ,巨细为 11628。StringOffsets是一个包括每个字符串在字符串池中的相对偏移量的数组 ,其巨细为 stringCount * 4 ,即 11628。反编译工具凭证混淆后的stringCount值盘算StringOffsets巨细 ,并举行剖析 ,因此剖析效果蜕化。这种纷歧致性是导致反编译工具剖析失败的缘故原由。然而 ,Android系统在处置惩罚清单文件时并未直接依赖stringCount字段的值。通过审查 Android 源码可以发明 ,Android系统在运行时凭证现实数据动态盘算 stringPoolSize ,而非直接使用文件中提供的数值。


图片8.png

图 8  Android系统源码中盘算mStringPoolSize的代码示例


(3)插入脏数据:有些恶意软件会居心在清单中插入一些脏数据。这种数据不会被现实使用 ,但会破损清单文件的名堂 ,使得剖析工具难以识别其中的有用信息。


图片9.png

图9 左图显示`startEle0`内容 ,右图展示`startEle0`和`startEle1`的偏移量及巨细


上图展示了一个混淆后的清单文件。在左图中 ,第一个startElement的巨细字段为196 ,但header中的size字段为224 ,意味着startElement后附加了28字节的未知数据。右图中 ,第二个startElement的起始位置为0x15A4 ,正好位于插入的这28字节垃圾数据之后(右图中绿色部分所示)。这些多余的28字节会导致反编译工具在后续剖析时蜕化。Android系统能够正常剖析 ,是由于系统盘算每个startElement的位置时 ,仅依赖上一个startElement的起始位置和巨细字段 ,从而自动跳过垃圾数据。


(4)插入超长字符串或特殊字符:为了滋扰静态剖析工具的正常剖析 ,恶意软件可能会在特定字段中插入超长字符串、特殊符号、emoji心情或不可见字符。这些字符虽然不会影响应用的正常功效 ,但它们显著增添了剖析工具的处置惩罚难度。若是反编译工具的容错能力较差 ,这些修改可能导致工具崩�;蛭薹ㄗ既菲饰銮宓ノ募� ,从而使静态剖析变得越发难题。


图片10.png

图10 通过不可见字符实现超长应用名称(label)的示例


上图中 ,清单文件中的label字段从string.xml中的app_name字段读取 ,而app_name字段则包括了不可见字符(如\u0000)和超长字符串。通过这种方法 ,恶意软件可以有用滋扰反编译工具的剖析历程。若是自动化剖析平台的容错机制缺乏 ,如数据库字段对app_name或version字段长度有限制 ,这些改动可能导致异常 ,进而使恶意软件在自动化剖析平台上“隐身” ,难以被检测到。


在正常的清单文件中 ,Start Namespace Chunk通常存储命名空间信息 ,其中Prefix是一个4字节的索引 ,指向字符串池中响应的字符串 ,用于标识命名空间前缀;Uri也是一个索引 ,指向字符串池中体现命名空间URI的字符串。例如 ,在一个未经由混淆的清单文件中 ,我们可以看到Prefix的值对应的字符串为android ,即它引用了标准的Android命名空间。


图片11.png

图11 正常的prefix前缀示例


然而 ,通过对恶意软件中发Prefix字段举行恶意改动 ,攻击者可以导致反编译工具在剖析时爆发过失。这种混淆方法使用了反编译工具对Prefix的依赖 ,使得其在剖析时爆发异常 ,滋扰剖析职员对恶意软件的判断。下图是一个经由混淆的清单文件。


图片12.png

图12 混淆后的prefix示例


从图中可以看到 ,命名空间的Prefix显示为非标准字符串。Prefix的索引值指向字符串池中的位置67 ,而Uri显示正常。审查字符串池中索引67的内容 ,我们发明该字符串是一段长度为20470的乱码字符。如下图所示:


图片13.png

图13 索引值67处的prefix字符串的值示例


这种超长字符串会导致Apktool在反编译时瓦解。在Apktool的过失日志中 ,显示了“Array Size”异常信息。


图片14.png

图14 Apktool反编译时泛起的异常过失示例


经由对瓦解问题的绕过处置惩罚后 ,天生的AndroidManifest.xml文件抵达了16.7MB ,且包括大宗乱码 ,难以阅读。


图片15.png

图15 包括大宗垃圾字符的AndroidManifest.xml文件示例


一个有用的处置惩罚要领是将Prefix的索引值指向字符串池中较短的字符串 ,以便天生的清单文件内容正常显示 ,便于后续剖析和阅读。


别的 ,一些恶意软件会在清单中插入符号或心情符号 ,若反编译工具在剖析时未准确处置惩罚这些特殊字符 ,也可能导致反编译工具瓦解。插入心情符号举行混淆的清单如下图所示:


图片16.png

图16 通过心情符号举行混淆的示例


除了通过改动ZIP名堂字段和混淆清单文件来对抗反编译工具外 ,恶意软件还经常接纳一种强有力的战略——混淆resources.arsc文件。resources.arsc文件是Android应用中存储资源映射关系的焦点文件 ,它维护了资源ID与现实资源文件之间的映射。恶意软件通过改动这个文件 ,能够有用滋扰反编译工具对资源的准确剖析 ,甚至可能导致反编译工具崩�;蛞斐M顺�。例如 ,BOOMSLANG(树蚺)移动诓骗家族就使用这一战略对抗Apktool的反编译历程 ,下图是其反编译失败时Apktool提醒的过失信息。


图片17.png

图17 混淆后的BOOMSLANG样本导致Apktool反编译失败


3.2 代码混淆与反混淆手艺


一旦研究职员突破了APK包的起源混淆 ,接下来便会进入到代码层面的剖析。在这一层面 ,恶意软件通常接纳种种混淆手艺 ,大幅地增添了静态和动态剖析的难度。


3.2.1 标识符混淆


标识符重命名是代码混淆中最常见且最有用的手艺之一 ,旨在通过将有意义的包名、类名、要领名和变量名替换为无意义的、随机天生的名称 ,从而滋扰逆向工程师的剖析历程。别的 ,标识符混淆还能有用避开一些自动化剖析平台 ,这些平台通常依赖于标识符来制订检测规则。通过混淆标识符 ,恶意软件能够规避基于标识符的检测 ,镌汰被识别的危害。常见的标识符混淆战略包括使用随机字符组合(如数字、字母或特殊符号)、接纳非英语语言的标识符(如中文、日语、韩语、俄文等)、使用超长字符标识符 ,或通过替换形状相似但寄义差别的字符(如字母“O”与数字“0”、字母“I”与小写字母“l”等)来滋扰剖析。这些混淆战略使恶意软件能够有用隐藏其功效并增添逆向剖析的难度 ,从而延缓被检测和识别的时间。为了应对这种混淆 ,清静研究职员可以使用带有反混淆功效的反编译工具 ,如Gda、Jeb、Jadx等 ,这些工具有助于快速恢复被混淆的代码并资助识别恶意行为。标识符混淆示例如下图所示:


图片18.png
图18 标识符混淆示例


3.2.2 字符串加密


恶意软件通常接纳编码或加密手段对代码中的敏感字符串举行处置惩罚 ,以避免恶意要害字(如恶意URL、下令或其他敏感数据)在反编译历程中被直接袒露。这些手艺有用地阻止了剖析职员从反编译效果中提取要害信息 ,尤其在对抗自动化剖析平台的静态剖析时 ,具有较强的防护效果。常见的字符串混淆要领包括字符拆分和编码混淆。字符拆分将敏感字符串支解成多个部分 ,程序在运行时再拼接成完整的字符串;而编码混淆则通过对字符串举行加密或使用编码手艺(如Base64编码、简朴加密算法等) ,在程序运行时再举行解码。这些手段不但增添了静态剖析的难度 ,也使得剖析工具无法直接识别出恶意行为。这种手艺使得静态剖析工具无法直接看到要害数据。清静研究职员可以使用动态剖析工具 ,如Frida ,来捕获运行时的解密历程 ,展现恶意软件在运行时所做的操作。字符串加密示例如下图所示:


图片19.png
图19 字符串加密混淆示例


3.2.3 控制流混淆


控制流混淆手艺通过插入无意义的控制结构(如多余的条件分支、循环或冗余代码) ,居心改变程序的执行路径 ,代码块重新排序等手段使得剖析工具在实验剖析程序时 ,陷入过于重大的代码结构中 ,导致无法准确地还原程序的真实逻辑。由于控制流混淆引入了大宗不须要的执行路径 ,静态剖析工具可能无法有用提取出程序的现实验为。


为了应对这种混淆 ,清静研究职员通常需要通过模拟执行以及动态剖析手艺来辅助手动追踪程序的执行流 ,逐步还原程序的真实逻辑。下图展示了一个简朴的控制流混淆示例 ,展示了在混淆前后的控制流结构差别。


图片20.png

图20 控制流混淆前后的差别比照


3.2.4 反射机制与动态加载


动态加载机制是恶意软件常用的反静态剖析手艺 ,主要包括外地动态加载和远程动态加载两种方法。外地动态加载通过加载外地存储的动态库或dex文件 ,动态挪用要领或类 ,使得恶意行为在静态剖析阶段无法被发明。远程动态加载则通过在运行时从远程服务器下载动态库或dex文件来加载并执行恶意代码 ,这种方法进一步规避了静态剖析工具的检测 ,由于恶意代码并未泛起在apk文件中。恶意软件往往通过反射手艺团结动态加载 ,使用运行时的反射挪用机制隐藏恶意行为 ,使得初期静态剖析无法识别这些恶意运动。为了应对这一挑战 ,清静研究职员通常依赖动态剖析手段 ,如通过Frida注入剧本、使用调试工具动态跟踪或通过日志剖析捕获反射挪用的历程 ,从而展现恶意代码的真实验为。这些动态剖析要领能够绕过静态剖析的限制 ,识别通过反射和动态加载隐藏的恶意行为。


接下来 ,我们来看一个使用外地动态加载的恶意代码示例。下图展示了该恶意代码的目录结构。


图片21.png

图21 目录树信息


虽然从外貌上看 ,该目录仅包括几个要领 ,但深入剖析后发明 ,恶意代码通过attachBaseContext要领挪用了一个名为b的要领 ,进一步实现了从assets目录加载加密的代码文件。该文件经由异或解密后 ,通过动态挪用的方法被加载并执行 ,代码如下图所示:


图片22.png
图22 动态加载后通过反射挪用代码示例


3.2.5 Native混淆


Native混淆手艺是通过多种手段加大对恶意软件逆向剖析的难度 ,常见的手艺包括以下几种:


(1)JNI接口混淆:恶意软件通过JNI(Java Native Interface)将要害逻辑转移到.so文件中 ,并通过混淆的JNI接口挪用外地代码。通过将原本清晰的外地要领名替换为无意义的符号或随机字符 ,恶意代码的功效和结构变得越发难以明确和追踪。


图片23.png

图23 JNI接口混淆示例


(2)Session加密:将要害要领存储在自界说的.section中 ,并对这些自界说的.section内容举行加密。由于.so文件在加载时会优先执行.init_array段 ,因此将解密逻辑嵌入到.init_array中。在运行时 ,通过解密要领获取内存中各个.section的起始地址和巨细 ,对加密的.section举行解密还原 ,从而恢复要害要领的正常执行。


图片24.png

图24 Session加密的示例


(3)函数加密:剖析.so文件 ,通过要领名定位目的要领后 ,对其举行加密。在加载.so文件时 ,通过指定要领的地址挪用解密逻辑 ,将加密的要领动态解密还原 ,以实现对要害逻辑的�;�。


图片25.png

图25 JNI加解函数经解密还原的部分代码示例


(4)字符串加密与动态解密:恶意软件通过加密要害字符串(如URL、下令、密钥等) ,并在运行时通过动态解密恢复其原始内容。加密的字符勾通常存储在静态数据区域 ,而解密则通过特定算法或在内存中动态完成 ,从而使得静态剖析工具无法直接提取恶意信息。


图片26.png

图26 Native解密字符串示例


(5)花指令与垃圾代码插入:通过在代码中插入伪指令或无效代码 ,恶意软件能够混淆程序的现实验为。这些花指令没有现实功效 ,但增添了逆向工程的重大性。垃圾代码不但增添了程序的体积 ,还使得追踪和明确恶意代码变得越发难题。


图片27.png

图27 一个简朴的垃圾指令示例


(6)代码加壳与自修改代码:在Native层 ,恶意软件经常使用加壳手艺来隐藏焦点恶意代码。加壳后 ,恶意代码以加密或压缩形式存储 ,只有在运行时才会解密或解压。自修改代码手艺则允许恶意软件在运行时动态天生、修改和执行代码 ,进一步阻止静态剖析工具识别完整的恶意行为。


图片28.png

图28 通过Hook修改代码的示例


(7)反调试与模拟器检测:为了对抗动态剖析 ,恶意软件往往会在Native层嵌入反调试机制 ,例如通过检测调试器的保存(如gdb或Frida)来中止剖析历程。别的 ,恶意软件也会举行模拟器检测 ,通过检查装备是否运行在模拟器或沙盒情形中来阻止被动态剖析工具捕获。


图片29.png

图29 检测模拟器示例


(8)控制流混淆:控制流混淆通过改变程序的执行路径 ,使得剖析职员难以明确程序的现实流程。常见的要领包括插入无效的控制流(如跳转、分支语句)、无用的循环和函数挪用 ,扰乱剖析工具追踪指令的顺序。


图片30.png

图30 一段控制流混淆代码示例


(9)LLVM混淆:LLVM是一种强盛的编译器框架 ,恶意软件通过使用LLVM手艺来对Native代码举行重大的混淆处置惩罚。LLVM混淆能通过优化编译历程 ,天生难以阅读和明确的二进制文件 ,同时对文件巨细影响较小。这种手艺有用增添了逆向工程的重漂后。


图片31.png

图31 LLVM混淆前后比照示例


这些Native混淆手艺通常被组合使用 ,构建多条理的�;せ� ,从而使古板的静态剖析和动态剖析要领面临重大的挑战。借助这些手艺 ,恶意软件能够有用隐藏其真实验为 ,规避清静研究职员的检测以及防护系统的阻挡。别的 ,商业加固�;そ徊教嵘朔阑さ闹苋�。恶意软件常使用商业加固产品对自身举行�;� ,甚至黑灰产软件也频仍接纳此类手艺举行防护 ,如下图所示:


图片32.png
图32 使用商用加固的诈骗应用


3.2.6 代码虚拟化


代码虚拟化是现在最先进的混淆手段之一 ,它通过将原始代码转换为自界说的虚拟机指令 ,极大地提高了代码重漂后和剖析难度。与古板的控制流混淆差别 ,虚拟化手艺将要害代码的执行逻辑封装在虚拟机中 ,使得焦点功效和控制流险些无法通过通例反编译手段还原。以下从DEX虚拟化和SO虚拟化两个维度举行剖析:


DEX虚拟化手艺主要针对Android应用中的Dalvik字节码。这种手艺通过将DEX中的字节码转换成自界说的虚拟机指令 ,然后由Native层虚拟机诠释执行 ,从而�;ひΥ牒徒沟懵呒�。这种转换使得古板的反编译工具难以还原代码的原始逻辑 ,由于它们无法识别转换后的指令集。例如 ,某电商平台通过误差提权实验恶意行为 ,并为隐藏其焦点代码逻辑 ,接纳了一套基于JVM构建的虚拟机�;ぃ╒MP)手艺对代码举行加固。下图展示了其�;ず蟮亩颇谌� ,可以显着看出 ,代码已被虚拟化为高度笼统的虚拟机指令 ,使得古板的反编译和静态剖析要领险些无效。


图片33.png

图33 剖析经vmp�;さ膁ex文件示例


SO虚拟化手艺则关注于�;びτ弥械腘ative代码 ,即SO文件。这种手艺可以通过隐藏符号表、资源加密等方法来�;O文件中的功效不被容易剖析和改动。例如 ,Virbox Protector提供了对SO文件的�;ぱ∠� ,包括隐藏符号表和对特定SO文件的加密�;�。通过这种方法 ,纵然攻击者能够会见到SO文件 ,也无法容易明确文件中的函数和逻辑 ,从而�;ち擞τ玫那寰�。


图片34.png

图34 某商业加固产品对DEX和SO的虚拟化�;は热�


3.3 其他混淆手段


一些恶意软件通过巧妙使用Windows和Android文件系统的差别性 ,有用对抗静态剖析和逆向工程。在Windows系统中 ,文件名不区分巨细写 ,但会保存其原始名堂 ,而Android文件系统则区分巨细写。这种差别使得某些在Windows系统上可能引发冲突或过失的文件名 ,能够在Android装备上正常使用。别的 ,Windows系统对文件名中的特殊字符(如 > < : " / \ | * ?)有严酷限制 ,而Android系统允许这些字符的保存。恶意软件常通过在文件名中嵌入这些特殊字符 ,滋扰基于Windows的剖析工具 ,导致文件无法读取或处置惩罚 ,从而增添逆向剖析的难度。


不但云云 ,恶意软件还可能使用Android文件系统允许同名文件和文件夹共存的特征 ,进一步增添剖析的重大性。例如 ,在Android中 ,一个名为AndroidManifest.xml的文件和一个名为AndroidManifest.xml的文件夹可以同时保存 ,但在Windows系统中则会因命名冲突而无法实现。这种差别可能导致基于Windows的剖析工具处置惩罚这些结构时蜕化或跳过剖析这些要害文件或文件夹 ,进而为恶意软件提供伪装。例如 ,BOOMSLANG恶意软件的一个在野样本接纳了特殊字符混淆和同名文件与文件夹共存的对抗手艺 ,其APK文件在使用ZIP工具翻开时如图所示:


图片35.png

图35 同名文件和文件夹混淆示例


从图中可以看出 ,恶意软件会同时建设 “\AndroidManifest.xml”和“AndroidManifest.xml”目录 ,以及 “\classes.dex” 和“classes.dex”目录。这种操作会在Windows系统上导致文件夹相互笼罩 ,造成文件内容丧失 ,从而影响反编译的完整性。别的 ,恶意软件还会使用不法文件名 ,导致这些文件在使用apktool反编译时被忽略 ,如下图所示:


图片36.png

图36 apktool忽略不法文件名的示例


一些恶意软件还会在文件中嵌入同名但巨细写差别的文件 ,通过使用Windows文件名不区分巨细写的特征滋扰剖析工具 ,造成剖析过失或异常。以下图片展示了一例包括同名但巨细写差别文件的恶意APK示例。


图片37.png

图37 Windows文件系统不区分文件名巨细写的示例


在Android恶意软件中 ,资源混淆是一种常见的对抗手艺 ,普遍应用于assets和res等文件夹中的资源文件。常见的资源混淆手段包括:对assets目录中的资源文件举行加密处置惩罚 ,建设深层嵌套的目录结构或使用畸形目录名称 ,插入大宗无用文件或伪装资源文件 ,将要害资源与无效资源混杂在一起 ,从而增添剖析难度;对res目录中的资源文件举行混淆 ,例如改动资源映射关系、删除资源文件名或更改文件扩展名等。这些手段旨在滋扰剖析工具的剖析历程 ,使得剖析职员难以快速定位和识别要害数据 ,进一步提高逆向工程的难度。下图是一个插入垃圾资源的示例:


图片38.png

图38 插入垃圾资源示例


一些恶意软件通过将原始DEX文件支解成多个小的DEX文件或插入垃圾代码 ,增添静态和自动化剖析的难度。支解DEX文件使剖析工具需要逐个处置惩罚 ,增添了剖析时间和重漂后 ,且这些文件通常通过动态加载手艺在运行时才汇合并 ,难以在静态剖析中识别。别的 ,插入的垃圾代码不执行现实操作 ,但通过虚伪的逻辑和重大的控制流滋扰剖析 ,掩饰恶意功效。此类战略使得恶意软件的行为越发隐藏 ,迫使剖析职员接纳更重大的动态剖析和手动逆向工程要领。一个apk中包括大宗dex的例子如下图所示:


图片39.png

图39 支解多个dex示例


除了上面提到的混淆手艺 ,尚有一些其他常见但未详细先容的手艺 ,这些手艺能进一步增强恶意软件的逆向剖析难度。以下是一张混淆工具的示例图片 ,其中展示了多种混淆功效 ,如:增添包体积、内建自力署名证书、DEX代码混淆、资源混淆、APK防改动等多个功效。


图片40.png
图40 一种混淆工具示例

第四章 现实案例剖析

为了更好地明确混淆手艺的现实应用 ,以下是几个常见的Android恶意软件的混淆手艺案例。


4.1 Joker恶意软件混淆要领


Joker(中文名称“小丑” ,也被称为Bread)是一个在Google Play市肆中极为活跃的恶意软件家族。自2016年12月首次被检测到以来 ,Joker家族的运动一直在一连 ,并且其恶意软件的变种数目也在一直增添。本月最新披露的Google Play市肆中Joker样本信息如下:


图片41.png

图41 GooglePlay上的Joker木马信息


Joker家族的恶意软件能够重复进入Google官方应用市场 ,其要害缘故原由在于其接纳了多种高级代码混淆手艺 ,从而绕过了Google Play Store的清静检测和审查机制。这些混淆手艺包括但不限于:


(1)字符串加密:通过加密要害字符串 ,如API请求和设置信息 ,阻止静态剖析工具的直接识别。

(2)动态加载:将恶意代码疏散到单独的Payload文件中 ,仅在运行时加载 ,以逃避静态代码扫描。 

(3)反射挪用:使用反射机制动态挪用要领 ,隐藏要害功效挪用路径。 

(4)动态下发设置:通过网络请求动态获取设置或恶意指令 ,降低被静态检测的危害。 

(5)使用第三方服务:使用Github页面和存储库存储恶意设置或代码 ,进一步混淆泉源和流量。 


这些手艺的组合使Joker恶意软件能够乐陋习避静态剖析检测 ,其真实验为往往隐藏在重大的动态流程中。为了展现其行为 ,剖析职员通常需要依赖动态调试和运行时解密手艺。针对这些混淆手段 ,清静研究职员可以借助动态剖析工具(如Frida和Xposed)追踪解密历程 ,提取要害数据并识别恶意 API 挪用 ,从而周全还原其恶意行为。


4.2 BadPack的混淆手段


BadPack是恶意软件通过改动ZIP文件结构头 ,使Apktool和Jadx中剖析工具无法正常剖析。其通过使用非标准的压缩算法来滋扰反编译工具的正常运行。经010 Editor剖析该APK文件名堂 ,发明其压缩要领值为0xF753 ,如下图所示:


图片42.png

图42 改动apk文件压缩算法标识示例


这一数值并不属于任何已知的标准压缩要领 ,因此导致反编译工具无法识别和处置惩罚该文件。凭证标准ZIP名堂规范 ,压缩要领的取值通常如图所示。


图片43.png

图43 ZIP支持的各压缩要领的标识值示例


凭证Android系统源代码 ,当系统遇到非COMP_DEFLATE(即 0x08)压缩要领时 ,会默认将输入文件按 “未压缩” (COMP_STORED ,即 0x00)方法处置惩罚。详细而言 ,系统会直接读取文件的未压缩数据长度 ,并以此举行剖析。因此 ,恶意软件使用了Android系统对ZIP名堂的容错机制 ,通过使用不法的压缩算法举行混淆 ,从而抵达规避反编译工具的目的。这种混淆手艺简朴却有用。在剖析Android恶意软件时 ,若遇到类似情形 ,可将压缩要领修改为0以便准确解压和剖析。


APK伪加密通过修改ZIP文件的头部 ,将加密标记设置为true ,但并未现实对文件内容举行加密。这种手艺使用了Android系统在处 ZIP文件时不会验证头部的加密标记 ,而通俗的解压软件则会检测该标记。例如 ,当使用RAR工具解压该APK文件时 ,会提醒用户输入密码 ,如下图所示:


图片44.png

图44 伪加密的混淆示例


由于Jeb和Jadx都使用标准的ZIP库 ,因此无法正常解压并反编译该文件。它们的反编译过失信息如下图所示:


图片45.png

图45 无法使用Jadx和Jeb翻开的混淆APK示例


通过接纳BadPack手艺 ,恶意软件将自身伪装为异常名堂的文件 ,使用反编译工具对文件剖析的严酷性触发异常 ,从而显著增添静态剖析的难度。这种战略有用滋扰了清静研究职员的剖析流程 ,提升了恶意软件的隐藏性。 


针对这一手艺 ,可以通过以下要领举行应对: 


(1)使用修订后的ZIP库:通过修改ZIP解压库的剖析逻辑 ,忽略非标准字段或异常名堂 ,确保文件内容能够准确解压。 

(2)编写修复剧本:剖析BadPack文件的异常字段 ,针对特命名堂设计剧本 ,自动修正文件结构 ,使其恢复为标准名堂以便后续剖析。 

这些应对步伐能够有用绕过BadPack手艺的混淆手段 ,为静态剖析提供可靠的数据支持。


4.3 SpyNote恶意软件混淆战略


SpyNote是一种特工软件 ,常通过短信和垂纶网站等方法举行撒播。攻击者通常发送包括恶意链接的SMS新闻或建设伪装成正当网站的垂纶页面 ,诱导目的用户点击链接并下载伪装成正当应用程序的恶意软件。自2016年在恶意软件论坛首次曝光以来 ,SpyNote一直作为一种一连威胁的恶意工具在全球规模内活跃。果真数据显示 ,今年1月和2月时代 ,SpyNote的新增样本数目已凌驾3400个 ,批注其威胁运动仍在快速扩散。最新披露的威胁情报显示 ,SpyNote伪装成清静应用程序实验攻击 ,其主要目的是加密钱币账户 ,窃取私钥和余额信息 ,尤其针比照特币、以太坊和Tether等热门数字资产。相关攻击事务如下图所示:


图片46.png

图46 SpyNote仿冒清静软件实验攻击


SpyNote 除了通过多种渠道举行撒播 ,还接纳了一系列高级混淆与隐藏战略 ,以规避检测和剖析。以下是其主要混淆手艺的简要概述:


(1)改动 APK 文件的 ZIP 名堂 ,从而导致反编译APKTool在剖析时失败 ,如下图所示:


图片47.png

图47 修改zip名堂导致Apktool反编译失败的示例


(2)改动清单文件魔术、插入垃圾字符串。修改的魔术示例如下图:


图片48.png

图48 修改魔术混淆示例


(3)使用相近字符实现代码混淆 ,如下图所示:


图片49.png

图49 相近字符代码混淆示例


(4)对resources.arsc文件混淆 ,使jadx反编译工具在剖析时蜕化 ,如下图所示:


图片50.png

图50 Jadx无法剖析resources.arsc文件



第五章 结论与未来展望


Android恶意软件的混淆手艺一直进化 ,从简朴的代码重命名到重大的动态加载与反调试手艺 ,恶意软件通过这些手段极大地提升了恶意代码的隐藏性和剖析难度。随着混淆手艺的一直生长 ,清静研究职员也需要一直更新自己的剖析手段 ,从静态剖析扩展到动态剖析、行为剖析等多维度的剖析要领。


未来 ,随着机械学习、人工智能等手艺的引入 ,混淆手艺和逆向剖析手艺将继续泛起出越发重大和高效的态势。在这种情形下 ,开发更强盛的自动化检测和剖析工具将是破解恶意软件防护的要害。同时 ,开发者和清静专家也应增强对混淆手艺的研究 ,制订出更具针对性的应对战略 ,以确保Android平台的清静性。

通过一连的研究和手艺立异 ,我们有望能够更好地对抗恶意软件的混淆手艺 ,�;び没У囊接肭寰�。


酷游官网起劲防御实验室(ADLab)


ADLab建设于1999年 ,是中国清静行业最早建设的攻防手艺研究实验室之一 ,微软MAPP妄想焦点成员 ,“黑雀攻击”看法首推者。阻止现在 ,ADLab已通过 CNVD/CNNVD/NVDB/CVE累计宣布清静误差5000余个 ,一连坚持国际网络清静领域一流水准。实验室研究偏向涵盖基础清静研究、数据清静研究、5G清静研究、人工智能清静研究、移动清静研究、物联网清静研究、车联网清静研究、工控清静研究、信创清静研究、云清静研究、无线清静研究、高级威胁研究、攻防系统建设。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。



adlab.jpg