2016-11-04 1 views
0

Ich versuche, einfachen Assembler-Code zu entschlüsseln, aber ich bin nicht sehr erfahren in der Sprache. Wenn ich den folgenden Codeblock in Haupt:Wie zu bestimmen, was in der Adresse ist Assembly ruft

push %ebp 
8048a45:  89 e5     mov %esp,%ebp 
8048a47:  53      push %ebx 
8048a48:  83 e4 f0    and $0xfffffff0,%esp 
8048a4b:  83 ec 10    sub $0x10,%esp 
8048a4e:  8b 45 08    mov 0x8(%ebp),%eax 
8048a51:  8b 5d 0c    mov 0xc(%ebp),%ebx 
8048a54:  83 f8 01    cmp $0x1,%eax 
8048a57:  75 0c     jne 8048a65 <main+0x21> 
8048a59:  a1 c4 d7 04 08   mov 0x804d7c4,%eax ?? 
8048a5e:  a3 f0 d7 04 08   mov %eax,0x804d7f0 ?? 
8048a63:  eb 74     jmp 8048ad9 <main+0x95> 
8048a65:  83 f8 02    cmp $0x2,%eax 
8048a68:  75 49     jne 8048ab3 <main+0x6f> 
8048a6a:  c7 44 24 04 e8 a2 04 movl $0x804a2e8,0x4(%esp) 

Auf Linien 8048a59 und 048a5e, wo ich die Fragezeichen gesetzt haben, ich nehme an, es versucht, was zu setzen, ist in Adresse 0x804d7f0 zu dem, was in ist Adresse 0x804d7c4, aber woher weiß ich, was genau in diesen Adressen ist?

+0

Sie nicht, wenn Sie nicht wissen, was das Programm ist und was es tut. – Hannu

+1

Wenn Sie den Linker dazu bringen können, eine Map-Datei auszuspucken, sollten Sie eine Liste aller absoluten Adressen für Ihre Variablen erhalten. – Lundin

Antwort

1

Zunächst müssen Sie bestimmen, welcher Abschnitt dieser Adresse entspricht. Sie können dies mit objdump wie folgt tun objdump -h

Dann können Sie Abschnitt zerlegen Sie interessiert wie es getan here.

Here einige nützliche Informationen zum Anzeigen von Abschnitten und deren Adressen.

Eine andere Möglichkeit besteht darin, Laufzeit Debugger zu verwenden und nur Speicher z. x addr für gdb.


P.S. Wenn Sie den Variablennamen wiederherstellen möchten, ist dies möglicherweise nicht möglich, da der Compiler normalerweise diese Art von Informationen für die meisten Symbole entfernt.

+1

Verwenden Sie 'objdump -d -r', um Symbolinformationen (" Relocations ") für Adressen zu drucken, wenn diese verfügbar sind. Es macht einen Kommentar wie '# 61d0c8 '. Hüten Sie sich vor solchen Fällen, in denen es wirklich nichts mit stderr zu tun hat, nur dass das nächste Symbol in der endgültigen Binärdatei noch vorhanden war. Es funktioniert viel besser bei '.o' Dateien als bei ausführbaren Dateien, da der Linker noch keine Symbolinformationen für nicht-globale statische Daten weggeworfen hat. –

+0

Ich benutze 'alias disas = 'objdump -drwC -Mintel', um das zu tun, C++ - Namen zu de-mangeln und Intel-Stil-Syntax zu verwenden. (Und nicht den Maschinencode für lange Anweisungen in Zeilenform bringen). –

Verwandte Themen