
샌드박스 RAM 크기 검사를 우회하기 위해 Windows API 호출을 패치하여 격리된 분석 환경에서 탐지를 회피할 수 있는 C++ 도구입니다.
샌드박스는 일반적으로 악성코드를 분석하는 데 사용됩니다. 이는 의심스러운 파일이 악성 행동을 보이는지 관찰할 수 있는 임시적이고 격리된 안전한 환경을 제공합니다. 그러나 악성코드 개발자 또한 샌드박스 및 분석 환경을 회피하는 방법을 개발해 왔습니다. 그러한 방법 중 하나는 악성코드가 실행 중인 머신이 실제 사용자에 의해 운영되고 있는지 확인하는 검사를 수행하는 것입니다. 그러한 검사 중 하나는 RAM 크기입니다. RAM 크기가 비현실적으로 작은 경우(예: 1GB) 머신이 샌드박스임을 나타낼 수 있습니다. 악성코드가 샌드박스를 감지하면 실제 악성 행동을 실행하지 않고 정상 파일인 것처럼 보일 수 있습니다.
GetPhysicallyInstalledSystemMemory API는 SMBIOS 펌웨어 테이블에서 컴퓨터에 물리적으로 설치된 RAM의 양을 검색합니다. 이 API는 PULONGLONG 매개변수를 사용하며, 함수가 성공하면 TRUE를 반환하고 TotalMemoryInKilobytes를 0이 아닌 값으로 설정합니다. 함수가 실패하면 FALSE를 반환합니다.

GetPhysicallyInstalledSystemMemory 함수로 검색된 실제 메모리 양은 GlobalMemoryStatusEx 함수에서 보고된 양과 같거나 커야 합니다. 더 적으면 SMBIOS 데이터가 손상된 것이며 함수는 ERROR_INVALID_DATA로 실패합니다. 손상된 SMBIOS 데이터는 사용자 컴퓨터에 문제가 있음을 나타낼 수 있습니다.

레지스터 rcx는 매개변수 TotalMemoryInKilobytes를 보유합니다. GetPhysicallyInstalledSystemMemory의 점프 주소를 덮어쓰기 위해 다음 opcode를 사용합니다: mov qword ptr ss:[rcx],4193B840. 이는 4193B840(또는 1.1TB) 값을 rcx로 이동합니다. 그런 다음 ret 명령어를 사용하여 스택에서 반환 주소를 팝하고 점프합니다. 따라서 GetPhysicallyInstalledSystemMemory가 호출될 때마다 rcx를 사용자 정의 값으로 설정합니다.
