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?
assembly
processor
architecture
Mentalist
quelle
quelle
Antworten:
Versuchen Sie es durch GNU-Datei. Wenn es einen Standardheader hat, wird er abgeholt.
Z.B.
quelle
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.
quelle
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.
quelle
Vor vielen Monden, als es nicht so viele verschiedene Prozessorkerne gab, identifizierte ich den Z80-Code einige Male durch Frequenzanalyse . Denn der Z80
CD
ist der Maschinencode fürcall subroutine
undC9
istreturn 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).quelle
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.
quelle
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.
quelle