
C++ инструмент, который патчит вызовы Windows API для обхода проверок размера оперативной памяти в песочницах, позволяя вредоносному ПО избегать обнаружения в изолированных средах анализа.
Песочницы часто используются для анализа вредоносного ПО. Они предоставляют временную, изолированную и безопасную среду, в которой можно наблюдать, проявляет ли подозрительный файл вредоносное поведение. Однако разработчики вредоносного ПО также разработали методы обхода песочниц и аналитических сред. Один из таких методов — выполнение проверок, чтобы определить, работает ли машина, на которой выполняется вредоносное ПО, под управлением реального пользователя. Одной из таких проверок является размер ОЗУ. Если размер ОЗУ нереалистично мал (например, 1 ГБ), это может указывать на то, что машина является песочницей. Если вредоносное ПО обнаруживает песочницу, оно не будет выполнять свои истинные вредоносные действия и может показаться безвредным файлом.
API GetPhysicallyInstalledSystemMemory получает объем оперативной памяти, физически установленной на компьютере, из таблиц прошивки SMBIOS. Он принимает параметр типа PULONGLONG и возвращает TRUE в случае успеха, устанавливая TotalMemoryInKilobytes в ненулевое значение. В случае неудачи возвращается FALSE.

Объем физической памяти, полученный функцией GetPhysicallyInstalledSystemMemory, должен быть равен или превышать объем, сообщаемый функцией GlobalMemoryStatusEx; если он меньше, данные SMBIOS повреждены, и функция завершается ошибкой с кодом ERROR_INVALID_DATA. Поврежденные данные SMBIOS могут указывать на проблему с компьютером пользователя.

Регистр rcx содержит параметр TotalMemoryInKilobytes. Чтобы перезаписать адрес перехода GetPhysicallyInstalledSystemMemory, я использую следующие опкоды: mov qword ptr ss:[rcx],4193B840. Это помещает значение 4193B840 (или 1.1 ТБ) в rcx. Затем инструкция ret используется для извлечения обратного адреса из стека и перехода к нему. Таким образом, каждый раз, когда вызывается GetPhysicallyInstalledSystemMemory, она будет устанавливать rcx в указанное пользователем значение.
