Gibt es eine mehr oder weniger zuverlässige Möglichkeit zu sagen, ob Daten an einer Stelle im Speicher ein Anfang einer Prozessoranweisung oder andere Daten sind?x86 Möglichkeit, Anweisungen aus Daten zu geben
Zum Beispiel kann mit relativen E8 3F BD 6A 00
call
Befehl (E8
) sein Offset von 0x6ABD3F
, oder es könnte drei Bytes von Daten sein, die zu einer anderen Anweisung, gefolgt von push 0
(6A 00
).
Ich weiß, die Frage klingt albern und es gibt wahrscheinlich keinen einfachen Weg, aber möglicherweise Befehlssatz wurde mit diesem Problem im Hinterkopf entwickelt und vielleicht einige einfache Code Untersuchung + -100 Bytes um den Standort kann eine Antwort geben, die sehr wahrscheinlich ist richtig.
Ich möchte dies wissen, weil ich den Code des Programms scan und alle Anrufe zu einer Funktion mit Anrufen zu meinem Ersatz ersetze. Es funktioniert so weit, aber es ist nicht unmöglich, dass irgendwann, wenn ich die Anzahl der Funktionen, die ich ersetze, anwachsen, einige Daten genau wie ein Funktionsaufruf an diese genaue Adresse aussehen und ersetzt werden, was ein Programm dazu bringt brechen in einer unerwarteten Art und Weise. Ich möchte die Wahrscheinlichkeit dafür reduzieren.
Erinnert mich an einen alten Disassembler, den ich benutzt habe. Es führte 9 verschiedene Analysedurchläufe durch den Maschinencode durch, um zu versuchen, den Code von den Daten zu trennen. Und immer noch oft falsch. –