• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

在恶意代码中5种常见的混淆

恶意软件的演变速度超过以往任何时候。随着安全措施的改进,用于绕过这些措施的技术也在进步。这场持续的军备竞赛催生了越来越复杂的混淆方法,即使是对经验丰富的分析人员来说也极具挑战。

本篇博客将深入探讨当前在实战中观察到的一些尖端混淆策略。我们将剖析这些策略的工作原理,并讨论检测及缓解它们的策略。无论您是安全专业人士还是对最新的网络安全趋势感兴趣,理解这些技术对于当今的数字环境至关重要。

什么是混淆

在恶意软件中,混淆是指对代码进行掩饰,使其难以理解或被检测发现。这类似于数字伪装,帮助恶意软件与合法的进程和文件混为一体。

混淆技术的复杂程度不一,从简单到极为复杂都有。最基本的混淆可能只是将变量名称改为无意义的字符串。更高级的方法包括:

打包:压缩恶意软件,并附带一个解包小程序。
加密:对代码的部分内容进行加密,仅在运行时才解密。
多态性:不断改变恶意软件的代码结构,同时保持其核心功能不变。

这些技术有多个目的。它们减缓了分析过程,帮助恶意软件长时间保持未被发现的状态。同时,它们也使得安全工具更难识别已知威胁。

1. XOR(异或)

XOR(异或)加密是一种经典的混淆技术,由于其简单有效,至今仍被广泛使用。它通过原始代码的每个字节与其密钥(或重复的密钥模式)进行位级XOR运算来工作。以下是XOR运算的真值表:

– A XOR 0 = A
– A XOR A = 0
– 0 XOR 1 = 1
– 1 XOR 1 = 0

在恶意软件上下文中,攻击者会用特定的密钥对恶意代码进行XOR操作,使得代码在静态分析时看似随机数据,从而难以直接阅读或理解。只有使用相同的密钥再次执行XOR操作,才能将代码还原成可读形式。这种方法虽然基础,但在对抗简单的静态签名检测时仍然十分有效。

绕过方法:

– 暴力破解:对于单字节密钥,尝试所有256种可能性。这是最直接但可能效率较低的方法。

– 频率分析:在较大的样本中,最常见的字节通常表示“空格”字符与密钥进行XOR运算的结果( XOR(space, key)。利用这一特性可以帮助识别XOR密钥。

– 已知明文攻击:如果你能猜测或确定原始内容的一部分(比如常见的文件头信息),就可以据此推导出密钥。

– 熵分析:经过XOR运算的数据通常具有较高的熵,这意味着数据中的不确定性或随机性较大。监测数据的熵可以帮助识别出被混淆的代码段。

– 工具辅助:像XORSearch(https://blog.didierstevens.com/programs/xorsearch/)这样的工具可以自动化上述很多过程,简化分析。而对于更加复杂的案例,编写自定义的IDA或Ghidra脚本来进行动态脱壳(on-the-fly deobfuscation)也是有效的策略,这允许在逆向工程过程中即时解码混淆的代码,从而更深入地理解恶意软件的行为。

2. 子程序重排序

这种技术会打乱代码中函数的顺序,打破了分析人员预期的逻辑流程。它通常会结合控制流混淆,创造出一系列令人困惑的子程序间跳转迷宫。

恶意软件可能会极端化这一点,将函数拆分成微小的片段,并将这些片段散布在整个代码中。每个片段末尾都跳转到下一个部分,形成了所谓的“意大利面式代码”,手动跟踪起来极为繁琐。

绕过方法:

– 控制流图分析:使用如IDA Pro之类的工具可视化程序流程,有助于重新构建逻辑顺序。

– 动态分析:在调试器中运行代码可以揭示真实的执行路径。

– 符号执行:采用高级技术同时探索多条代码路径,有助于绘制出程序的行为图谱,这对于理解重排序后的复杂流程特别有用。

3. 代码转置

代码转置将重排提升到了指令级别。单个指令或小型代码块被打乱,并添加了跳转指令以保持正确的执行顺序。这会使静态分析变得极其困难,因为按顺序查看代码时,其显得毫无意义。

绕过方法:

– 动态二进制插桩:使用Intel Pin等工具可以帮助追踪实际的执行路径。

– 仿真:在仿真环境中运行代码,可以让你记录并重新排序执行中的指令。

– 定制反汇编器:对于极端情况,编写了解混淆方案的定制反汇编器可能是必要的。

4. 代码集成

代码集成涉及将恶意代码与良性代码混合,通常是通过将其插入到合法程序或库中。该技术利用了对已知软件的信任来逃避防御。

恶意软件可能被嵌入到合法的软件更新中,恶意功能被仔细地编织到现有代码中,并使用现有的变量名,模仿编程风格,使得其极难被发现。

绕过方法:

– 差异分析:将可疑文件与已知的干净版本进行比较,以识别修改之处。

– 行为分析:检查异常的网络连接、文件操作或API调用。

– 代码流分析:识别到注入函数的不寻常分支或调用。

– 内存取证:分析内存转储以查找隐藏或注入的代码。

5. 打包器(Packers)

打包器技术通过压缩和加密原始代码,并附带一个小的解包程序(stub),在运行时将代码解压和解密。这种方法不仅混淆了代码,降低了其可读性,而且还能减少文件大小,从而使恶意软件有可能规避基于文件大小的检测系统。此外,解包过程的动态性加大了分析难度,因为静态分析工具无法直接查看到恶意代码的真实内容,需要通过动态分析或在解包后捕获并分析实际运行的恶意代码。

UPX 是一种常用的恶意软件打包实用程序

现代的打包程序通常采用反调试、反虚拟机和其他规避技术。有时恶意软件作者会使用具有先进技术的自定义打包程序,例如 Clever Hans 式检测 — 如果检测到有人试图分析它们,它们就会采取不同的行为,巧妙地改变解包程序以生成良性代码而不是实际的恶意软件。

绕过方法:

– 静态解包(Static Unpacking):识别出使用的打包器(DIE这样的工具可能有所帮助),如果能找到对应的解包工具,则利用它们。静态解包尝试在不执行程序的情况下,通过分析和修改可执行文件来移除打包层。

– 动态解包(Dynamic Unpacking):在受控的环境中运行打包后的程序,当程序自行解压和解密代码后,从内存中转储(dump)出解包后的代码。这种方式能够处理执行时环境依赖较强的情况,但需要一定的技术和工具支持,例如使用调试器(debugger)监控解包过程。

– 手动解包(Manual Unpacking):对于自定义或高度混淆的打包器,可能需要手动追溯和分析解包例程。这涉及到对程序入口点的定位、对解包流程的逐步跟踪,以及对关键跳转和解密操作的理解。此方法最为复杂,但也是对付高度混淆技术的有效手段,要求分析人员具备深厚的专业知识和耐心。

 

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在恶意代码中5种常见的混淆
喜欢 (0)