Map and projects (the most frequently updated page of this blog)

2010/01/11

You'll stumble in my footsteps

A different flow obfuscation: a relocater
I wrote a simple executable, implementing an idea by Piotr Krysiuk, where all routines are made to be executed at the same address. Because of that feature, following the flow is potentially difficult, and creating a direct dump could be annoying as no disassembler allow different pieces of code to be present at the same address.

To give you an example, here are the 2 functions of that binary upon their execution:
First:
004000FA 6A 40 PUSH 40

004000FC 68 6E014000 PUSH 0040016E ; ASCII "Tada!"
00400101 68 74014000 PUSH 00400174 ; ASCII "Hello World!"
00400106 6A 00 PUSH 0
00400108 E8 55000000 CALL 00400162 ; MessageBoxA
Later:
004000FA 6A 00 PUSH 0
004000FC E8 67000000 CALL 00400168 ; ExitProcess


As stated before, they are both made to run at the same address. If you want to have a flat file, you will need to relocate some code.

Such a 'relocater packer' would be the little brother of a mutater or a virtualiser:
in all cases, you'd need to disasm and analyse, but in this case, the only thing you need to identify and relocate are immediate dwords.

Binary Source

[...]

Une dissimulation de flux différente: un déplaceur

J'ai écrit un simple exécutable, d'après une idée de Piotr Krysiuk, où toutes les routines sont faites pour s'exécuter depuis la même adresse. A cause de ce point particulier, suivre le flux de l'exécution peut s'avérer difficile, et créer un dump peut être compliqué, puisqu'aucun désassembleur n'autorise des instructions différentes à la même adresse.

Pour vous donner un exemple, voici les 2 routines du binaire lors de leur exécution:
D'abord:
004000FA 6A 40 PUSH 40

004000FC 68 6E014000 PUSH 0040016E ; ASCII "Tada!"
00400101 68 74014000 PUSH 00400174 ; ASCII "Hello World!"
00400106 6A 00 PUSH 0
00400108 E8 55000000 CALL 00400162 ; MessageBoxA
Ensuite:
004000FA 6A 00 PUSH 0
004000FC E8 67000000 CALL 00400168 ; ExitProcess


Comme mentionné précédemment, elles sont toutes deux faites pour s'exécuter à la même adresse. Pour avoir un fichier à plat, il faut déplacer le code.

Un tel 'packeur déplaceur' serait le petit frère du muteur ou d'un virtualiseur: on doit dans tous les cas désassembler et analyser, mais à priori, on a ensuite juste besoin d'identifier et de recalculer les constantes en DWORD.

Binaire Source

1 comment: