沙箱通常用于分析恶意软件。它们提供了一个临时的、隔离的且安全的环境,用以观察可疑文件是否表现出任何恶意行为。然而,恶意软件开发者已开发出多种方法来逃避沙箱和分析环境。其中一种方法是执行检查,以确定执行恶意软件的机器是否正在由真实用户操作。其中一种检查是RAM大小。如果RAM大小小得不切实际(例如1GB),则可能表明该机器是一个沙箱。如果恶意软件检测到沙箱,它将不会执行其真正的恶意行为,并可能表现为一个良性文件。
GetPhysicallyInstalledSystemMemory API 从 SMBIOS 固件表中检索计算机上实际安装的 RAM 数量。它接受一个 PULONGLONG 参数,如果函数成功,则返回 TRUE,并将 TotalMemoryInKilobytes 设置为非零值。如果函数失败,则返回 FALSE。

由 GetPhysicallyInstalledSystemMemory 函数检索的物理内存量必须等于或大于由 GlobalMemoryStatusEx 函数报告的量;如果小于此值,则 SMBIOS 数据格式错误,函数失败并返回 。格式错误的 SMBIOS 数据可能表明用户计算机存在问题。
ERROR_INVALID_DATA
寄存器 rcx 保存参数 TotalMemoryInKilobytes。为了覆盖 GetPhysicallyInstalledSystemMemory 的跳转地址,我使用以下操作码:mov qword ptr ss:[rcx],4193B840。这会将值 4193B840(即 1.1 TB)移动到 rcx。然后,使用 ret 指令将返回地址从堆栈中弹出并跳转到该地址,因此,每当调用 GetPhysicallyInstalledSystemMemory 时,它都会将 rcx 设置为自定义值。
