Wir entwickeln das NIOS II-Prozessormodul für IDA Pro

    Bild

    IDA Pro Disassembler-Benutzeroberfläche Screenshot

    IDA Pro ist ein berühmter Disassembler, den Informationssicherheitsforscher auf der ganzen Welt seit vielen Jahren einsetzen. Wir bei Positive Technologies verwenden auch dieses Werkzeug. Darüber hinaus ist es uns gelungen, ein eigenes Disassembler-Prozessormodul für die Mikroprozessorarchitektur von NIOS II zu entwickeln , das die Geschwindigkeit und den Komfort der Codeanalyse verbessert.

    Heute werde ich über die Geschichte dieses Projekts sprechen und zeigen, was am Ende passiert ist.

    Vorgeschichte


    Begonnen hat alles im Jahr 2016, als wir ein eigenes Prozessormodul entwickeln mussten, um die Firmware in einer Aufgabe zu analysieren. Die Entwicklung wurde von Grund auf gemäß dem Handbuch des Nios II Classic Processor Reference Guide durchgeführt , das damals am relevantesten war. Insgesamt dauerte diese Arbeit etwa zwei Wochen.

    Das Prozessormodul wurde für die Version IDA 6.9 entwickelt. IDA-Python wurde aufgrund der Geschwindigkeit ausgewählt. In dem Ort, an dem die Prozessormodule leben, dem Unterverzeichnis von procs im IDA Pro-Installationsverzeichnis, befinden sich drei Module in Python: msp430, ebc, spu. Sie können sehen, wie das Modul angeordnet ist und wie die grundlegende Demontagefunktionalität implementiert werden kann:

    • Parsing-Anweisungen und Operanden
    • vereinfachen und anzeigen,
    • Offsets erstellen, Querverweise sowie den Code und die Daten, auf die sie sich beziehen,
    • Verarbeitung von Schalterkonstruktionen
    • Handhabung von Stack-Manipulationen und Stack-Variablen.

    Ungefähr diese Funktionalität wurde zu dieser Zeit implementiert. Glücklicherweise war das Tool bei der Arbeit an einer anderen Aufgabe hilfreich, bei der es ein Jahr später aktiv eingesetzt und verfeinert wurde.

    Erfahrung in das Prozessormodul zu schaffen, habe ich beschlossen , mit der Gemeinde an der Konferenz PHDays 8. Die Rede erweckte Interesse (Videobericht zu teilen posted Online PHDays), wurde von selbst den Schöpfer von IDA Pro Ilfak Gilfanov besucht. Eine seiner Fragen war, ob die Unterstützung für IDA Pro Version 7 implementiert wurde. Damals war es noch nicht da, aber nach der Rede versprach ich, das entsprechende Modul zu veröffentlichen. Hier begann der Spaß.

    Das neueste ist das Handbuch von Inteldie zur Überprüfung und Überprüfung auf Fehler verwendet wurde. Ich habe das Modul grundlegend überarbeitet und eine Reihe neuer Funktionen hinzugefügt, einschließlich der Lösung der Probleme, die zuvor nicht gewonnen werden konnten. Und natürlich wurde Unterstützung für die 7. Version von IDA Pro hinzugefügt. Das ist was passiert ist.

    NIOS II-Softwaremodell


    NIOS II ist ein Softwareprozessor, der für Altera-FPGAs (jetzt Teil von Intel) entwickelt wurde. Aus der Sicht von Programmen hat es die folgenden Merkmale: Byte-Reihenfolge Little Endian, 32-Bit-Adressraum, 32-Bit-Befehlssatz, d. H. 4 Bytes sind festgelegt, 32 allgemeine Register und 32 Spezialcodierung für jeden Befehl.

    Demontage und Code-Referenzen


    Wir haben also in IDA Pro eine neue Datei mit Firmware für den NIOS II-Prozessor geöffnet. Nach der Installation des Moduls wird es in der Liste der IDA Pro-Prozessoren angezeigt. Die Wahl des Prozessors ist in der Abbildung dargestellt.



    Angenommen, das Modul hat noch nicht einmal die grundlegende Befehlsparsung implementiert. Da jeder Befehl 4 Bytes benötigt, gruppieren wir Bytes nach vier, dann sieht alles ungefähr so ​​aus.



    Nach dem Implementieren der grundlegenden Funktionalität zum Dekodieren von Anweisungen und Operanden, Anzeigen dieser Anzeigen und Analysieren von Steuerübertragungsanweisungen wird der Byte-Satz aus dem obigen Beispiel in den folgenden Code konvertiert.



    Wie aus dem Beispiel hervorgeht, werden Querverweise auch aus den Steuerungsübertragungsbefehlen gebildet (in diesem Fall können Sie den bedingten Übergang und den Prozeduraufruf sehen).

    Eine nützliche Eigenschaft, die in den Prozessormodulen implementiert werden kann, sind die Kommentare zu den Befehlen. Wenn Sie die Ausgabe von Byte-Werten deaktivieren und die Anzeige von Kommentaren aktivieren, sieht derselbe Code bereits so aus.



    Wenn Sie hier zuerst einen Assembler-Code einer neuen Architektur gefunden haben, können Sie anhand von Kommentaren verstehen, was passiert. Außerdem sind die Codebeispiele in der gleichen Form - mit Kommentaren, um nicht das NIOS II-Handbuch zu betrachten, sondern um sofort zu verstehen, was im Codeabschnitt passiert, der als Beispiel dient.

    Pseudoinstruktionen und Befehlsvereinfachung


    Einige der NIOS II-Befehle sind Pseudoinstruktionen. Für solche Teams gibt es keine separaten Opcodes und sie werden als Sonderfälle anderer Teams modelliert. Bei der Demontage werden Anweisungen vereinfacht - bestimmte Kombinationen werden durch Pseudoinstruktionen ersetzt. Pseudoinstruktionen in NIOS II können im Allgemeinen in vier Typen unterteilt werden:

    • wenn eine der Quellen Null (r0) ist und aus der Betrachtung genommen werden kann,
    • Wenn der Befehl einen negativen Wert enthält und der Befehl durch das Gegenteil ersetzt wird,
    • wenn die Bedingung durch das Gegenteil ersetzt wird,
    • Wenn der 32-Bit-Offset in zwei Teams (Junior und Senior) eingegeben wird und dieser durch einen Befehl ersetzt wird.

    Die ersten beiden Typen wurden implementiert, da die Ersetzung der Bedingung nicht viel ergibt und die 32-Bit-Offsets mehr Ausführungsvarianten aufweisen als die im Handbuch dargestellten.

    Betrachten Sie beispielsweise für die erste Ansicht den Code.



    Es ist ersichtlich, dass hier häufig die Verwendung des Nullregisters in Berechnungen gefunden wird. Wenn Sie sich dieses Beispiel genau ansehen, werden Sie feststellen, dass alle Befehle außer der Übertragung der Kontrolle Varianten der einfachen Eingabe von Werten in bestimmte Register sind.

    Nachdem wir die Verarbeitung von Pseudoinstruktionen implementiert haben, erhalten wir den gleichen Code, aber jetzt sieht es besser lesbar aus, und anstelle von Variationen der Befehle or und add werden die Variationen des mov-Befehls angezeigt.



    Stack-Variablen


    Die NIOS II-Architektur unterstützt den Stapel, und neben dem Stapelzeiger sp gibt es auch einen Zeiger auf den Stapelrahmen fp. Stellen Sie sich ein Beispiel für eine kleine Prozedur vor, die einen Stapel verwendet.



    Offensichtlich wird auf dem Stack Platz für lokale Variablen zugewiesen. Es kann davon ausgegangen werden, dass das Register ra in der Stack-Variablen gespeichert und anschließend wieder hergestellt wird.

    Nachdem Sie dem Modul Funktionen hinzugefügt haben, die Änderungen am Stapelzeiger verfolgen und Stapelvariablen erstellen, sieht das gleiche Beispiel so aus.



    Nun sieht der Code etwas klarer aus, und es ist bereits möglich, die Stack-Variablen zu benennen und deren Zweck anhand der Querverweise zu analysieren. Die Funktion in diesem Beispiel ist vom Typ __fastcall. Die Argumente in den Registern r4 und r5 werden auf den Stack geschrieben, um eine Subroutine vom Typ _stdcall aufzurufen.

    32-Bit-Zahlen und Offsets


    Die Besonderheit von NIOS II besteht darin, dass Sie in einer Operation, dh bei der Ausführung eines Befehls, maximal einen direkten Wert von 2 Byte (16 Bit) in das Register eingeben können. Andererseits sind die Prozessorregister und der Adressraum 32 Bit, das heißt, zur Adressierung müssen dem Register 4 Bytes hinzugefügt werden.

    Um dieses Problem zu lösen, werden zweiteilige Verschiebungen verwendet. Ein ähnlicher Mechanismus wird bei Prozessoren in PowerPC verwendet: Der Offset besteht aus zwei Teilen, dem höchsten und dem niedrigsten, und wird mit zwei Befehlen in das Register eingegeben. In PowerPC sieht das so aus.



    Bei diesem Ansatz werden Querverweise aus beiden Teams gebildet, obwohl die Anpassung der Adresse tatsächlich im zweiten Befehl erfolgt. Dies kann manchmal zu Unannehmlichkeiten führen, wenn die Anzahl der Querverweise gezählt wird.

    Der nicht standardmäßige Typ HIGHA16 wird in den Offset-Eigenschaften für den höheren Teil verwendet, manchmal wird der Typ HIGH16 verwendet, und der untere Teil - LOW16.



    Bei der Berechnung von 32-Bit-Zahlen aus zwei Teilen ist nichts kompliziert. Schwierigkeiten ergeben sich bei der Bildung von Operanden als Offsets für zwei separate Befehle. Alle diese Verarbeitung fällt auf das Prozessormodul. Es gibt keine Beispiele, wie dies (insbesondere in Python) im IDA-SDK implementiert werden kann.

    In dem Bericht bei PHDays waren die Verschiebungen ein ungelöstes Problem. Um das Problem zu lösen, haben wir geschummelt: 32-Bit-Versatz nur vom jüngeren Teil - auf der Basis. Die Basis wird als höchster Teil berechnet und um 16 Bit nach links verschoben.



    Bei diesem Ansatz wird ein Querverweis nur aus dem Befehl zur Eingabe des unteren Teils des 32-Bit-Offsets gebildet.

    Die Basiseigenschaften sind in den Offset-Eigenschaften sichtbar und die Eigenschaft ist markiert, um sie als Zahl zu behandeln, um nicht viele Querverweise auf die Adresse selbst zu bilden, die wir als Basis akzeptieren.



    Der Code für NIOS II enthält den folgenden Mechanismus zum Einfügen von 32-Bit-Nummern in ein Register. Zuerst wird der obere Teil des Offsets mit dem movhi-Befehl in das Register eingegeben. Dann schließt sich der jüngere Teil an. Dies kann auf drei Arten (Befehle) erfolgen: durch Hinzufügen von addi, subtrahieren von subi und logischem ORi.

    Im nächsten Abschnitt des Codes werden die Register beispielsweise für 32-Bit-Nummern konfiguriert, die vor dem Funktionsaufruf in die Register - Argumente eingegeben werden.



    Nachdem wir die Berechnung der Offsets hinzugefügt haben, erhalten wir die folgende Darstellung dieses Codeblocks.



    Der resultierende 32-Bit-Offset wird für den untersten Teil neben dem Eingabebefehl angezeigt. Dieses Beispiel ist ziemlich visuell, und wir können sogar alle 32-Bit-Zahlen in unserem Kopf einfach berechnen, indem Sie den unteren und den oberen Teil anbringen. Nach den Werten zu urteilen, sind sie höchstwahrscheinlich keine Offsets.

    Berücksichtigen Sie den Fall, wenn bei der Eingabe des jüngeren Teils eine Subtraktion verwendet wird. In diesem Beispiel funktioniert die Ermittlung der endgültigen 32-Bit-Nummern (Offsets) während der Verschiebung nicht.



    Nach der Berechnung der 32-Bit-Zahlen erhalten Sie das folgende Formular.



    Hier sehen wir nun, dass, wenn sich die Adresse im Adressraum befindet, ein Versatz darauf gebildet wird und der Wert, der als Folge des Junior- und Senior-Teils gebildet wurde, nicht daneben angezeigt wird. Hier haben wir den Offset zur Zeichenfolge "10/22/08" erhalten. Damit die verbleibenden Offsets auf gültige Adressen verweisen, vergrößern wir das Segment etwas.



    Nachdem wir das Segment vergrößert haben, erhalten wir nun, dass alle berechneten 32-Bit-Zahlen Offsets sind und auf gültige Adressen verweisen.

    Es wurde oben erwähnt, dass es eine andere Möglichkeit gibt, Offsets zu berechnen, wenn der logische ODER-Befehl verwendet wird. Hier ist ein Beispielcode, bei dem zwei Offsets auf diese Weise berechnet werden.



    Der im r8-Register berechnete Wert wird dann auf den Stapel geschoben.

    Nach der Konvertierung ist klar, dass in diesem Fall die Register auf die Adressen des Beginns der Prozeduren gesetzt werden, das heißt, die Adresse der Prozedur wird auf den Stapel gelegt.



    Lesen und Schreiben relativ zur Basis


    Zuvor haben wir Fälle betrachtet, in denen die mit zwei Befehlen eingegebene 32-Bit-Zahl nur eine Zahl und auch ein Offset sein konnte. Im folgenden Beispiel wird die Basis in den oberen Teil des Registers eingegeben, dann wird relativ zum Lese- oder Schreibvorgang ausgeführt.



    Nach der Verarbeitung solcher Situationen erhalten wir Offsets für Variablen aus den Lese- und Schreibbefehlen selbst. Gleichzeitig wird abhängig von der Dimension der Operation die Größe der Variablen selbst festgelegt.



    Schalterkonstruktionen


    Die in binären Dateien getroffenen Schalterkonstruktionen können die Analyse erleichtern. Durch die Anzahl der Auswahlmöglichkeiten innerhalb der Switch-Konstruktion ist es beispielsweise möglich, einen Switch zu lokalisieren, der für die Verarbeitung einiger Protokolle oder Befehlssätze verantwortlich ist. Daher besteht die Aufgabe, den Switch selbst und seine Parameter zu erkennen. Betrachten Sie den folgenden Codeausschnitt.



    Der Ausführungsablauf stoppt beim Registerwechsel jmp r2. Als nächstes kommen die Codeblöcke, auf die aus den Daten verwiesen wird, und am Ende jedes Blocks gibt es einen Sprung zu derselben Bezeichnung. Es ist offensichtlich, dass dies eine Schalterkonstruktion ist, und diese separaten Blöcke behandeln spezifische Fälle daraus. Oben sehen Sie auch die Überprüfung der Anzahl der Fälle und den Standardsprung.

    Nach dem Hinzufügen der Switch-Verarbeitung sieht dieser Code folgendermaßen aus.



    Nun wird der Sprung selbst angezeigt, die Adresse der Tabelle mit Offsets, die Anzahl der Fälle sowie jeder Fall mit der entsprechenden Anzahl.

    Die Tabelle selbst mit Offsets für die Optionen sieht wie folgt aus. Um Platz zu sparen, werden die ersten fünf Elemente angegeben.



    Im Wesentlichen besteht die Schalterverarbeitung darin, den Code zurückzublättern und nach allen seinen Komponenten zu suchen. Das heißt, eine bestimmte Organisation des Switches wird beschrieben. Manchmal gibt es Ausnahmen in den Schemata. Dies kann der Grund für Fälle sein, in denen scheinbar visuelle Schalter in vorhandenen Prozessormodulen nicht erkannt werden. Es stellt sich heraus, dass der reale Switch einfach nicht unter das Schema fällt, das im Prozessormodul definiert ist. Es gibt immer noch mögliche Optionen, wenn das Schema vorhanden zu sein scheint, aber in ihm befinden sich noch weitere Befehle, die nicht am Schema teilnehmen, oder die Hauptbefehle werden ausgetauscht oder durch Übergänge gebrochen.

    Das NIOS II-Prozessormodul erkennt einen Schalter mit solchen "fremden" Befehlen zwischen den Hauptbefehlen sowie mit den umgeordneten Hauptbefehlen und mit Übergängen, die den Stromkreis unterbrechen. Ein umgekehrter Durchlauf durch den Ausführungspfad wird verwendet, wobei mögliche Übergänge berücksichtigt werden, die den Schaltkreis unterbrechen, wobei interne Variablen installiert werden, die verschiedene Zustände des Erkenners signalisieren. Dadurch werden etwa 10 verschiedene Optionen für die Organisation des Switches, die in der Firmware enthalten sind, erkannt.

    Anweisungen benutzerdefinierte


    Die NIOS II-Architektur hat eine interessante Funktion - die benutzerdefinierte Anweisung. Es ermöglicht den Zugriff auf 256 vom Benutzer definierbare Anweisungen, die in der NIOS II-Architektur möglich sind. In seiner Arbeit kann der benutzerdefinierte Befehl zusätzlich zu den Registern für allgemeine Zwecke auf einen speziellen Satz von 32 benutzerdefinierten Registern verweisen. Nach der Implementierung der Parsing-Logik für benutzerdefinierte Befehle erhalten Sie die folgende Ansicht.



    Möglicherweise stellen Sie fest, dass die letzten beiden Anweisungen dieselbe Befehlsnummer haben und dieselben Aktionen ausführen.

    Entsprechend der Gebrauchsanweisung gibt es eine separate Anleitung. Seiner Meinung nach ist eine der vollständigsten und modernsten Versionen des benutzerdefinierten Befehlssatzes der Befehlssatz NIOS II Floating Point Hardware 2 Component (FPH2) für das Arbeiten mit Fließkommazahl. Nach der Implementierung des Parsens von FPH2-Befehlen sieht das Beispiel so aus.



    Laut der Mnemonik der letzten beiden Teams sind wir überzeugt, dass sie wirklich die gleiche Aktion ausführen - den Befehl fadds.

    Springt nach Registerwert


    In den untersuchten Firmwares gibt es oft eine Situation, wenn ein Sprung auf den Registerwert gemacht wird, in den ein 32-Bit-Offset eingefügt wird, der die Stelle des Sprunges bestimmt.

    Betrachten Sie ein Stück Code.



    In der letzten Zeile wird auf den Registerwert gesprungen, wobei klar ist, dass die Adresse der Prozedur, die in der ersten Zeile des Beispiels beginnt, zuerst in das Register eingegeben wird. In diesem Fall ist es offensichtlich, dass der Sprung an seinem Anfang stattfindet.

    Nachdem Sie die Sprungerkennung hinzugefügt haben, erhalten Sie die folgende Ansicht.



    Neben dem Befehl jmp r8 befindet sich die Adresse, an der der Sprung erfolgt, falls er berechnet werden konnte. Auch bildete sich ein Querverweis zwischen dem Team und der Adresse, an der der Sprung erfolgt. In diesem Fall ist die Verknüpfung in der ersten Zeile sichtbar, der Sprung selbst wird von der letzten Zeile aus ausgeführt.

    Wert gp (globaler Zeiger) registrieren, speichern und laden


    Es ist üblich, einen globalen Zeiger zu verwenden, der für eine Adresse konfiguriert ist, und relativ dazu werden die Variablen angesprochen. In NIOS II wird das globale Zeigerregister zum Speichern des globalen Zeigers verwendet. An einem bestimmten Punkt wird in der Regel bei den Initialisierungsprozeduren der Firmware der Wert der Adresse in das gp-Register eingetragen. Das Prozessormodul behandelt diese Situation. Zur Veranschaulichung sind Codebeispiele und ein IDA Pro-Ausgabefenster mit aktivierten Debug-Meldungen im Prozessormodul aufgeführt.

    In diesem Beispiel ermittelt und berechnet das Prozessormodul den Wert des Registers gp in der neuen Datenbank. Beim Schließen der idb-Basis wird der gp-Wert in der Basis gespeichert.



    Wenn eine bereits vorhandene idb-Basis geladen wird und der gp-Wert bereits gefunden wurde, wird sie von der Basis geladen, wie in der Debugging-Nachricht im folgenden Beispiel gezeigt.



    Lese und schreibe relativ zu gp


    Übliche Operationen lesen und schreiben mit einem Offset aus dem gp-Register. Im folgenden Beispiel werden beispielsweise drei Lesevorgänge und ein Schreibvorgang dieses Typs ausgeführt.



    Da wir den Wert der Adresse, der im gp-Register gespeichert ist, bereits empfangen haben, ist es möglich, diese Art von Lesen und Schreiben anzusprechen.

    Nach dem Hinzufügen der Verarbeitung von Lese- und Schreibsituationen relativ zum gp-Register erhalten wir ein bequemeres Bild.



    Hier können Sie sehen, welche Variablen angesprochen werden, deren Verwendung verfolgen und ihren Zweck identifizieren.

    GP-Adressierung


    Es gibt eine andere Verwendung des gp-Registers zum Adressieren von Variablen.



    Zum Beispiel sehen wir hier, dass Register relativ zu dem gp-Register für einige Variablen oder Datenbereiche konfiguriert sind.

    Nachdem Sie eine Funktionalität hinzugefügt haben, die solche Situationen erkennt, die sich in Offsets verwandelt und Querverweise hinzufügt, erhalten Sie das folgende Formular.



    Hier können Sie bereits sehen, in welchen Bereichen Register für gp konfiguriert sind, und es wird klarer, was los ist.

    Adressierung relativ sp


    In dem folgenden Beispiel sind die Register auf einige Speicherbereiche abgestimmt, diesmal relativ zum sp-Register, dem Stapelzeiger.



    Offensichtlich sind die Register auf einige lokale Variablen abgestimmt. Solche Situationen - Argumente für lokale Puffer vor Prozeduraufrufen festlegen - sind recht häufig.

    Nach dem Hinzufügen der Verarbeitung (Konvertieren direkter Werte in Offsets) erhalten Sie das folgende Formular.



    Nun wird klar, dass nach dem Aufruf der Prozedur die Werte aus den Variablen geladen werden, deren Adressen vor dem Funktionsaufruf als Parameter übergeben wurden.

    Querverweise von Code auf Strukturfelder


    Das Definieren und Verwenden von Strukturen in IDA Pro kann die Codeanalyse erleichtern.



    Wenn man sich diesen Teil des Codes ansieht, kann man verstehen, dass das Feld field_8 inkrementiert wird und möglicherweise der Zähler für das Auftreten eines Ereignisses ist. Wenn die Lese- und Schreibfelder im Code weit voneinander getrennt sind, können Querverweise zur Analyse beitragen.

    Betrachten Sie die Struktur selbst.



    Wie wir sehen können, gibt es keine Verweise auf die Felder der Strukturen vom Code auf die Elemente der Strukturen.

    Nachdem solche Situationen behandelt wurden, wird alles für uns so aussehen.



    Nun gibt es Querverweise auf die Felder der Strukturen von bestimmten Befehlen, die mit diesen Feldern arbeiten. Vorwärts- und Rückwärtsquerverweise werden erstellt. Sie können durch verschiedene Prozeduren verfolgen, wo die Werte der Strukturfelder gelesen und wo sie eingegeben werden.

    Diskrepanzen zwischen Handbuch und Realität


    Im Handbuch müssen beim Dekodieren einiger Befehle bestimmte Bits streng definierte Werte annehmen. Für einen Rückgabebefehl aus einer eret-Ausnahme sollten die Bits 22-26 beispielsweise 0x1E sein.



    Hier ist ein Beispiel für diesen Befehl von einer einzelnen Firmware.



    Beim Öffnen einer anderen Firmware an einem Ort mit einem ähnlichen Kontext treffen wir auf eine andere Situation.



    Diese Bytes werden nicht automatisch in einen Befehl umgewandelt, obwohl alle Befehle verarbeitet werden. Gemessen an der Umgebung und sogar an einer ähnlichen Adresse muss es sich um ein Team handeln. Schauen wir uns die Bytes genau an. Dies ist der gleiche eret-Befehl, mit der Ausnahme, dass die Bits 22-26 nicht gleich 0x1E sind, sondern gleich null.

    Es ist notwendig, eine kleine Analyse dieses Befehls zu korrigieren. Jetzt ist es nicht ganz das Handbuch, aber es stimmt.



    IDA 7-Unterstützung


    Ab IDA 7.0 hat sich die von IDA Python für reguläre Skripts bereitgestellte API stark verändert. Bei den Prozessormodulen sind die Änderungen kolossal. Trotzdem konnte das NIOS II-Prozessormodul auf Version 7 zurückgesetzt werden und funktionierte erfolgreich darin.



    Der einzige unverständliche Punkt: Beim Laden einer neuen Binärdatei unter NIOS II in IDA 7 gibt es keine erste automatische Analyse, die in IDA 6.9 vorhanden ist.

    Fazit


    Neben den grundlegenden Demontagefunktionen, von denen Beispiele im SDK enthalten sind, verfügt das Prozessormodul über viele verschiedene Funktionen, die die Arbeit des Code-Forschers erleichtern. Es ist klar, dass dies alles manuell erfolgen kann, aber zum Beispiel, wenn Tausende und Zehntausende von Verschiebungen unterschiedlichen Typs in einer Binärdatei mit Firmware mit einer Größe von ein paar Megabytes vorhanden sind - warum Zeit damit verschwenden? Lassen Sie es für uns Prozessormodul tun. Denn wie angenehm hilft die Möglichkeit einer schnellen Navigation durch den zu untersuchenden Code mit Hilfe von Querverweisen! Dies macht IDA zu einem so komfortablen und unterhaltsamen Werkzeug, wie wir es kennen.

    Autor : Anton Dorfman, Positive Technologies

    Jetzt auch beliebt: