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;
    
    #endif
    

    Main 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 😉


  • Mod

    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ß


Log in to reply