Identifizieren Sie den Prozessortyp anhand des rohen Binärcodes?

19

Nicht wirklich mit Chips verwandt, aber hoffentlich bekomme ich von hier aus einige Anweisungen.

Ich habe ein Stück Code, weiß aber nicht, für welchen Prozessor er gedacht ist. Gibt es Tools, mit denen ich den Codetyp identifizieren kann? Welche statistischen Methoden können helfen? Byteverteilung? Paarverteilung, etc? Markov-Ketten vielleicht?

Mentalist
quelle
7
Könnten Sie uns die ersten 200 Bytes in Hex geben?
Pingswept
Das ist eine lustige Frage. Was für ein Gerät hackst du?
David Grayson
1
Sie könnten versuchen, es ein paar verschiedenen Zerlegern zuzuführen und zu sehen, was passiert.
JustJeff
2
Ich werde diesen Code in 100 Bytes benennen! = P
JustJeff
Gute Frage. Könnte jedoch besser zu StackOverflow passen.
Scharfzahn

Antworten:

16

Versuchen Sie es durch GNU-Datei. Wenn es einen Standardheader hat, wird er abgeholt.

Z.B.

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
Toby Jaffey
quelle
Versuchte das. GNU-Datei sagt, es ist "Daten".
Mentalist
3
Könnten Sie etwas davon posten? Haben Sie versucht, mit "Strings" nach ASCII zu suchen?
Toby Jaffey
9

Das ist eine sehr interessante Frage. Es gibt Millionen von Anweisungen, aber nur eine Handvoll sehr häufig verwendeter.

Das erste, was ich mir ansehen möchte, ist die Herkunft und die beabsichtigte Verwendung. Wenn Sie es wurde vermuten , entworfen in den USA, dann würden Sie in erster Linie Prozessoren mit Datenblatt in englischer Sprache verfügbar sein Targeting, zum Beispiel. Wenn es in Asien entwickelt wurde, gibt es eine Reihe von Prozessoren, die von US-Ingenieuren nur selten für Massenprodukte verwendet werden. Sogar in Europa gibt es einige Prozessoren, die üblicher sind als andere.

Ich würde dann einen Blick auf die Codegröße und -funktionalität werfen (vorausgesetzt, Sie wissen, was der Code zu einem gewissen Grad tut). Wenn es sich um ein paar Megabyte Code handelt, können Sie die meisten eingebetteten 8-Bit-Prozessoren billiger einsetzen und größere Geräte mit externem Speicher in Betracht ziehen. Wenn es ein paar Kilobyte oder weniger sind, sollten Sie sich stattdessen auf kleinere, billigere Geräte konzentrieren. Wenn die Funktionalität einfach ist, kann es sich sogar um Code für einen Vier-Bit-Prozessor handeln.

An dieser Stelle lohnt es sich, die Speicherstruktur zu betrachten. Es wird wahrscheinlich mindestens einen Programmabschnitt und einen Datenabschnitt geben. Wenn es sich um eine Binärdatei handelt (im Vergleich zu Intel Hex oder Motorola S Record), wissen Sie nicht genau, wo bestimmte Datenblöcke im Speicher abgelegt werden. Ein Hex-Editor kann einige Muster anzeigen. Wenn es sich um ein hexadezimales oder s-Datensatzformat handelt, verfügen Sie möglicherweise über weitere Informationen zur Speicherstruktur des Prozessors, für den es bestimmt ist. Einige Prozessoren werden am Programmspeicherplatz 0 zurückgesetzt, andere am höchsten Speicherplatz. Das Programm kann EEPROM-Anfangswerte an einem separaten Speicherort enthalten. Wenn es für einen sicheren Prozessor gedacht ist (wie er im Bankgeschäft verwendet wird), verfügt es möglicherweise sogar über Sicherheitsschlüssel für einen ungeraden Speicherort.

Abhängig von der Sprache, in der es programmiert wurde, haben Sie möglicherweise einige zusätzliche Hinweise. Wenn es in C oder einer ähnlichen prozeduralen Sprache programmiert wurde, beginnen die Funktionen fast immer mit einer Abfolge von Anweisungen zum Speichern bestimmter Register im Stapel (viele Pushs), bevor unmittelbar vor dem Zurückgeben vieler Pops die ursprünglichen Werte vom Stapel zurückgegeben werden . Wenn Sie eine Mustererkennung durchführen können, werden Sie durchgehend viele dieser Sequenzen finden und möglicherweise feststellen können, welche Anweisungen wahrscheinlich Push- / Pop-Anweisungen, Return-Anweisungen usw. sind, was Ihre Auswahl etwas einschränken könnte.

Wenn es sich um ein eingebettetes Gerät mit Interrupts handelt, verfügt es möglicherweise über eine Interrupt-Vektortabelle, die wie ein Haufen von Sprüngen zu verschiedenen Speicherorten in einem großen Block aussieht, wahrscheinlich an einem geeigneten Ort (Adresse 0x ??? 0 zum Beispiel). . Sprungtabellen werden an anderer Stelle auch für andere Zwecke verwendet. Wenn Sie jedoch eine Abfolge von Anweisungen finden können, die bis auf die Adresse, zu der gesprungen werden soll, identisch aussehen, können Sie möglicherweise ableiten, wie eine Sprunganweisung aussieht, und sie erneut eingrenzen Ihre Entscheidungen nach unten.

An diesem Punkt würde ich mit den gebräuchlichsten Prozessorarchitekturen beginnen und prüfen, ob irgendetwas korreliert. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502 usw. usw. Es gibt Listen gängiger Prozessoren und Befehlssätze - zumindest im englischsprachigen Raum -, die sich als hilfreich erweisen könnten.

Mir sind keine automatisierten Tools bekannt, die dabei helfen könnten, aber MAME emuliert eine Vielzahl von Prozessorarchitekturen. Eine mögliche Methode besteht darin, den Code durch eine Reihe von Prozessoren zu führen und die Register zu überwachen, um festzustellen, ob die gewünschten Klicks vorliegen Sie kennen das Design.

Adam Davis
quelle
"Auch in Europa gibt es einige Prozessoren, die häufiger als andere sind." Als ich in Europa lebte, kam mir das nie in den Sinn. Können Sie Beispiele nennen?
Stevenvh
@stevenvh Aufgrund der Acorn- und Sinclair-Unternehmen waren Embedded-Systeme auf Basis von 6502 und Z80 sehr beliebt. Und natürlich startete der ARM-Prozessor bei Acorn Computers.
Adam Davis
5

Idee: Kennen Sie das Alter des Quellcodes, dh zu welcher Zeit / zu welcher Jahreszeit wurde er erstellt?

Wenn es alt genug ist, gibt es möglicherweise einen Hinweis darauf, für welchen Prozessor es geschrieben wurde. Sie können das Alter / Jahr, in dem es geschrieben wurde, bestimmen, welche Prozessoren in diesem Zeitraum beliebt waren, und versuchen, die Hex-Datei auf diese zu laden / auszuführen.

In Anbetracht der Massenvermehrung von Prozessoren in den letzten 20 Jahren könnte dies eine Nadel-im-Heu-Stapel-Technik sein und nicht sehr fruchtbar sein.

J. Polfer
quelle
4

Vor vielen Monden, als es nicht so viele verschiedene Prozessorkerne gab, identifizierte ich den Z80-Code einige Male durch Frequenzanalyse . Denn der Z80 CDist der Maschinencode für call subroutineund C9ist return from subroutine(werde ich nie vergessen), und dies sind oft die am häufigsten vorkommenden Codes. Dies setzt jedoch voraus, dass Sie mit dem Befehlssatz auf Maschinencodeebene vertraut sind. Erfahrung in der Montage von Hand zu haben, hilft (hat mir sehr geholfen, und ich kann immer noch hexadezimal rückwärts zählen, um Versätze zu berechnen).

stevenvh
quelle
3

Wenn es sich bei der Datei um einen 12-Bit- oder 14-Bit-PIC handelt, ist jedes Bytepaar ein 12- oder 14-Bit-Wort, das normalerweise als erstes als LSB gespeichert wird, wobei die zwei oder vier höchstwertigen Bits gelöscht sind.

Superkatze
quelle
1

Wenn es aus einer Sprache wie C oder Pascal kompiliert worden wäre, gäbe es bestimmte Standardsequenzen von Binärdateien, nach denen Sie suchen könnten. Bei C beispielsweise beginnen fast alle Funktionen mit etwas, das den Stapelzeiger auf einen "Frame" - oder "Link" -Zeiger speichert. Für einen bestimmten Prozessor gibt es normalerweise nur ein paar Möglichkeiten, dies zu tun. Sie könnten also antworten, "Ist dieser Code für Prozessor X", indem Sie nach der Binärdatei von X für diese Sequenzen suchen.

Trotzdem hatte ich etwas Glück, als ich nur mit Histogrammen zwischen 8088, 6502 und 68000 binär unterschieden habe. Jeder Prozessor verfügt über bestimmte Opcodes für gesetzliche Anweisungen, die tendenziell etwas häufiger als der Durchschnitt verwendet werden. Mit einem ausreichend großen Binärbereich können Sie bestimmte Trends erkennen. Dies wird jedoch durch die Tatsache erschwert, dass alle Operanden in einem gegebenen Binärteil dazu neigen, nicht mit dem gegebenen Prozessortyp zu korrelieren, und dies macht im Wesentlichen nur Rauschen in Ihren Histogrammdaten. Auch zwei unterschiedliche Programme für denselben Prozessor können merklich unterschiedliche Histogramme aufweisen. Trotzdem kann es Ihnen einen Ausgangspunkt geben.

JustJeff
quelle