Laden Sie das Programm herunter pe. PE (Portable Executable): Auf fremden Gezeiten. Umfrage: Wie oft stoßen Sie auf eine Dateierweiterung, die Sie nicht kennen?

Bevor Sie eine Scharnierverteidigung angreifen, ist es nützlich zu wissen, welcher Packer oder Protektor verwendet wurde. Mit etwas Erfahrung werden Sie in der Lage sein, die meisten Protektoren mit dem Auge zu identifizieren, aber für eine genauere Überprüfung werden ausführbare Dateianalyseprogramme verwendet. Neben Informationen über den Packer oder Beschützer liefern sie viele weitere nützliche Daten: welcher Compiler die Datei erstellt hat, Größen und Abschnittsnamen, Komprimierungsverhältnis, Einstiegspunkt und darauf disassembliertes Codefragment usw. verschiedene Programme Die Liste der Funktionen kann variieren.



File Format Identifier ist eine sehr erfolgreiche Entwicklung der chinesischen Antivirus-Firma SUCOP, letzte Version 1.4 von 2008. Der Analysator arbeitet mit externen Signaturen im PEiD-Format, aber der Hauptwert ist der eingebaute statische Entpacker einfacher Packer. Unpacker arbeitet an der Technologie virtuelle Maschine, das heißt, es wird kein Code tatsächlich ausgeführt, was besonders beim Lernen wichtig ist Malware. Auch von Nützliche Hilfsmittel Das Programm verfügt über einen Import-Rekonstruktor, einen ausführbaren Datei-Rebuilder, einen Offset-Rechner und einen Overlay-Extraktor. Wenn Sie Chinesisch verstehen, können Sie es von außerhalb herunterladen, aber ich empfehle, meine Baugruppe aus der angehängten Datei zu entnehmen. Alles Überflüssige wurde darin entfernt, die Entpacker-Engine wurde durch eine kommerzielle mit verbesserten Funktionen ersetzt, externe Basis Unterschriften. Es wird empfohlen, den File Format Identifier immer griffbereit zu haben.



Bit Detector - eine Neuentwicklung, ebenfalls vom arabischen Cracker-Team Unter SEH-Team, letzte öffentliche Version 2.8.5.6 vom Juni 2012. Neben der Funktion, Compiler und Packer zu bestimmen, hat es mehrere nützliche und weniger nützliche Tools an Bord.



DNiD- ein PEiD-ähnliches Programm, das sich jedoch auf .NET-Anwendungen konzentriert. Ermöglicht es Ihnen, mehrere Zehner zu definieren verschiedene Versionen Compiler, Beschützer, Packer und Verschleierer von .NET-Programmen.

DNiD.1.0.zip (273.389 Byte)




A-Ray-Scanner, das Projekt wurde lange nicht aktualisiert, die neueste Version ist 2.0.2.2 von 2005. Das Programm ist nur zum Scannen von CDs/DVDs gedacht und definiert mehrere Dutzend Disc-Kopierschutze. Definiert auch einige Packer und Beschützer für ausführbare Dateien.

A-Ray.Scanner.2.0.2.2.zip (320.892 Bytes)




Klon XXL- ein Dienstprogramm, das die Art des CD-Schutzes bestimmt. Wie das vorherige Programm wurde es lange nicht aktualisiert, die neueste Version ist 2.0.1.5 von 2003. Definiert Schutzmaßnahmen: SafeDisc, SecuROM, Discguard, LaserLok, Psx/Lybcrypt, Cactus Data Shield (Audio-CDs), Lock Blocks, CD Check, ProtectetCD-VOB, CD-Extra und Schutz basierend auf nicht standardmäßiger Platzierung von Informationen auf der Festplatte. Standardmäßig ist die Oberfläche auf Deutsch, wechselt aber in den Einstellungen auf Englisch.

ClonyXXL.2.0.1.5.zip (276.879 Byte)


Neben universellen Analysatoren gibt es mehrere Dienstprogramme für spezifische Schutzvorrichtungen. Die nützlichsten sind ASPrINF, VerA, Armadillo Find Protected, Armadillo Informant und Detemida.



ASPRINF von nik0g0r vom TLG-Team, eine weitere inländische Entwicklung, neueste Version 1.6 Beta. Ein kleines Dienstprogramm zur genauen Bestimmung der Version von ASProtect, die eine Datei abdeckt. Es wird eine dynamische Analyse verwendet, keine Signaturanalyse, sodass die Version fehlerfrei ermittelt wird. Zusätzlich zur genauen Version von ASProtect zeigt das Dienstprogramm Informationen darüber an, für wen der Protektor registriert ist, sodass Rasierer, die kaputte Warez-Protektoren für ihr Handwerk verwenden, leicht an sauberes Wasser gebracht werden können :)

Typedef struct _IMAGE_FILE_HEADER (WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; ) IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Ich werde diese Felder nur trocken beschreiben, weil. Die Namen sind intuitiv und stellen direkte Bedeutungen dar, nicht VA, RVA, RAW und andere beängstigende, faszinierende Dinge, von denen wir nur von den alten Piraten gehört haben. Obwohl wir RAW bereits kennengelernt haben, sind dies nur Offsets relativ zum Anfang der Datei (sie werden auch Rohzeiger oder Datei-Offset genannt). Das heißt, wenn wir eine RAW-Adresse haben, bedeutet dies, dass wir vom Anfang der Datei zu den RAW-Positionen gehen müssen ( ptrDatei+RAW). Danach können Sie mit dem Auslesen der Werte beginnen. Ein Paradebeispiel dieser Art ist e_lfneu- die wir oben in der Dos-Überschrift behandelt haben.

*Maschine: WORD ist eine Zahl (2 Bytes), die die Prozessorarchitektur angibt, auf der Diese Anwendung durchgeführt werden kann.
NumberOfSections: DWORD - Anzahl der Abschnitte in der Datei. Abschnitte (im Folgenden Abschnittstabelle genannt) folgen unmittelbar nach dem Header (PE-Header). Laut Dokumentation ist die Anzahl der Abschnitte auf 96 begrenzt.
TimeDateStamp: WORD - eine Zahl, die das Datum und die Uhrzeit enthält, zu der die Datei erstellt wurde.
PointerToSymbolTable: DWORD ist der Offset (RAW) zur Symboltabelle und SizeOfOptionalHeader ist die Größe dieser Tabelle. Dieser Tisch Entwickelt, um Debug-Informationen zu speichern, aber die Abteilung bemerkte den Verlust eines Jägers von Anfang an nicht. Meistens wird dieses Feld mit Nullen gelöscht.
SizeOfOptionHeader: WORD - die Größe des optionalen Headers (der dem aktuellen folgt) Die Dokumentation besagt, dass sie für eine Objektdatei auf 0 gesetzt ist…
*Eigenschaften: WORD - Dateieigenschaften.

* - Felder, die durch einen Wertebereich definiert sind. Tabellen mit möglichen Werten werden in der Beschreibung der Struktur im Büro dargestellt. Website und wird hier nicht angegeben, weil. sie enthalten nichts besonders Wichtiges zum Verständnis des Formats.

Verlassen wir diese Insel! Wir müssen weitermachen. Der Orientierungspunkt ist ein Land namens Optional-Header.

„Wo ist die Karte, Billy? Ich brauche eine Karte."
(Schatzinsel)

Optionaler Header (IMAGE_OPTIONAL_HEADER)

Der Name dieses Festlandtitels ist nicht sehr erfolgreich. Dieser Header ist obligatorisch und hat die beiden Formate PE32 und PE32+ (IMAGE_OPTIONAL_HEADER32 bzw. IMAGE_OPTIONAL_HEADER64). Das Format wird im Feld gespeichert Magie: WORT. Der Header enthält die notwendigen Informationen, um die Datei herunterzuladen. Wie immer :

IMAGE_OPTIONAL_HEADER

typedef struct _IMAGE_OPTIONAL_HEADER ( WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; DWORD BaseOfData; DWORD ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MajorOperatingSystemVersion; WORD MajorOperatingSystemVersion; WORD MajorOperatingSystemVersion MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory; ) IMAGE_OPTIONAL_HEADE R , *PIMAGE_OPTIONAL_HEADER;


* Wie immer behandeln wir nur die Hauptfelder, die den größten Einfluss auf die Idee des Hochladens haben und wie Sie mit der Datei vorankommen. Lassen Sie uns vereinbaren, dass die Felder dieser Struktur Werte mit VA- (virtuelle Adresse) und RVA- (relative virtuelle Adresse) Adressen enthalten. Das sind schon Adressen, nicht wie RAW, und sie müssen lesen können (genauer gesagt zählen). Wir werden sicherlich lernen, wie das geht, aber nur zu Beginn werden wir die aufeinander folgenden Strukturen analysieren, um nicht durcheinander zu kommen. Denken Sie vorerst daran, dass dies Adressen sind, die nach Berechnungen auf eine bestimmte Stelle in der Datei verweisen. Es wird auch ein neues Konzept geben - Ausrichtung. Wir werden es zusammen mit RVA-Adressen betrachten, weil diese sind ziemlich eng miteinander verwandt.

AdressedesEinstiegspunkts: DWORD - Adresse des RVA-Einstiegspunkts. Kann auf jeden Punkt im Adressraum zeigen. Bei .exe-Dateien entspricht der Einstiegspunkt der Adresse, von der aus das Programm gestartet wird, und darf nicht Null sein!
BaseOfCode: DWORD - RVA des Anfangs des Programmcodes (Codeabschnitt).
BasisVonDaten: DWORD - RVA des Anfangs des Programmcodes (Datenabschnitt).
Bilddatenbank: DWORD - Bevorzugte Programmladebasisadresse. Muss ein Vielfaches von 64kb sein. In den meisten Fällen ist es 0x00400000.
Abschnittsausrichtung: DWORD - Größe der Ausrichtung (Bytes) des Abschnitts beim Entladen in den virtuellen Speicher.
Dateiausrichtung: DWORD - Ausrichtungsgröße (Bytes) eines Abschnitts innerhalb einer Datei.
SizeOfImage: DWORD - Dateigröße (in Bytes) im Speicher, einschließlich aller Header. Muss ein Vielfaches von SectionAligment sein.
SizeOfHeaders: DWORD - Größe aller Header (DOS, DOS-Stub, PE, Section) ausgerichtet auf FileAligment.
NumberOfRvaAndSizes: DWORD - die Anzahl der Verzeichnisse in der Verzeichnistabelle (unterhalb der Tabelle selbst). Auf der dieser Moment Dieses Feld ist immer gleich der symbolischen Konstante IMAGE_NUMBEROF_DIRECTORY_ENTRIES, die gleich 16 ist.
Datenverzeichnis: IMAGE_DATA_DIRECTORY - Datenverzeichnis. Einfach ausgedrückt ist dies ein Array (Größe 16), dessen jedes Element eine Struktur aus 2 DWORD-Werten enthält.

Überlegen Sie, wie die IMAGE_DATA_DIRECTORY-Struktur aussieht:

Typedef struct _IMAGE_DATA_DIRECTORY (DWORD VirtualAddress; DWORD Size; ) IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Was wir haben? Wir haben ein Array aus 16 Elementen, von denen jedes die Adresse und die Größe enthält (was? wie? warum? alles in einer Minute). Es stellt sich die Frage, was genau diese Eigenschaften sind. Dafür hat Microsoft spezielle Konstanten zum Abgleichen. Sie sind ganz am Ende der Beschreibung der Struktur zu sehen. Zur Zeit:

// Verzeichniseinträge #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Verzeichnis exportieren #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Verzeichnis importieren #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Ressourcenverzeichnis #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Ausnahmeverzeichnis #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security_RECTORY Directory_define IM_RECTORY5 Base Relocation IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug-Verzeichnis // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86-Verwendung) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architekturspezifische Daten #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA des GP #define IMAGE_DIRECTORY_ENTRY_ENTRY_ENTS 9 // CONFIGURATION.1 Load Verzeichnis #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Gebundenes Importverzeichnis in Kopfzeilen #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Adresstabelle importieren #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Laden von Importdeskriptoren verzögern #define IMA GE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM-Laufzeitdeskriptor
Aha! Wir sehen, dass jedes Element des Arrays für die daran angehängte Tabelle verantwortlich ist. Aber ach und ach, während diese Ufer für uns unzugänglich sind, weil. Wir wissen nicht, wie man mit VA- und RVA-Adressen arbeitet. Und um zu lernen, müssen wir lernen, was Abschnitte sind. Sie werden über ihre Struktur und Arbeit sprechen, woraufhin klar wird, warum VA, RVA und Ausrichtungen benötigt werden. In diesem Artikel werden wir nur auf Exporte und Importe eingehen. Den Zweck der restlichen Felder erfahren Sie im Büro. Dokumentation oder Bücher. Also. Eigentlich Felder:

virtuelle Adresse: DWORD - RVA für die Tabelle, der das Array-Element entspricht.
Größe: DWORD - Tabellengröße in Bytes.

So! Um zu so exotischen Ufern wie Tabellen mit Importen, Exporten, Ressourcen und anderen zu gelangen, müssen wir eine Quest mit Abschnitten abschließen. Nun, Schiffsjunge, werfen wir einen Blick auf die Übersichtskarte, stellen fest, wo wir uns gerade befinden, und ziehen weiter:

Und wir stehen nicht direkt vor den Weiten der Sektionen. Wir müssen unbedingt herausfinden, was sie verbergen, und uns endlich mit einer anderen Art der Adressierung befassen. Wir wollen echte Abenteuer! Wir wollen schnell zu solchen Republiken wie Import- und Exporttabellen gehen. Alte Piraten sagen, dass nicht jeder zu ihnen gelangen konnte, und diejenigen, die zurückkamen, kamen mit Gold und Frauen mit heiligem Wissen über den Ozean zurück. Wir setzen Segel und halten uns auf den Abschnittskopf.

„- Du bist abgesetzt, Silver! Runter vom Fass!“
(Schatzinsel)

Abschnittsüberschrift (IMAGE_SECTION_HEADER)


Direkt hinter dem Array Datenverzeichnis Abschnitte folgen aufeinander. Der Sektionstisch ist ein souveräner Staat, der gegliedert ist NumberOfSections Städte. Jede Stadt hat ihr eigenes Handwerk, ihre eigenen Rechte, sowie eine Größe von 0x28 Bytes. Die Anzahl der Abschnitte wird im Feld angezeigt NumberOfSections, die im Dateikopf gespeichert ist. Schauen wir uns also die Struktur an:

Typedef struct _IMAGE_SECTION_HEADER ( BYTE Name; union ( DWORD PhysicalAddress; DWORD VirtualSize; ) Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORDHEADERP Characteristics; *TION_IMAGE_SEC) IMAGES
Name: BYTE - Abschnittsname. Es ist derzeit 8 Zeichen lang.
Virtuelle Größe: DWORD - Abschnittsgröße im virtuellen Speicher.
SizeOfRawData: DWORD - Abschnittsgröße in der Datei.
virtuelle Adresse: DWORD - Adresse des RVA-Abschnitts.
SizeOfRawData: DWORD - Abschnittsgröße in der Datei. Muss ein Vielfaches sein Dateiausrichtung.
PointerToRawData: DWORD - RAW-Offset zum Anfang des Abschnitts. Muss auch ein Vielfaches sein Dateiausrichtung
Eigenschaften: DWORD - Abschnittszugriffsattribute und Regeln zum Laden in Wirth. Erinnerung. Beispielsweise ein Attribut zum Definieren des Inhalts eines Abschnitts (Anfangsdaten, Nicht-Anfangsdaten, Code). Oder greifen Sie auf Attribute zu - Lesen, Schreiben, Ausführen. Das ist nicht das ganze Spektrum. Merkmale werden durch Konstanten aus derselben Datei WINNT.h festgelegt, die mit IMAGE_SCN_ beginnen. Sie können sich ausführlicher mit den Attributen von Abschnitten vertraut machen. Die Attribute sind auch in den Büchern von Chris Kaspersky gut beschrieben - Referenzen am Ende des Artikels.

Bezüglich des Namens ist folgendes zu beachten - der Abschnitt mit Ressourcen sollte immer den Namen .rsrc haben. Andernfalls werden die Ressourcen nicht geladen. Wie bei den restlichen Abschnitten kann der Name beliebig sein. Normalerweise gibt es aussagekräftige Namen, wie .data, .src, etc... Aber es kommt auch vor:

Abschnitte sind ein Bereich, der in den virtuellen Speicher entladen wird, und alle Arbeiten werden direkt mit diesen Daten ausgeführt. Eine Adresse im virtuellen Speicher ohne Offsets wird als virtuelle Adresse, kurz VA, bezeichnet. Bevorzugte Adresse zum Herunterladen der Anwendung, im Feld festgelegt Bilddatenbank. Es ist wie der Punkt, an dem der Anwendungsbereich im virtuellen Speicher beginnt. Und relativ zu diesem Punkt werden Offsets RVA (relative virtuelle Adresse) gezählt. Das heißt, VA = Bilddatenbank+RVA; Bilddatenbank wir kennen immer VA oder RVA, und da wir VA oder RVA zur Verfügung haben, können wir das eine durch das andere ausdrücken.

Sieht aus, als hätten sie sich daran gewöhnt. Aber es ist virtueller Speicher! Und wir sind im Physischen. Virtuelles Gedächtnis ist für uns jetzt wie eine Reise in andere Galaxien, die wir uns bisher nur vorstellen können. Wir können also im Moment nicht in den virtuellen Speicher gelangen, aber wir können herausfinden, was dort sein wird, weil es aus unserer Datei stammt.

Ausrichtung


Um die Entladung in Wirth. Gedächtnis, ist es notwendig, sich mit einem solchen Mechanismus wie der Ausrichtung zu befassen. Sehen wir uns zunächst das Diagramm an, das zeigt, wie Abschnitte in den Speicher ausgelagert werden.

Wie Sie sehen können, wird der Abschnitt nicht entsprechend seiner Größe in den Speicher entladen. Hier werden Ausrichtungen verwendet. Dies ist der Wert, der ein Vielfaches der Abschnittsgröße im Speicher sein muss. Wenn wir uns das Diagramm ansehen, sehen wir, dass die Abschnittsgröße 0x28 beträgt und in der Größe 0x50 entladen wird. Dies liegt an der Größe der Ausrichtung. 0x28 „erreicht nicht“ 0x50 und als Ergebnis wird der Abschnitt entladen und der Rest des Leerzeichens in Höhe von 0x50-0x28 wird annulliert. Und wenn die Abschnittsgröße größer als die Ausrichtungsgröße wäre, was dann? Zum Beispiel AbschnittGröße= 0x78 und AbschnittAusrichtung= 0x50, d.h. unverändert geblieben. In diesem Fall würde der Abschnitt 0xA0 (0xA0 = 0x28 * 0x04) Bytes im Speicher belegen. Das heißt, ein Wert, der ein Vielfaches ist AbschnittAusrichtung und komplett abdeckt AbschnittGröße. Es ist zu beachten, dass die Abschnitte in der Datei auf die gleiche Weise ausgerichtet sind, nur nach der Größe Dateiausrichtung. Nachdem wir die notwendige Basis erhalten haben, können wir herausfinden, wie wir von RVA zu RAW konvertieren können.

„Hier gibt es keine Ebene, hier ist das Klima anders.“
(V. S. Wyssozki)

Eine kleine Rechenstunde


Bevor die Ausführung beginnt, muss ein Teil des Programms an den Adressraum des Prozessors gesendet werden. Der Adressraum ist die Menge an Raum, die physikalisch vom Prozessor adressiert wird. Arbeitsspeicher. Das "Stück" im Adressraum, in dem das Programm entladen wird, wird aufgerufen auf virtuelle Weise(virtuelles Bild). Das Bild wird durch die Grundlastadresse (Bildbasis) und die Größe (Bildgröße) charakterisiert. VA (virtuelle Adresse) ist also die Adresse relativ zum Anfang des virtuellen Speichers, und RVA (relative virtuelle Adresse) ist relativ zu der Stelle, an der das Programm entladen wurde. Wie finde ich die Basis-Download-Adresse einer App heraus? Dafür gibt es ein separates Feld im optionalen Header namens Bilddatenbank. Es war ein kleines Vorspiel, um mein Gedächtnis aufzufrischen. Betrachten Sie nun eine schematische Darstellung unterschiedlicher Adressierungen:

Wie können Sie also trotzdem Informationen aus einer Datei lesen, ohne sie in den virtuellen Speicher zu entladen? Dazu müssen Sie Adressen in umwandeln RAW-Format. Dann können wir in die Datei zu dem Bereich gehen, den wir brauchen, und die notwendigen Daten lesen. Da RVA die virtuelle Speicheradresse ist, die aus der Datei abgebildet wurde, können wir den Prozess umkehren. Dazu brauchen wir den Schlüssel neun mal sechzehn einfache Arithmetik. Hier sind einige Formeln:

VA = Bildbasis + RVA; RAW = RVA - AbschnittRVA + Rohabschnitt; // rawSection - Offset zum Abschnitt vom Anfang der Datei // sectionRVA - Abschnitt RVA (dieses Feld wird innerhalb des Abschnitts gespeichert)
Wie Sie sehen können, müssen wir zur Berechnung von RAW den Abschnitt bestimmen, zu dem RVA gehört. Dazu müssen Sie alle Abschnitte durchgehen und die folgende Bedingung überprüfen:

RVA >= sectionVitualAddress && RVA< ALIGN_UP(sectionVirtualSize, sectionAligment) // sectionAligment - выравнивание для секции. Значение можно узнать в Optional-header. // sectionVitualAddress - RVA секции - хранится непосредственно в секции // ALIGN_UP() - функция, определяющая сколько занимает секция в памяти, учитывая выравнивание
Wenn wir alle Rätsel zusammensetzen, erhalten wir die folgende Auflistung:

Typedef uint32_t DWORD; typedef uint16_t WORT; typedef uint8_t BYTE; #define ALIGN_DOWN(x, align) (x & ~(align-1)) #define ALIGN_UP(x, align) ((x & (align-1))?ALIGN_DOWN(x,align)+align:x) // IMAGE_SECTION_HEADER Abschnitte; // Array-Abschnitte initialisieren int defSection(DWORD rva) ( for (int i = 0; i< numberOfSection; ++i) { DWORD start = sections[i].VirtualAddress; DWORD end = start + ALIGN_UP(sections[i].VirtualSize, sectionAligment); if(rva >= starte && rva< end) return i; } return -1; } DWORD rvaToOff(DWORD rva) { int indexSection = defSection(rva); if(indexSection != -1) return rva - sections.VirtualAddress + sections.PointerToRawData; else return 0; }
*Ich habe keine Typdeklaration und Array-Initialisierung in den Code aufgenommen, sondern nur Funktionen bereitgestellt, die bei der Berechnung von Adressen helfen. Wie Sie sehen können, ist der Code nicht sehr kompliziert. Ist das ein wenig verwirrend. Es verschwindet ... wenn Sie ein wenig mehr Zeit damit verbringen, über den Disassembler an der .exe herumzubasteln.

HURRA! Verstanden. Jetzt können wir an den Rand der Ressourcen gehen, Bibliotheken importieren und exportieren und im Allgemeinen, wo immer unser Herz begehrt. Wir haben gerade gelernt, mit einer neuen Art der Adressierung zu arbeiten. Lasst uns los fahren!

"-Nicht schlecht nicht schlecht! Trotzdem haben sie ihre Ration für heute bekommen!“
(Schatzinsel)

Tabelle exportieren


Beim allerersten Element des Arrays Datenverzeichnis RVA wird in der Exporttabelle gespeichert, die durch die Struktur IMAGE_EXPORT_DIRECTORY dargestellt wird. Diese Tabelle ist spezifisch für dynamische Bibliotheksdateien (.dll). Der Hauptzweck der Tabelle besteht darin, die exportierten Funktionen mit ihrer RVA zu verknüpfen. Die Beschreibung befindet sich in Spezifikationen :

Typedef struct _IMAGE_EXPORT_DIRECTORY (DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; DWORD AddressOfNames; DWORD AddressOfNameOrdinals; ) DIIMAGE_EXPORT_DIRECTOR_Y;
Diese Struktur enthält drei Zeiger auf drei verschiedene Tabellen. Dies ist eine Tabelle mit Namen (Funktionen) ( AdresseVonNamen), Ordnungszahlen ( AddressOfNamesOrdinals), Adressen ( AddressOfFunctions). Das Feld Name speichert die RVA des Namens der dynamischen Bibliothek. Eine Ordnungszahl ist wie ein Vermittler zwischen der Namenstabelle und der Adresstabelle und ist ein Array von Indizes (die Indexgröße beträgt 2 Bytes). Betrachten Sie zur Verdeutlichung das Diagramm:

Betrachten Sie ein Beispiel. Nehmen wir an, das i-te Element des Namens-Arrays gibt den Namen der Funktion an. Dann kann die Adresse dieser Funktion erhalten werden, indem auf das i-te Element im Array von Adressen verwiesen wird. Diese. i ist eine Ordinalzahl.

Aufmerksamkeit! Wenn Sie zum Beispiel das 2. Element in der Ordnungszahltabelle genommen haben, bedeutet dies nicht 2 - dies ist eine Ordnungszahl für Namens- und Adresstabellen. Der Index ist der im zweiten Element des ordinalen Arrays gespeicherte Wert.

Anzahl der Werte in Namenstabellen ( AnzahlDerNamen) und Ordnungszahlen sind gleich und stimmen nicht immer mit der Anzahl der Elemente in der Adresstabelle überein ( NumberOfFunctions).

„Sie kamen wegen mir. Vielen Dank für Ihre Aufmerksamkeit. Jetzt müssen sie töten!“
(Schatzinsel)

Tabelle importieren


Die Importtabelle ist ein integraler Bestandteil jeder Anwendung, die dynamische Bibliotheken verwendet. Diese Tabelle hilft, dynamische Bibliotheksfunktionsaufrufe mit entsprechenden Adressen zu korrelieren. Der Import kann in drei verschiedenen Modi erfolgen: Standard, Bindung (gebundener Import) und verzögert (Verzögerungsimport). Da Das Thema Import ist sehr facettenreich und zieht für einen separaten Artikel nach, ich werde nur die Standardmechanismen beschreiben, und den Rest werde ich nur als „Skelett“ beschreiben.

Standardimport- in Datenverzeichnis die Importtabelle wird unter dem Index IMAGE_DIRECTORY_ENTRY_IMPORT(=1) gespeichert. Es ist ein Array von Elementen des Typs IMAGE_IMPORT_DESCRIPTOR. Die Importtabelle speichert (in einem Array) die Namen von Funktionen/Ordnungszahlen und wohin der Lader die effektive Adresse dieser Funktion schreiben soll. Dieser Mechanismus ist nicht sehr effizient, weil Ehrlich gesagt läuft alles darauf hinaus, die gesamte Exporttabelle für jede erforderliche Funktion zu durchlaufen.

Gebundener Import- Bei diesem Arbeitsschema wird in den Feldern (im ersten Element der Standard-Importtabelle) TimeDateStamp und ForwardChain -1 eingetragen und die Information über den Link in der Zelle gespeichert Datenverzeichnis mit Index IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT(=11). Das heißt, dies ist eine Art Flag für den Lader, den er benötigt, um den gebundenen Import zu verwenden. Auch für die „Kette gebundener Importe“ tauchen ihre Strukturen auf. Der Arbeitsalgorithmus lautet wie folgt: Die erforderliche Bibliothek wird in den virtuellen Speicher der Anwendung entladen und alle erforderlichen Adressen werden in der Kompilierungsphase „gebunden“. Von den Mängeln kann angemerkt werden, dass Sie beim Neukompilieren einer DLL die Anwendung selbst neu kompilieren müssen, weil. Funktionsadressen werden geändert.

Import verzögern- Bei dieser Methode wird davon ausgegangen, dass die DLL-Datei an die ausführbare Datei angehängt ist, aber nicht sofort in den Speicher entladen wird (wie bei den beiden vorherigen Methoden), sondern erst, wenn die Anwendung zum ersten Mal auf das Symbol zugreift (die sogenannte entladene Elemente aus dynamischen Bibliotheken). Das heißt, das Programm wird im Speicher ausgeführt, und sobald der Prozess den Funktionsaufruf aus der dynamischen Bibliothek erreicht hat, wird ein spezieller Handler aufgerufen, der die dll lädt und die effektiven Adressen ihrer Funktionen verteilt. Für verzögerte Importe verweist der Loader auf das DataDirectory (Elementnummer 15).

Nachdem wir die Importmethoden ein wenig behandelt haben, gehen wir direkt zur Importtabelle.

„Das ist ein Matrose! Seine Kleidung war marineblau. - Ach was? Dachtest du, hier einen Bischof zu finden?“
(Die Schatzinsel - John Silver)

Importdeskriptor (IMAGE_IMPORT_DESCRIPTOR)


Um die Koordinaten der Importtabelle herauszufinden, müssen wir uns auf das Array beziehen Datenverzeichnis. Nämlich zum Element IMAGE_DIRECTORY_ENTRY_IMPORT (=1). Und lesen Sie die RVA-Adresse der Tabelle. Hier allgemeines Schema zu befolgender Weg:

Dann holen wir uns RAW von RVA, gemäß den oben angegebenen Formeln, und „schreiten“ dann durch die Datei. Wir befinden uns jetzt direkt vor einem Array von Strukturen namens IMAGE_IMPORT_DESCRIPTOR. Das Zeichen für das Ende des Arrays ist die „Null“-Struktur.

Typedef struct _IMAGE_IMPORT_DESCRIPTOR ( union ( DWORD Characteristics; DWORD OriginalFirstThunk; ) DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; DWORD FirstThunk; ) IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
Ich konnte keinen Link zur Strukturbeschreibung auf msdn erhalten, aber Sie können ihn in der Datei WINNT.h sehen. Fangen wir an, es herauszufinden.

Ursprünglicher erster Thunk: DWORD - RVA der Importnamenstabelle (INT).
TimeDateStamp: DWORD - Datum und Uhrzeit.
ForwarderChain: DWORD - Index des ersten weitergeleiteten Zeichens.
Name: DWORD - RVA-String mit Bibliotheksname.
FirstThunk: DWORD - RVA der Import Address Table (IAT).

Alles hier ist etwas ähnlich wie beim Export. Auch eine Namenstabelle (INT) und auch ein Fetzen drauf Adressen (IAT). Auch als RVA-Bibliothek bezeichnet. Nur hier verweisen INT und IAT auf ein Array von IMAGE_THUNK_DATA-Strukturen. Es wird in zwei Formen präsentiert - für das 64. und für das 32. System und unterscheidet sich nur in der Größe der Felder. Betrachten Sie x86 als Beispiel:

Typedef struct _IMAGE_THUNK_DATA32 ( union ( DWORD ForwarderString; DWORD Function; DWORD Ordinal; DWORD AddressOfData; ) u1; ) IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
Es ist wichtig, darauf zu antworten Weitere Maßnahmen hängen vom hohen Bit der Struktur ab. Wenn es gesetzt ist, dann sind die verbleibenden Bits die Nummer des zu importierenden Symbols (Import nach Nummer). Andernfalls (hohes Bit gelöscht) spezifizieren die verbleibenden Bits den RVA des importierten Symbols (Import nach Name). Wenn wir einen Import nach Namen haben, speichert der Zeiger die Adresse in der folgenden Struktur:

Typedef-Struktur _IMAGE_IMPORT_BY_NAME ( WORD-Hinweis; BYTE-Name; ) IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
Hier Hinweis ist die Funktionsnummer, und Name- Name.

Wozu das alles? All diese Arrays, Strukturen ... Betrachten wir zur Verdeutlichung ein wunderbares Schema mit

Portable Executable (PE) ist ein ausführbares Dateiformat, das es schon lange gibt und das immer noch in allen Windows-Versionen verwendet wird. Dazu gehören Dateien im Format *.exe, *.dll und andere, und solche Dateien enthalten alle Informationen über das Programm. Aber jedes Programm kann einen Virus enthalten, und vor der Installation ist es wünschenswert zu wissen, was hinter einer Datei mit diesem Format gespeichert ist. Dies kann mit PE Explorer gefunden werden.

PE Explorer ist ein Programm, das entwickelt wurde, um alles, was in PE-Dateien enthalten ist, anzuzeigen und zu ändern. Dieses Programm wurde erstellt und sehr oft verwendet, um Viren zu erkennen, aber darauf kommt es an nützliche Funktionen sind nicht begrenzt. Beispielsweise kann es verwendet werden, um Debug-Informationen zu entfernen oder ein beliebiges Programm ins Russische zu übersetzen.

Während das Programm komprimiert wird, wird es normalerweise verschlüsselt, sodass der Benutzer oder andere nicht alles sehen können, was hinter den Kulissen passiert. Aber PE Explorer hält das nicht auf, denn dank eines speziell geschriebenen Algorithmus kann er diese Dateien entschlüsseln und den gesamten Inhalt anzeigen.

Titel durchsuchen

Sobald Sie die PE-Datei öffnen, öffnet das Programm den Header-Viewer. Hier können Sie viele interessante Dinge sehen, aber nichts kann geändert werden, und es ist nicht notwendig.

Datenverzeichnisse

Datenverzeichnisse (Datenverzeichnisse) sind ein wichtiger Bestandteil jeder ausführbaren Datei, da in diesem Array Informationen über Strukturen gespeichert werden (ihre Größe, Zeiger auf den Anfang usw.). Kopien von Dateien sollten geändert werden, da dies sonst zu irreversiblen Folgen führen kann.

Abschnittsüberschriften

Der gesamte wichtige Anwendungscode ist im PE Explorer zur besseren Ordnung in verschiedenen Abschnitten gespeichert. Da dieser Abschnitt alle Daten enthält, können sie geändert werden, indem Sie ihren Speicherort ändern. Sollten einige Daten nicht geändert werden, weist Sie das Programm darauf hin.

Ressourcen-Editor

Wie Sie wissen, sind Ressourcen ein wesentlicher Bestandteil des Programms (Symbole, Formulare, Inschriften). Aber mit Hilfe von PE Explorer können sie geändert werden. So können Sie das Anwendungssymbol ersetzen oder das Programm ins Russische übersetzen. Hier können Sie auch Ressourcen auf Ihrem Computer speichern.

Disassembler

Dieses Tool ist für die Expressanalyse ausführbarer Dateien erforderlich, außerdem ist es in einem vereinfachten, aber nicht weniger funktionalen Format erstellt.

Tabelle importieren

Dank dieses Abschnitts im Programm können Sie herausfinden, ob die geprüfte Anwendung für Ihren Computer schädlich ist. Dieser Abschnitt enthält alle Funktionen, die im Programm enthalten sind.

Abhängigkeits-Scanner

Ein weiterer Vorteil des Programms im Kampf gegen Viren. Hier sehen Sie die Abhängigkeit mit dynamischen Bibliotheken und erkennen dadurch, ob diese Anwendung eine Gefahr für Ihren Rechner darstellt oder nicht.

Programmvorteile

  1. Intuitiv
  2. Fähigkeit, Ressourcen zu ändern
  3. Ermöglicht es Ihnen, Viren im Programm herauszufinden, noch bevor Sie den Code ausführen

Mängel

  1. Fehlende Russifizierung
  2. Bezahlt ( Freie Version nur 30 Tage verfügbar)

PE Explorer ist ein hervorragendes Tool, mit dem Sie Ihren Computer vor Viren schützen können. Natürlich kann es auch in eine andere Richtung verwendet werden, indem gefährlicher Code zu einem völlig harmlosen Programm hinzugefügt wird, aber dies wird nicht empfohlen. Aufgrund der Möglichkeit, Ressourcen zu ändern, können Sie außerdem Werbung hinzufügen oder das Programm ins Russische übersetzen.

SDL Passolo 2015 ist das leistungsstärkste Dienstprogramm zum Übersetzen von Programmen in verschiedene Sprachen der Welt. Versteht viele Formate, unterscheidet die Art der Sprache. Ein Vorlagen-Ressourcen-Editor mit erweiterten Funktionen für die Softwarelokalisierung. SDL Passolo 2015 verfügt über einen visuellen Dialogeditor mit einer Reihe von handliche Werkzeuge Formatierung, unterstützt die Arbeit mit fast allen Ressourcen, hat viele Feinabstimmung, Möglichkeit Stapelverarbeitung, sowie eine integrierte Rechtschreibprüfung. SDL Passolo 2015 kann einem Übersetzer dabei helfen, viel Aufwand und Zeit bei der Softwarelokalisierung zu sparen. Dies liegt daran, dass das Programm für die meisten die Funktion der automatischen Übersetzung und Überprüfung des übersetzten Textes bietet Häufige Fehler. Die automatische Übersetzungsfunktion wird in Anwesenheit bestimmter Wörterbücher ausgeführt, von denen es viele im Internet gibt, einschließlich der von Microsoft. Wenn Sie mit vorgefertigten Wörterbüchern nicht zufrieden sind, können Sie diese selbst erstellen. Es reicht aus, ein Programm einmal zu übersetzen und die Übersetzungsliste in ein Wörterbuch zu exportieren. Und in Zukunft kann dieses Wörterbuch bei der Übersetzung neuer Programmversionen eingebunden werden. SDL Passolo 2015 verfügt über eine sehr fortschrittliche visuelle Korrektur von Dialogfeldern in übersetzbaren Programmen. Es genügt zu sagen, dass es der Formularbearbeitung in Microsoft Visual Studio.Net in nichts nachsteht. Wenn Sie sagen, dass Resource Hacker gute Dialoganpassungen hat, dann haben Sie Passolo nicht gesehen. Die Liste der Passolo-Vorteile beschränkt sich nicht darauf. Hinzufügen. Information: Neue Features: * Terminologie wird jetzt auch aus den Passolo-Übersetzungslisten bereitgestellt. * Dienste für Vorübersetzung, Suche nach losen Übersetzungen, Matches und Terminologie können jetzt bequem im Optionsdialog ausgewählt werden. * Die Suche nach Übersetzungen mit Schnellindizes in Projekten und Glossaren beschleunigt den Suchvorgang erheblich. * Neue moderne Benutzeroberfläche, die das beliebige Andocken von Ausgabefenstern ermöglicht. Neuer Parameter Automatisches Ausblenden für Ausgabefenster. * Tastenkombinationen können im Anpassungsdialog der Symbolleiste geändert werden. * Die Suche nach nicht-strikten Übersetzungen markiert jetzt die Unterschiede von nicht-strikten Übereinstimmungen im gesuchten Text mit farbigen Texten. * Wenn Sie Einträge auswählen, werden Terminologien ausgewählt Kontextmenü Quelltext, Pop-up aus zusätzliche Information relativ zum angezeigten Terminologieelement. * Dateien können per Drag & Drop in das Projektfenster gezogen werden, um sie als Quelldatei hinzuzufügen oder Informationen daraus zu importieren. * Die Historie aller Änderungen im Text ist mit Datum und Benutzername versehen. Frühere Datenversionen können mit der Rollback-Funktion wiederhergestellt werden. * Einträge im Projektfenster können jetzt gefiltert und gruppiert werden. * Einträge im Projektfenster können als Listen von Strings gefiltert werden.