AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Disassembler: Länge der Instruction / Flags vorhanden?
Thema durchsuchen
Ansicht
Themen-Optionen

Disassembler: Länge der Instruction / Flags vorhanden?

Ein Thema von Zacherl · begonnen am 2. Dez 2008 · letzter Beitrag vom 3. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 17:35
Hey,

ich versuche einen simplen Disassembler zu schreiben und habe hierfür nun schon eine Opcode Map angelegt. Nun ist mein Problem den Anfang einer Instruction zu finden. Anhand der Opcode Map kann ich zwar die Länge der Parameter, etc ermitteln, aber hiervor benötige ich erstmal den Opcode. Da vor dem Opcode aber noch die 1-4 Flagbytes stehen können, weiß ich nicht wo ich ansetzen soll, um den Opcode zu finden.

Gruß Zacherl
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 17:43
Die Präfixe sind eindeutig. In den Intel-Handbüchern sind alle möglichen Präfixe verzeichnet, danach kommt das erste Byte Opcode. Mit anderen Worten: Du überspringst zunächst alle Präfix-Bytes (F0, F2, F3, 2E, 36, 3E, 26, 64, 65, 66 und 67) und indizierst mit dem folgenden Byte die Opcode-Map. Bei einer Sache musst du allerdings aufpassen: Wenn auf bestimmte Präfix-Bytes das Byte 0F folgt, handelt es sich schon um den Anfang eines SIMD-Opcodes.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 18:05
Soweit verstanden Kann es da keine Probleme geben wenn ich den Disassembler z.b. zwischen zwei Instructionen einsetzen lasse und der Opcode bei dem ich beginne zufällig gleich einem der Präfix Bytes ist?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 18:18
Du brauchst einen gültigen Opcode-Anfang. Du kannst nicht mitten in den Anweisungs-Stream hineinfinden. Dies lässt sich auch am Delphi-Disassembler sehen: Wenn man in einer Assembler-Routine Direktiven wie dd verwendet, kommt erst einmal Nonsens raus, der auch weit über diese Definition hinausgehen kann, eben weil eine Anweisung "übergebunden" zu sein scheint. In der Praxis ist das allerdings selten ein Problem, da Calls und Jumps auf gültige Adressen verweisen und es außerdem innerhalb des Code-Segments häufig längere Blöcke von Nop oder Int 3 gibt (je nach Compiler): Dies sind Ein-Byte-Opcodes, sodass du am Ende eines solchen Blocks in jedem Fall eine neue Anweisung beginnt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 18:20
Zitat von Zacherl:
Kann es da keine Probleme geben wenn ich den Disassembler z.b. zwischen zwei Instructionen einsetzen lasse und der Opcode bei dem ich beginne zufällig gleich einem der Präfix Bytes ist?
Die Probleme wird es ohnehin geben, egal ob es nun ein Präfix ist, oder nicht. Du solltest vorher wissen, bei welchem Byte die Code-Bytes beginnen. Man kann das zwar ausprobieren, aber kurze Code-Sequenzen sind per Trial & Error kaum sicher zu erkennen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 18:36
Okay gut angenommen ich fange beim Anfang einer Instruction an. Nun ist der Opcode 3E und die Instruction hat keine Prefixe. Ich gehe hin, überspringe 3E brav, weil ich denke, dass es eine Prefix sein muss und lande bei den Suffixen oder der nächsten Instruction .. Was kann ich da machen?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 19:07
Das kommt in gültigem Maschinencode nicht vor. Auf die Präfixe muss ein Opcode folgen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 20:59
Oki danke dir! Hab das ganze jetzt soweit fertig, dass bis zum ModR/M Byte geparst wird. Welche Werte sagen mir, dass ein SIB Byte folgen muss? Aus der Opcode Map war dies für mich nicht ersichtlich ..
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 2. Dez 2008, 21:02
Ein SIB-Byte gibt es, wenn R/M 4 und Mod 0, 1 oder 2 ist.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Disassembler: Länge der Instruction / Flags vorhanden?

  Alt 3. Dez 2008, 14:09
Perfekt. Eine Sache verwirrt noch .. es gibt ja ein paar wenige Befehle mit 3 Opcode Bytes. Das erste Byte ist dann entweder 2E oder 3E. Wie differenziere ich hier am besten zwischen Opcode Anfang und Prefix Byte?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz