Dans le monde du malware, la course entre les créateurs de virus et les éditeurs antivirus est bien connue, les premiers essayant de rendre leurs créations les plus invisibles possibles aux yeux des solutions développées par les seconds.
Mais avant que le-dit malware puisse être détecté comme malveillant par un antivirus, il fait l'objet d'une analyse poussée, visant à en comprendre le fonctionnement, pour ainsi en tirer une signature permettant la détection, et une marche à suivre pour la désinfection.
Les créateurs de malware doivent donc maintenant aussi contrer les outils utilisés pour l'analyse, dont le premier est la machine virtuelle, qui permet de lancer un virus sans crainte puisque la restauration d'un système sain se fait en quelques instants.

Un malware récupéré récemment, par le biais d'une bannière Flash malveillante présente sur plusieurs sites web, nous a montré une nouvelle forme de détection de machine virtuelle, impactant QEmu (et probablement Virtual PC, ainsi que VMware sans l'accélération matérielle).

En effet, le packer utilisé, encore non identifié, après avoir déchiffré une partie de lui-même, exécute la fonction asin présente dans la bibliothèque msvcrt. Or, cette fonction retournera dans le registre EAX une valeur différente selon la valeur du registre Control Word de la FPU (typiquement, la valeur 0 sera affectée à EAX si FCW ne vaut pas 0x27F).

Le registre FCW subit une suite d'opérations équivalentes à un ET logique avec le masque 0x23F lors du chargement de la bibliothèque msvcrt.dll (initialisation des registres de la FPU). D'après les spécifications d'Intel, le bit 6 du registre FCW est marqué comme reserved, et il a été constaté que celui-ci était fixé à 1 sur des machines physiques.

Sur une machine physique, FCW aura donc pour valeur 0x27F après le chargement de la bibliothèque. Malheureusement, le mode full emulation de QEmu (i.e. sans utiliser kqemu) ne positionne pas le bit 6 à 1; le registre FCW prend donc la valeur 0x23F, provoquant ainsi une valeur différente d'EAX à la sortie de la fonction asin.

Selon la valeur d'EAX, le malware va initialiser ou non les variables de la boucle de déchiffrement, ce qui provoquera son propre plantage si celles-ci ne sont pas fixées (écriture dans une zone mémoire non autorisée), empêchant ainsi toute analyse.

On peut s'attendre à voir de plus en plus de malwares utiliser ce genre de méthodes de détection, empêchant ainsi les analyses automatisées basées sur des machines virtuelles. La course est loin d'être finie...