Le démontage est obscurcie par l'utilisation de opcodes qui se chevauchent.
Tout d'abord, l'instruction cmp al, al
est garanti pour définir l'indicateur zéro, quel que soit le contenu de al
. Le saut conditionnel jz
sera donc pris sur la ligne suivante.
Le jz
saute trois octets dans l'instruction mov dword ptr [ecx+42h], 2087D83h
. La représentation hexadécimale pour cette instruction est c7 41 42 83 7d 08 02
. Donc, nous commençons réellement à exécuter au 83
.
Mais 83 7d 08 02
se désassemble à cmp dword ptr [ebp+8], 2
. Notez que parce que ceci se termine sur la même limite d'instruction que l'instruction trompeuse mov
que l'IDA affiche, les instructions suivantes à exécuter s'alignent avec le désassemblage qui vous est donné par IDA. Alors, dans la ligne suivante, jz short loc_8048E25
, nous ne passerons à loc_8048E25
que si le drapeau zéro est activé; c'est-à-dire, si [ebp+8]
(qui est notre premier paramètre à main
, c'est-à-dire, argc
) est égal à 2
. Sinon, nous passons et exécutons les deux instructions suivantes, qui correspondent à exit(11)
.
Pour fixer le démontage dans l'IDA ...
Vous pouvez désassembler l'instruction mov
en cliquant sur la ligne mov
et appuyez sur la touche u
. Vous pouvez également commencer le réassemblage à loc_8048DEC+3
avec la clé c
. Vous devriez enregistrer votre base de données avant de le faire.
1. De nombreux mnémoniques peuvent être représentés par plus d'une séquence d'octets. Par exemple, cette instruction particulière pourrait également être représentée comme étant c7 81 42 00 00 00 83 7d 08 02
mais A) les compilateurs ont tendance à générer la forme la plus courte d'une instruction, et B) les instructions qui se chevauchent ne seraient pas "compréhensibles" et risqueraient de segfault. L'IDA peut vous montrer la représentation en octets réelle de chaque instruction soit dans la vue hexadécimal, soit si vous définissez Opcodes > General > Number of opcode bytes
de manière appropriée.