2015-09-02 2 views
1

J'utilise x64dbg pour inspecter le démontage d'un .DLL.Plusieurs int3 dans une rangée

En plusieurs points de l'assemblage, je vois plusieurs instructions Int3 à la suite.

00007FFA24BF1638 | CC      | int3         | 
00007FFA24BF1639 | CC      | int3         | 
00007FFA24BF163A | CC      | int3         | 
00007FFA24BF163B | CC      | int3         | 
00007FFA24BF163C | CC      | int3         | 
00007FFA24BF163D | CC      | int3         | 
00007FFA24BF163E | CC      | int3         | 
00007FFA24BF163F | CC      | int3         | 

Cette instruction est utilisée pour le débogage/points de rupture, n'est-ce pas? Alors pourquoi y en a-t-il autant dans une rangée, et pourquoi y en a-t-il du tout étant donné que cette DLL a été compilée avec une configuration de version VC++.

+0

C'est peut-être là pour vous empêcher de déboguer à l'aise – Amit

+0

C'est la caractéristique du compilateur Microsoft C/C++. Il utilise des instructions de point d'arrêt (INT3) pour coder les limites d'alignement, comme le dit la réponse de Jester. –

Répondre

7

C'est probablement juste un remplissage, ils ne seront jamais exécutés. Je suppose que la fonction suivante commence à 00007FFA24BF1640 qui est alignée sur 16 octets, et la fonction précédente se termine probablement avant ces instructions.

+0

L'utilisation d'une instruction de ce type pour les régions qui ne sont jamais censées être exécutées peut éventuellement empêcher l'exécution spéculative de gaspiller des ressources. Habituellement, un padding de ce genre vient après un 'ret', mais peut-être un mauvais prédicteur de cible à branche indirecte pourrait-il faire en sorte que le processeur tente d'y exécuter. Un mauvais choix pour le remplissage après un 'ret' serait quelque chose comme' ajouter ax, 1024', parce que les processeurs Intel seraient bloqués lors du décodage du bloc qui incluait le ret. (Le préfixe de la taille de l'opérande change la longueur de l'instruction, parce que cela signifie imm16 au lieu de imm32, Intel n'aime pas ça). –