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

2010/01/11

Useless but original

An different form of junk code
You probably know about the overlapping instruction technique used to fool disassemblers:
due to the way x86 CPUs work, jumping over a E8 byte will make a bogus CALL instruction appear in the code.

if you use a longer instruction like IMUL, you can fit any instruction, so you can create a blocky piece of code.
So from the outside, whether from hex or from assembly, it looks quite blocky
EB 02 JMP SHORT 004000F4
69846A 40681C01 4000EB02 IMUL EAX,[EDX+EBP*2+11C6840],2EB0040
698468 22014000 9090EB02 IMUL EAX,[EAX+EBP*2+400122],2EB9090
69846A 00E81E00 0000EB02 IMUL EAX,[EDX+EBP*2+1EE800],2EB0000
69846A 00E81900 00005461 IMUL EAX,[EDX+EBP*2+19E800],61540000

while the execution trace looks almost normal:
EB 02 JMP +4
6A 40 PUSH 40
68 1C014000 PUSH 0040011C
EB 02 JMP +4
68 22014000 PUSH 00400122
90 NOP
90 NOP
EB 02 JMP +4
6A 00 PUSH 0
E8 1E000000 CALL 0040012F
EB 02 JMP +4
6A 00 PUSH 0
E8 19000000 CALL 00400135


Absolutely useless like any form of junk code, but way more original than E8/E9 :)

If you have ever seen an unusual form of junk code or obfuscation, let me know.

Binary Source


[...]

Du code de dissimulation pas comme les autres

Vous connaissez probablement la technique d'instructions superposées, qui permet de tromper les désassembleurs:
A cause du fonctionnement des processeurs x86, sauter un octet E8 fera apparaître une fausse instruction CALL dans votre code.

Si on utilise une instruction plus longue comme IMUL, on peut cacher n'importe quelle autre instruction, et donc créer du code en bloc.

De l'exterieur, que ce soit en hexadecimal ou en assembleur, le code a l'air plutot carre
EB 02 JMP SHORT 004000F4
69846A 40681C01 4000EB02 IMUL EAX,[EDX+EBP*2+11C6840],2EB0040
698468 22014000 9090EB02 IMUL EAX,[EAX+EBP*2+400122],2EB9090
69846A 00E81E00 0000EB02 IMUL EAX,[EDX+EBP*2+1EE800],2EB0000
69846A 00E81900 00005461 IMUL EAX,[EDX+EBP*2+19E800],61540000

alors que la trace d'execution a l'air presque normale:
EB 02 JMP +4
6A 40 PUSH 40
68 1C014000 PUSH 0040011C
EB 02 JMP +4
68 22014000 PUSH 00400122
90 NOP
90 NOP
EB 02 JMP +4
6A 00 PUSH 0
E8 1E000000 CALL 0040012F
EB 02 JMP +4
6A 00 PUSH 0
E8 19000000 CALL 00400135



C'est aussi inutile que toute forme de code de dissimulation, mais c'est bien plus original que les E8/E9 :)

Si vous avez vu d'autres formes originales de dissimulations, faites le savoir.

Binaire Source

No comments:

Post a Comment