I already wrote about a relocater and different kinds of virtual machines. Between the two of them, there is another kind of executable, simpler than virtual machine but particularly suitable for obfuscation:
a mutater, or polymorphic code.
Similar to virtual machines, some data represents the virtual code to execute. However, in this case, the architecture is strictly the same as the cpu. The main point of mutation is randomization. And if you add some junk code in the middle, you get what happens when virii modifies themselves from one file to the other.
this is indeed simpler than virtualization, yet quite efficient to make reverse engineering (or identification) more difficult. That's why this technique is present in most advanced virii or packers. In packers, code doesn't mutate itself, it's just some part of code that is randomly generated on the fly before being executed, like in the example of this post.
Here are 2 different executions:
MOV ECX,FC07379C PUSH 40
XOR ECX,FC0737DC PUSH Tada
PUSH ECX NOP
NOP PUSH Helloworld
PUSH Tada PUSH 0
NOP NOP
MOV ECX,F8477840 CALL MessageBoxA
XOR ECX,F80779BC MOV ECX,0A2EF248
PUSH ECX XOR ECX,0A2EF248
NOP PUSH ECX
PUSH 0 CALL ExitProcess
CALL MessageBoxA
PUSH 0
PUSH 00400136
PUSH ExitProcess
CALL $ + 5
RETN
Download links: Binary Source
[...]
déplaceur < muteur < virtualiseur
J'ai déjà parlé d'un déplaceur et de différentes formes de machines virtuelles. Entre les deux, il y a une autre forme d'exécutable, plus simple que les machines virtuelles, mais particulièrement utile pour la dissimulation :
un muteur, autrement dit du code polymorphique.
Comme pour les machines virtuelles, des données représentent le code virtuel à exécuter. Mais dans ce cas, l'architecture est la même que le processeur. Le point important est que le code est généré aléatoirement. Et si on ajoute du code inutile au milieu, on obtient ce qui se produit quand un virus se modifie d'un fichier à l'autre.
C'est effectivement plus simple que la virtualisation, mais c'est quand même efficace pour rendre l'analyse de code (ou l'identification) plus difficile. C'est pour cela que cette technique existe dans tous les virus ou packeurs avancés : dans un packeur, le code ne mute pas lui-même, c'est juste une partie du code qui est générée à la volée de manière aléatoire avant d'être exécutée, comme dans l'exemple de ce billet.
Voici deux exécutions consécutives :
MOV ECX,FC07379C PUSH 40
XOR ECX,FC0737DC PUSH Tada
PUSH ECX NOP
NOP PUSH Helloworld
PUSH Tada PUSH 0
NOP NOP
MOV ECX,F8477840 CALL MessageBoxA
XOR ECX,F80779BC MOV ECX,0A2EF248
PUSH ECX XOR ECX,0A2EF248
NOP PUSH ECX
PUSH 0 CALL ExitProcess
CALL MessageBoxA
PUSH 0
PUSH 00400136
PUSH ExitProcess
CALL $ + 5
RETN
Télécharger : Binaire Source
Nice, very clear example.
ReplyDelete