
Outil C++ qui patche les appels API Windows pour contourner les vérifications de taille de RAM des sandbox, permettant aux logiciels malveillants d'échapper à la détection dans des environnements d'analyse isolés.
Les sandboxes sont couramment utilisées pour analyser les malwares. Elles fournissent un environnement temporaire, isolé et sécurisé dans lequel observer si un fichier suspect présente un comportement malveillant. Cependant, les développeurs de malwares ont également développé des méthodes pour contourner les sandboxes et les environnements d'analyse. L'une de ces méthodes consiste à effectuer des vérifications pour déterminer si la machine sur laquelle le malware est exécuté est utilisée par un véritable utilisateur. L'une de ces vérifications est la taille de la RAM. Si la taille de la RAM est irréalistement petite (par exemple, 1 Go), cela peut indiquer que la machine est une sandbox. Si le malware détecte une sandbox, il n'exécutera pas son véritable comportement malveillant et pourra sembler être un fichier bénin.
L'API GetPhysicallyInstalledSystemMemory récupère la quantité de RAM physiquement installée sur l'ordinateur à partir des tables de firmware SMBIOS. Elle prend un paramètre PULONGLONG et retourne TRUE si la fonction réussit, en définissant TotalMemoryInKilobytes à une valeur non nulle. Si la fonction échoue, elle retourne FALSE.

La quantité de mémoire physique récupérée par la fonction GetPhysicallyInstalledSystemMemory doit être supérieure ou égale à celle rapportée par la fonction GlobalMemoryStatusEx ; si elle est inférieure, les données SMBIOS sont mal formées et la fonction échoue avec ERROR_INVALID_DATA. Des données SMBIOS malformées peuvent indiquer un problème avec l'ordinateur de l'utilisateur.

Le registre rcx contient le paramètre TotalMemoryInKilobytes. Pour écraser l'adresse de saut de GetPhysicallyInstalledSystemMemory, j'utilise les opcodes suivants : mov qword ptr ss:[rcx],4193B840. Cela déplace la valeur 4193B840 (soit 1,1 To) vers rcx. Ensuite, l'instruction ret est utilisée pour dépiler l'adresse de retour et sauter vers elle. Par conséquent, chaque fois que GetPhysicallyInstalledSystemMemory est appelé, elle définira rcx à la valeur personnalisée.
