Exe Hexadezimal abspeichern



  • Hallo Leute,

    Ich habe das Ziel eine Exe - Datei Hexadezimal abzuspeichern nur ich weiß nicht, wie ich den Inhalt Hexadezimal darstellen kann. Bis jetzt hab ichs folgender Weise probiert, was aber leider nicht geklappt hat:

    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
       ifstream In;
       ofstream Out;
       string Zeile;
    
       In.open( "Test,exe", ios::binary );
       Out.open( "Output.txt", ios::app );
    
       while( ! In.eof() )
       {
          getline( In, Zeile );
          for( unsigned int Count = 0; Count < Zeile.length(); Zeile++ )
          {
             Out << hex << Zeile.at( Count );
          }
          Out << "\n";
       }
    }
    

    Das hat also wie gesagt nicht funktioniert gehabt, das resultat in der Output.txt war leider falsch. Weiß jemand, wie ich es sonst programmieren kann?



  • Ich würde mich gar nicht mit dem string behängen.

    char ch;
       while( in.get(ch) )
          Out << hex << ch;
    


  • Das hat leider nicht ganz geklappt. Das ganze wurde nicht Hexadezimal abgespeichert, sondern 1zu1 von der Exe kopiert. Mein jetziger Code:

    #include <fstream>
    
    using namespace std;
    
    int main()
    {
       ifstream In;
       ofstream Out;
       char ch;
    
       In.open( "Test.exe", ios::binary );
       Out.open( "Output.txt", ios::app );
    
      while( In.get(ch) )
          Out << hex << ch;
    }
    

    Auszug aus der Output.txt

    MZ   ÿÿ ¸ @ € º ´ Í!¸LÍ!This program cannot be run in DOS mode.

    $ PE L ƒB|J à  8 R Š X €  p @        ÔÂ       ø .text DP  R  P.data  p  V @ 0À.rdata 0+ € , X @ 0@.bss €V ° € @À.idata ø 
    „ @ 0À U‰åƒì‰]ø‹E1Û‰uü‹ 1ö‹ =‘ ÀwC= Àr[¾ Ç 1Ò‰Tèā ƒøtz…ÀtÇ ÿлÿÿÿÿ‰Ø‹uü‹]ø‰ì] =” ÀtÂwJ=“ Àt´‰Ø‹uü‹]ø‰ì] = Àt[= ÀuÅÇ 1ö‰tè` ƒøtj…ÀtªÇ ÿÐëš=– ÀëÑÇ ¸ ‰Dè0 …ö„vÿÿÿèþ élÿÿÿÇ 1À‰Dè  ƒøt0…À„RÿÿÿÇ ÿÐé?ÿÿÿÇ ¹ ‰LèÜ€ é%ÿÿÿÇ ¸ ‰Dè€ é ÿÿÿ¶ ¼' U‰åSƒìÇ$ @ èí ƒìè…ü è€ý ÇEø Eø‰D¡ pD ǰD ‰D Eô‰D¸ °D ‰Dèu€ ¡ûD …Àtd£°pD ‹€E …Ò…¡ ƒúàt¡ûD ‰D¡€E ‹@0‰è3€ ‹€E ƒúÀt(¡ûD ‰D¡€E ‹@P‰è€ ë èó ‹°pD ‰èžû ƒäðèvû èÉ ‹ ‰D¡ °D ‰D¡°D ‰èU2 ‰Ãè



  • Ein char wird immer als char ausgegeben. Der Manipulator hex wirkt nur auf zahlen. Zudem möchtest du wahrscheinlich immer zwei Zeichen pro Byte ausgeben, mit einer Null als Füllzeichen:

    Out << setfill('0') << setw(2) << hex << (int)ch;
    


  • Ahh Ok danke. Das klappt schon ganz gut jetzt^^ Das einzigste Problem, das ich noch habe ist, dass das ganze nicht äuquivalent zu dem ist, was mir ein Hex-Editor ausgibt.

    HexEditor:

    4D5A90000300000004000000FFFF0000

    Output.txt:

    4d5affffff90000300000004000000ff

    Es sind immer mal wieder solche "f" - Reihen in der Outputfile zu finden, die mir der Hex Editor nicht anzeigt. Weiß jemand wieso?



  • Hm, dass ist das blöde bei signed char -> int , hab ich vergessen.

    Out << setfill('0') << setw(2) << hex << (((int)ch) & 0xff);
    

    Das sollte jetzt nur das letzte Byte aus dem int berücksichtigen.



  • Vielen Dank, es stimmt jetzt alles.


Anmelden zum Antworten