API Hammering(API 暴力攻击) 是一种极具对抗性的反沙箱技术。它的核心思想不是简单的休眠,而是通过产生大量的“背景噪音”来干扰监控系统。它主要通过高频、快速地调用大量随机的合法 WinAPI 来达成目的。
核心原理:
- 延迟执行(Delay Execution):不同于传统的
Sleep(容易被沙箱快进),API Hammering 通过执行数以万计的真实 API 调用来消耗 CPU 时间。沙箱如果尝试快进每一个 API,可能会导致逻辑错误;如果不快进,则会因为分析超时而放弃。 - 调用栈混淆(Call Stack Obfuscation):当恶意代码执行关键操作(如解密 Payload 或注入内存)时,如果安全软件在此时进行堆栈回溯(Stack Walk),它会发现调用栈中充斥着大量看似无害的、随机的系统调用(如获取时间、查询系统信息等)。这使得分析人员和自动化检测引擎很难定位到真正的恶意逻辑起点。
1、I/O 函数
在 API Hammering 的实战中,选择哪些 API 至关重要。这里选择了 CreateFileW、WriteFile 和 ReadFile。这三者之所以被选中,是因为 文件 I/O 操作 是计算机系统中最耗时的任务之一,涉及到用户态与内核态的频繁切换以及硬件读写开销。
通过循环调用这些 API 处理海量数据,恶意软件可以人为地制造出巨大的 CPU 和磁盘负载。
实现机制:
- CreateFileW:反复在临时目录创建、打开和关闭文件。每次调用都需要操作系统进行权限检查、句柄分配和文件系统元数据更新。
- WriteFile:向文件中写入大量随机数据。这不仅消耗 CPU 计算随机数的时间,更会强制操作系统管理磁盘缓冲区。
- ReadFile:将刚刚写入的数据读回内存。这种“写了读,读了删”的无意义循环,对真实的物理机器来说只是短暂的负载,但对虚拟化的沙箱环境来说,处理这些模拟硬件操作会产生巨大的计算压力。
2、实现步骤
API Hammering 可通过以下五个步骤,在 dwStress(循环压力值)的驱动下反复执行。
步骤 1、路径伪装
使用 GetTempPathW 获取系统临时文件夹路径(通常为 C:\Users\<用户>\AppData\Local\Temp)。在该目录下创建临时文件,能够完美混淆在系统安装、下载或更新时的正常 IO 流量中。
步骤 2、数据生成与写入
生成一个固定大小的随机缓冲区,通过 WriteFile 写入文件。这步操作不仅消耗了产生随机数的 CPU 周期,还产生了真实的磁盘写入负载。
步骤 3、重新打开并标记
关闭文件写入句柄,并使用 CreateFileW 重新打开文件读取句柄。此时使用 FILE_FLAG_DELETE_ON_CLOSE 标志。这是一个高级技巧,它告诉操作系统:一旦该文件所有的句柄都被关闭,立即物理删除该文件。
步骤 4、数据回读与清理
使用 ReadFile 将刚才写入的数据重新读入内存。随后立即清理并释放(Free)该内存缓冲区。这通过内存与磁盘的往返传输,进一步拉长了执行时间。
步骤 5、自动销毁
最终关闭句柄,由于之前设置了删除标志,文件会自动从磁盘消失,不留任何痕迹。
3、通过 API Hammering 延迟执行
为了通过 API Hammering 实现延迟执行,我们需要先计算出 ApiHammering 函数执行特定次数循环所需的时间。为此,可以使用 GetTickCount64 WinAPI 来分别测量调用该函数前后的系统时间戳。在本例中,我们将循环次数设定为 1000 次。
|
|

输出结果表明,在当前机器上执行 1000 次 API 轰击循环大约需要 1.828 秒。这是一个关键的基准数据,它揭示了该技术在实际环境中的效能特征。
转换秒为循环次数:
以下SECTOSTRESS宏可以将秒数i转换为循环次数。由于 1000 个循环周期需要 1.828 秒,每秒将需要 1000 / 1.828 = 547。宏的输出应作为ApiHammering函数的参数使用。
|
|
上述图片的输出,显示 ApiHammering 能够延迟执行 3250 毫秒,这大约是传递给 SECTOSTRESS 宏的值。
4、在线程中执行 API Hammering
ApiHammering 函数可以在一个运行在后台的线程中执行,直到主线程执行结束。这可以通过使用 CreateThread WinAPI 实现。ApiHammering 函数应该传递 -1 的值,使其无限循环执行。
|
|
在无符号整数中,-1 代表 最大值(例如 4,294,967,295)。告诉轰击函数:“给我执行尽可能多次的调用,直到把沙箱的监控时长耗尽为止。”
核心目的是:在执行真正的恶意代码(如注入、加密等)之前,先通过大量的无意义操作耗尽安全分析产品的耐心和资源。
(1)绕过沙箱的“睡眠跳过”(Bypassing Sleep Skipping)
许多杀毒软件(AV)和沙箱在分析可疑程序时,如果遇到 Sleep() 函数,会自动“加速时间”或直接跳过等待过程,以便快速看到程序后面的行为。
- API Hammering 的对策: 它不使用
Sleep,而是通过真实的、高频的 API 调用(如循环调用GetProcessHeap数百万次)来产生延迟。 - 结果: 沙箱无法简单地跳过这些真实的指令执行,只能老老实实地运行这些循环,从而被迫消耗掉大量的真实时间。
(2)干扰行为日志(Log Obfuscation/Flooding)
动态分析工具(如 Windows API Monitor 或 EDR 软件)会记录程序调用的 API。
- API Hammering 的对策: 短时间内产生数万条甚至数百万条垃圾 API 调用记录。
- 结果: 这会撑爆分析日志,或者让安全人员在复核日志时,面对密密麻麻的垃圾数据,很难一眼找到真正致命的那几行代码(比如
WriteProcessMemory或CreateRemoteThread)。
(3)躲避启发式扫描(Heuristic Evasion)
一些启发式引擎会根据 API 调用的比例来判断。
- 如果一个程序一上来就申请内存并注入,这很可疑。
- 如果一个程序先做了几千万次正常的系统信息查询,行为看起来虽然奇怪,但更像是某种性能测试或复杂的初始化过程,可能会降低其“恶意评分”。
5、完整代码
|
|
运行效果:
