PE Übungsprogramm
-
Hey,
ich bin derzeit am c++ lernen/üben und hab mich mal an einem Tool probiert, den Entrypoint einer Ausführbaren Datei anzeigt.
Es legt die Struktur der PE Datei über die Binary.
Allerdings bekomm ich jetzt einen Linkerfehler:Fehler 3 error LNK2019: unresolved external symbol "public: __thiscall _IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(void)" (??0_IMAGE_OPTIONAL_HEADER@_IMAGE_NT_HEADERS@@QAE@XZ) referenced in function "public: __thiscall _IMAGE_NT_HEADERS::_IMAGE_NT_HEADERS(char * &)" (??0_IMAGE_NT_HEADERS@@QAE@AAPAD@Z) C:\Users\Duuudaaa\Documents\Visual Studio 2010\Projects\PE\PE\_IMAGE_NT_HEADERS.obj PE
Wäre echt Super wenn sich das jemand anschauen könnte. Und mir vllt auch ein paar Tipps geben könnte was ich besser hätte machen können.
Hier Der Code:
_IMAGE_NT_HEADERS.h :#if !defined(__IMAGE_NT_HEADERS_H) #define __IMAGE_NT_HEADERS_H #include "Defs.h" class _IMAGE_NT_HEADERS { public: DWORD Signature; class _IMAGE_FILE_HEADER { public: WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; }*ifh; class _IMAGE_OPTIONAL_HEADER { public: 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 MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Reserved1; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; class _IMAGE_DATA_DIRECTORY { public: DWORD VirtualAddress; DWORD Size; }*idd[16]; _IMAGE_OPTIONAL_HEADER(); _IMAGE_OPTIONAL_HEADER(char* &buffer); }*ioh; public: _IMAGE_NT_HEADERS(char* &buffer); }*inh; #endif //__IMAGE_NT_HEADERS_H_IMAGE_NT_HEADERS.cpp :
#include "_IMAGE_NT_HEADERS.h" #include "Defs.h" #include <iostream> _IMAGE_NT_HEADERS::_IMAGE_NT_HEADERS(char* &buffer) { ifh = new _IMAGE_FILE_HEADER(); ioh = new _IMAGE_OPTIONAL_HEADER(); inh = (_IMAGE_NT_HEADERS*)buffer; std::cout << "0x" << inh->ioh->AddressOfEntryPoint << inh->ioh->AddressOfEntryPoint; buffer = buffer + sizeof(inh); } _IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(char* &buffer) { for (int i = 0; i < 16;i++) idd[i] = new _IMAGE_DATA_DIRECTORY(); }Defs.h :
#if !defined(__Defs_H) #define __Defs_H typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long int DWORD; #endifMain Programm
#include <fstream> #include <iostream> //#include "_IMAGE_DOS_HEADER.h" Funktioniert schon kann ich auf wunsch posten #include "_IMAGE_NT_HEADERS.h" // Der obig zu sehende Header using namespace std; char *in_filename = 0; char *out_filename = 0; char *z_filename = 0; char *password = "alliHooho"; bool encrypt = false; int currarg = 0; char* Rückgabe(int count, char *argv[]) { if(currarg < count && count > 1) { char* t; t = argv[currarg]; ++currarg; return t; } return NULL; } int main(int argc, char *argv[]) { Rückgabe(argc, argv); in_filename = Rückgabe(argc, argv); /* out_filename = Rückgabe(argc, argv); if(encrypt == false) { z_filename = in_filename; in_filename = out_filename; out_filename = z_filename; }*/ if(in_filename == NULL) { cout << "Input File fehlt"; return 1; } /* if(out_filename == NULL) { cout << "Output File fehlt"; return 1; }*/ fstream input; input.open( in_filename, ios::in | ios::binary ); //ofstream output; // output.open( out_filename, ios::in | ios::binary | ios_base::trunc ); input.seekg( 0, ios_base::end ); int length = input.tellg( ); input.seekg( 0, ios_base::beg ); int blocks = 0; char *buffer = new char[ length ]; input.read( buffer,length ); char* b = buffer; _IMAGE_DOS_HEADER* idh = new _IMAGE_DOS_HEADER(b); _IMAGE_NT_HEADERS* inh = new _IMAGE_NT_HEADERS(b); delete [] buffer; input.close( ); /* output.close( );*/ }
-
Fehler 3 error LNK2019: unresolved external symbol "public: __thiscall _IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(void)" (??0_IMAGE_OPTIONAL_HEADER@_IMAGE_NT_HEADERS@@QAE@XZ) referenced in function "public: __thiscall _IMAGE_NT_HEADERS::_IMAGE_NT_HEADERS(char * &)" (??0_IMAGE_NT_HEADERS@@QAE@AAPAD@Z) C:\Users\Duuudaaa\Documents\Visual Studio 2010\Projects\PE\PE\_IMAGE_NT_HEADERS.obj PE
Die Funktion "_IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(void)" liegt nicht implementiert vor... Der Aufruf erfolgt in der Funktion "_IMAGE_NT_HEADERS::_IMAGE_NT_HEADERS(char * &)"
Also entweder fehlt die die entsprechende Library oder .cpp file, wenn es deine eigene Funktion ist, dann solltest du die einfach implementieren, etc.

Einfach mal die Fehlermeldung lesen lernen... Dann mal Google/Yahoo anschmießen...
-
Danke aber so wie ich das sehe hab ich oben genau die Datei gepostet in der die geforderte Klasse ist? Oder nicht.
Gruß
-
Genau und entsprechend lesen

Du hast ja die Funktion:_IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(void)aufgerufen. Jedoch nur die Funktion so
_IMAGE_NT_HEADERS::_IMAGE_OPTIONAL_HEADER::_IMAGE_OPTIONAL_HEADER(char* &)implementiert

Ja das ist ein unterschied

Ergo:
ioh = new _IMAGE_OPTIONAL_HEADER();einfach mal noch den Parameter mitgeben.
EDIT: Stimmt sehe auch grade das du ja noch einen Konstruktor ohne Parameter deklariert, aber nirgends implementiert hast... Komme mit der Einrückung irgendwie nicht klar, aber das ist eher mein Problem

-
FaxXer schrieb:
Danke aber so wie ich das sehe hab ich oben genau die Datei gepostet in der die geforderte Klasse ist? Oder nicht.
GrußDas ist keine Klasse, sondern der Konstruktor den du in der Klasse deklariert hast und den du dann auch irgendwo definieren musst wenn du ihn benutzt (und selbst wenn du ihn nicht benutzt eigentlich auch, denn wozu deklarierst du ihn sonst?). Und ich sehe nicht wo du dies tust.
-
Ja hast recht allerdings hab ich da glaub noch mehr Fehler.
-
Was hast du eigentlich genau vor? Willst du lediglich einige Informationen aus einer ausführbaren Datei auslesen, oder willst du bspw. Informationen über einen momentan ausgeführten Prozess? Letzteres ist durch die Address space layout randomization wesentlich komplizierter.
Wenn du aber, wie ich vermute, nachdem ich deinen Code kurz überflogen habe, nur Informationen aus einer Datei haben möchtest, dann lies doch den PIMAGE_DOS_HEADER und die PIMAGE_NT_HEADERS32/64 direkt aus.
-
Ich will nur zur Übung die Informationen aus einer ausführbaren Datei lesen. Hmm ja hab mir gedacht wenn ichs so mach ist der Lernanteil wesentlich höher. Deswegen verzicht ich erstmal auf den schnelleren weg.
Gruß