6Danke
ERLEDIGT
JA
JA
ANTWORTEN
12
12
ZUGRIFFE
803
803
EMPFEHLEN
-
Hi,
es tut mir wirklich Leid, wenn es dieses Thema schon mal gab oder man durch Googlen sofort die Antwort findet, aber ich weiß nicht wonach ich suchen soll.
Ich habe eine Frage zum Disassemblieren und/oder "Dateiformaten".
Wenn ich eine kleine Assemblerdatei zu *.bin assembliere und diese Date wieder disassemliere kann ich den Code ohne Problem lesen. Mein Problem tritt auf, wenn ich die Datei über eine *.obj zu einer *.exe mache. Nicht nur, dass der Code jetzt recht schwer zu verstehen ist (was eigentlich klar ist), sondern ich kann Variablen nicht mehr zurückverfolgen.
Ich zeig einfach mal meinen Code:
Meine *.asm
Code asm:1 2 3 4 5
mov ax, a mov al, 01h int 16h a db "a"
Das Ergebnis der disassemblierten *.bin
was ja immer noch zu lesen und verstehen ist.Code asm:1 2 3 4
00000000 B80700 mov ax,0x7 00000003 B001 mov al,0x1 00000005 CD16 int 0x16 00000007 61 popaw
Wenn ich den Code richtig verstehe wird in der ersten Zeile einfach nur das geladen, was an der Position (?) 00000007 steht.
Jetzt meine erste Frage: Wie kann der Computer entscheiden ob das, was bei 00000007 steht oder 0x7 in das Register geschrieben werden soll?
Ich bin begeistert, wenn jmd. noch bis hier gelesen hat.
OK, weiter.
Das Ergebnis der disassemblierten *.exe
Jetzt kann ich erkennen, dass wohl nur die letzten vier Zeile wichtig sind. Aber ich kann jetzt nicht mehr zurückverfolgen, was an der Position 00000007 steht, denn "popaw" steht jetzt bei 00000047.Code asm:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
00000000 4D dec bp 00000001 5A pop dx 00000002 48 dec ax 00000003 0001 add [bx+di],al 00000005 0000 add [bx+si],al 00000007 0004 add [si],al 00000009 0000 add [bx+si],al 0000000B 00FF add bh,bh 0000000D FF00 inc word [bx+si] 0000000F 0000 add [bx+si],al 00000011 0000 add [bx+si],al 00000013 0000 add [bx+si],al 00000015 0000 add [bx+si],al 00000017 004000 add [bx+si+0x0],al 0000001A 0000 add [bx+si],al 0000001C 0000 add [bx+si],al 0000001E 0000 add [bx+si],al 00000020 0000 add [bx+si],al 00000022 0000 add [bx+si],al 00000024 0000 add [bx+si],al 00000026 0000 add [bx+si],al 00000028 0000 add [bx+si],al 0000002A 0000 add [bx+si],al 0000002C 0000 add [bx+si],al 0000002E 0000 add [bx+si],al 00000030 0000 add [bx+si],al 00000032 0000 add [bx+si],al 00000034 0000 add [bx+si],al 00000036 0000 add [bx+si],al 00000038 0000 add [bx+si],al 0000003A 0000 add [bx+si],al 0000003C 0000 add [bx+si],al 0000003E 0000 add [bx+si],al 00000040 B80700 mov ax,0x7 00000043 B001 mov al,0x1 00000045 CD16 int 0x16 00000047 61 popaw
Meine zweite Frage: Gibt es eine Möglichkeit entweder *.exe in *.bin umwandeln oder herauszufinden, was die Position 00000007 ist?
OK, ich hoffe, das ist jetzt nicht zu viel.
Vielen Dank für eure Hilfe!
EDIT:
Falls irgendjemand langweilig sein sollte, kann der mir ja vielleicht erklären, was es mit dem Rest des disassemblierten *.exe Codes auf sich hat.
Geändert von üäpöol (02.02.12 um 21:27 Uhr)
-
02.02.12 22:18 #2
- Registriert seit
- Feb 2005
- Beiträge
- 2
es ist lange her das ich mich mit assembler beschaeftigt habe, also keine garantie auf korrekte infos

was mir seltsam vorkommt:
du laedst register ax, ein wort register mit einer byte variablen...
mov ax, a (wort)
a db "a" (byte)
auch dass die definition von "a" unterhalb der verwendung steht... hmm, noergelt da nicht der assembler rum?
das > 00000000 B80700 mov ax,0x7
laedt ax mit einer konstanten (0x7 - woher die 0x7 ist mir noch nicht ganz klar
, scheinbar aber nicht mit deiner variablen "a"
die steht hier > 00000007 61 popaw (der ascii hex code fuer "a" ist 0x61)
mehr kann ich derzeit leider auch nicht sagen
Geändert von The3rdMind (02.02.12 um 22:30 Uhr)
-
Hi,
dass ich ein Byte in ein Word lade, kam mir auch komisch vor.
Ich muss es aber sogar, wenn ich in eine *.obj Datei assemblieren will.
Bei binärem Format ist das dem Compiler egal.
Ich arbeite mit NASM, vielleicht ist das der Grund für die seltsame Syntax.
Das mit der 61 ist mir auch schon aufgefallen, hilft mir aber auch nicht wirklich weiter, weil ich eh weiß, dass popaw a bedeutet.
Schonmal danke für deine Hilfe!
-
03.02.12 13:14 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hm... Das beantwortet zwar meine Frage noch nicht
, aber ich denke ich schau mir ma IDA Pro an.
-
03.02.12 14:35 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ich rede eigentlich von der ersten Frage.
-
03.02.12 15:26 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Dann habe ich mich entweder zu unpräzise ausgedrückt oder die Antwort nicht verstanden:
Nochmal die Frage anders gestellt:
In diesem Fall möchte ich die Zahl 7 in das ax Register stecken.
Code asm:1 2 3 4 5
mov ax, 7 mov al, 01h int 16h a db "a"
In diesem Fall möchte ich die Variable a in das ax Register tun.
Code asm:1 2 3 4 5
mov ax, a mov al, 01h int 16h a db "a"
Das Ergebnis des Disassemblierens ist in beiden Fällen
Code asm:1 2 3 4
00000000 B80700 mov ax,0x7 00000003 B001 mov al,0x1 00000005 CD16 int 0x16 00000007 61 popaw
Wie kann ich die beiden Fälle unterscheiden (wie macht das der Computer)?
Ich hoffe, die Frage ist jetzt ein bisschen präziser.
-
03.02.12 15:53 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Wenn ich das richtig verstanden habe, muss es einen Unterschied zwischen dem Maschinencode und der disassemblierten Datei geben, weil der Computer sonst nicht wüsste ob 7, oder das was an der Adresse 7 steht, in das Register soll, oder?
-
03.02.12 16:53 #12
- Registriert seit
- Mar 2011
- Beiträge
- 36
es gibt in ASM keine richtigen Varriablen. Du lädst die Offset der Speicherstelle in AX. Den inhalt musst du mit hilfe eines Pointers laden. Das Prinzip nochmal aufgedröselt:
Code :1 2
varriable db 0 mov ax,varriable
Der Name "varriable" ist nur ein Label welches vom Assembler in eine Adresse (im Realmode Offset da segment:offset) umwandelt. In ASM gibt es keine Varriablen nur Speicherstellen und Register. Wenn du den inhalt der speicherstelle "Varriable" in AX verschieben möchtest geht das so:
Code :1 2
varriable db 'a' mov ax,[varriable]
Jetzt ist ax='a'
vorhin beinhaltete AX eine adresse.
Zu dem >Rest aus der exe datei: Exe ist vom Aufbau sehr viel Komplexer als ein einfaches Binäres Format. Windows hat ein tool um exe in Binärdateien zu convertieren (exe2bin).
Diese bringt dir jedoch nix da du in deinem System (wenn ich das richtig verstanden habe ) a: noch im realmode bist und die Aktuell gängigen Windows Aplikationen 32bit code enthalten
b: Du in deinem OS die Windows API nicht implementiert hast.
Wenn du Infos zu OSdev oder ASM haben willst kannst dich auch dierekt bei mir per PM melden
LG
Linux best FriendIn a world without walls and fences, who needs Windows ans Gates?
-
OK, jetzt fang ich an es zu verstehen.

Dann hätte sich die Sache vorläufig erledigt.
Vielen Dank an Linuxfriend!
Ähnliche Themen
-
Datenbankanbindung, indirekte Variablen, Variablen zusammensetzen
Von enheoh im Forum JavaAntworten: 3Letzter Beitrag: 18.07.11, 17:06 -
Variablen übergeben, auslesen, Datei mit Variablen includen, aber wie?
Von hrboy im Forum PHPAntworten: 8Letzter Beitrag: 03.07.09, 11:13 -
Dateien von Variablen auf andere Variablen von anderen Forms spielen
Von PH234X im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 12.01.09, 22:47 -
Variablen aus Datei anderen Variablen zuweisen
Von Flolei im Forum Flash PlattformAntworten: 3Letzter Beitrag: 24.11.04, 14:56 -
geladene Variablen / quelltextübergebene Variablen
Von Dr_Ogen im Forum Flash PlattformAntworten: 3Letzter Beitrag: 06.09.03, 14:40





Zitieren

Login





