72 votes

Comment puis-je forcer GDB à se désassembler?

Je suis en train de démonter un programme pour voir un syscall instruction de montage (INT instruction, je crois) et le gestionnaire à l'aide de GDB et ont écrit un petit programme (voir ci-dessous) pour qu'il s'ouvre et se ferme d'un fichier. J'ai été en mesure de suivre l'appel à fopen avec GDB jusqu'à ce qu'il soit exécuté à un appel. Quand j'ai essayé de dire GDB "démonter 0x...." (adresse de l'appel), il a répondu avec " Pas de fonction contient l'adresse indiquée.' Est-il possible de forcer GDB à démonter (ou l'afficher en assembleur aussi bon que possible) que l'adresse de mémoire? Si oui, comment?

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE* f;
    f = fopen("main.c", "r");
    if (!f) { 
      perror("open");
      return -1;
    }
fclose(f);
return 0;
}

126voto

Michael Snyder Points 2457

Ouais, désassembler n'est pas la meilleure commande à utiliser ici. La commande que vous voulez est "x / i" (examinez comme instructions):

 (gdb) x/i 0xdeadbeef
 

56voto

nont Points 3684

Voulez-vous seulement démonter votre conduite principale actuelle? Si oui, essayez ceci:

 (gdb) info line main 
(gdb) disas STARTADDRESS ENDADDRESS
 

Ainsi:

 USER@MACHINE /cygdrive/c/prog/dsa
$ gcc-3.exe -g main.c

USER@MACHINE /cygdrive/c/prog/dsa
$ gdb a.exe
GNU gdb 6.8.0.20080328-cvs (cygwin-special)
...
(gdb) info line main
Line 3 of "main.c" starts at address 0x401050 <main> and ends at 0x401075 <main+
(gdb) disas 0x401050 0x401075
Dump of assembler code from 0x401050 to 0x401075:
0x00401050 <main+0>:    push   %ebp
0x00401051 <main+1>:    mov    %esp,%ebp
0x00401053 <main+3>:    sub    $0x18,%esp
0x00401056 <main+6>:    and    $0xfffffff0,%esp
0x00401059 <main+9>:    mov    $0x0,%eax
0x0040105e <main+14>:   add    $0xf,%eax
0x00401061 <main+17>:   add    $0xf,%eax
0x00401064 <main+20>:   shr    $0x4,%eax
0x00401067 <main+23>:   shl    $0x4,%eax
0x0040106a <main+26>:   mov    %eax,-0xc(%ebp)
0x0040106d <main+29>:   mov    -0xc(%ebp),%eax
0x00401070 <main+32>:   call   0x4010c4 <_alloca>
End of assembler dump.
 

Je ne vois pas votre appel d'interruption système cependant. (ça fait longtemps que je n’ai pas essayé de faire un appel système en assembleur. INT 21h mais, dernier souvenir,

34voto

Falaina Points 4760

Ce n'est pas la réponse directe à votre question, mais puisque vous semblez simplement vouloir désassembler le binaire, vous pourriez peut-être simplement utiliser objdump :

 objdump -d program
 

Cela devrait vous donner son démontage. Vous pouvez ajouter -S si vous voulez qu'il soit annoté à la source.

7voto

Joel Points 61

fopen () est une fonction de la bibliothèque C et vous ne verrez donc aucune instruction syscall dans votre code, mais uniquement un appel à une fonction normale. À un moment donné, il appelle open (2), mais via un trampoline. Il existe simplement un saut vers la page VDSO, fournie par le noyau à chaque processus. Le VDSO fournit ensuite le code pour effectuer l'appel système. Sur les processeurs modernes, les instructions SYSCALL ou SYSENTER seront utilisées, mais vous pouvez également utiliser INT 80h sur les processeurs x86.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X