Binaris mit C erstellen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Binaris mit C erstellen

      Hi,

      ich suche eine Möglichkeit mit der ich mit C eine datei HEX mäßig öffnen kann und dann gewisse werte oder die komplette Datei mit meinen HEX werten ersetzen kann.

      Ich programmiere im Textwrangler und nutze die GCC.

      danke schon mal
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.
    • Hallo,

      schau mal hier: Binaris mit C erstellen. Dort wird jeder fündig!

      Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
    • Moin,
      also wenn ich dich richtig verstanden habe, willst du ein Programm schreiben, dass den Inhalt einer Datei verändert.
      Das könntest du machen, indem du via open die Datei öffnest, mit lseek an die gewünschte Position gehst und dann über write die neuen Daten einfügst. Diese werden als char* übergeben. Entsprechend musst du vorher einen Speicherbereich, der groß genug ist, über malloc allokieren oder aber bei fester Größe ein Array aus char definieren. Dieses initialisierst du dann byte-weise mit deinen neuen Daten, die du dann auch in Hex angeben kannst.
      Alternativ kannst du die Datei auf in den Speicher mappen lassen und die Daten dort direkt manipulieren.

      Ich hoffe, ich hab dich nicht falsch verstanden :)

      Timo
      MacBook Pro 15,4" 2.0 GHz/1. Generation/2048 MByte RAM/MacOS X 10.5.4
      Powerbook G3 12" (Wallstreet) 233MHz/256 MByte RAM/MacOS X 10.4.11
      iPod Video, 60 GByte
    • Hm okay habs mal mit open() probiert.

      1. Wenn ich mit printf() das Array ausgeben lasse dann bekomme ich nur lauter müll also die Assciversion des Binaris sozusagen :)

      2. Komischerweiße reicht mir ein Charbuffer von 118 aus um eine über 19kb große datei einzulesen. Wo ist der Rest?

      #include <cstdlib>
      #include <iostream>
      #include <io.h>
      #include <errno.h>
      #include <fcntl.h>

      using namespace std;

      int main(int argc, char *argv[])
      {
      long openfile;
      char Buffer [19456];
      int Maximum;
      long fileread;

      openfile = open("arp.exe", O_RDONLY, O_BINARY);
      if (openfile>0)
      {
      printf ("Open succeeded.\n");
      }else{
      printf ("Open faild.\n");
      }

      Maximum = 118;

      fileread = read (openfile, Buffer, Maximum);
      if (fileread < Maximum) {
      printf ("An incomplete record was read.\n");
      }

      int i = 0;
      while(i<10)
      {
      printf("Dataout[%i]: %c\n", i, Buffer);
      i++;
      }

      system("PAUSE");
      return EXIT_SUCCESS;
      }


      Hier mal mein Code, wenn ich bei Maximum den Wert 118 eingebe kommt kein ausput, das heißt Datei ist eingelesen. Bei 119 wird diese Zeile

      printf ("An incomplete record was read.\n");

      ausgeführt.

      P.S. code hier darzustellen ist echt beschissen, solbst in den code blöcken, da wird alles in einer Zeile dargestellt ....
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Crazy_Apple ()

    • Ja schon wieder ein Post, das mit den 10 Minuten ist auch kacke.

      Die exe hab ich zu testzwecken aus einer windowsmaschine rauskopiert.

      Um den Endeffect meines Programmes zu erklären, den es haben soll :D ist. Ich möchte ein Komplettes Binary in HEX in mein Programm implementieren und möchte dann das mein Programm dieses Binary aus sich heraus erstellt.

      so soll es dann mal ausschaun. :) z.B.

      >./genbin
      generating Binary ...
      HelloWorld succesfully created.
      >./HelloWorld
      Hallo Welt!
      >
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.
    • In deinem Code sind auf alle Fälle ein paar Fehler.

      #include <cstdlib>
      #include <iostream>
      #include <io.h>
      #include <errno.h>
      #include <fcntl.h>

      using namespace std;

      int main(int argc, char *argv[])
      {
      long openfile;
      char Buffer [19456];
      int Maximum, i;
      long fileread;

      openfile = open("arp.exe", O_RDONLY | O_BINARY);
      if (openfile > 0)
      {
      printf ("Open succeeded.\n");
      }else{
      printf ("Open failed.\n");
      return 1;
      }

      Maximum = 118;

      fileread = read (openfile, Buffer, Maximum);
      if (fileread < Maximum)
      printf ("An incomplete record was read.\n");

      for(i = 0; i < 10; i++)
      printf("Dataout[%i]: %x\n", i, Buffer);

      close(openfile);
      system("PAUSE");
      return EXIT_SUCCESS;
      }

      Der open-Call war auf alle Fälle falsch, weil der Modus mit dem binären OR verknüpft werden muss. Deine while-Schleife war stilistisch schlecht. Und bei einem Fehler der open-Operation solltest du nicht weitermachen.
      Ich hab den obigen Code nicht getestet, aber es sollte so funktionieren. Wenn nicht, sag Bescheid, dann schau ich mir den Kram morgen mal genauer an.

      Timo
      MacBook Pro 15,4" 2.0 GHz/1. Generation/2048 MByte RAM/MacOS X 10.5.4
      Powerbook G3 12" (Wallstreet) 233MHz/256 MByte RAM/MacOS X 10.4.11
      iPod Video, 60 GByte
    • Huhu danke schon mal,

      werde ich morgen in der Arbeit gleich testen ...

      Ja das mit der While ... ich mein man kann im ganzen code erkennen das er sehr schnell geschrieben wurde und nur zum testen da ist :)

      Wenn alles Funktioniert wird aufgeräumt ;)

      Aber danke für deine Zeit und Hilfe
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.
    • Moin,

      was ich gestern noch vergaß:
      Statt Byte (ich glaube das gibts aber unter Windows), kannst du entweder:
      unsigned char oder UInt8 benutzen. UInt8 ist üblicherwiese definiert als:

      typedef unsigned char UInt8;

      Damit hast du dann ein Byte :)
      MacBook Pro 15,4" 2.0 GHz/1. Generation/2048 MByte RAM/MacOS X 10.5.4
      Powerbook G3 12" (Wallstreet) 233MHz/256 MByte RAM/MacOS X 10.4.11
      iPod Video, 60 GByte
    • okay ein Stück weit hat geklapt:)

      Nun hab ich einen HexDump in einem TextDokument.

      Nun möchte ich den Hexdump umwandlen und zwar von:
      a9def6 zu -> \xa9\xde\xf6

      ich hab mir versucht dazu ein kleines Programm zu schrieben... welches auch funktionieren sollte doch iwo hab ich da nen Logikfehler ....

      #include <cstdlib>
      #include <iostream>
      #include <io.h>
      #include <errno.h>
      #include <fcntl.h>

      //typedef unsigned char UInt8;

      using namespace std;

      int main(int argc, char *argv[])
      {
      int openfile;
      char *Buffer [38912];
      int Maximum;
      int fileread;

      openfile = open("HEXDUMP.txt", O_RDONLY);
      if (openfile>0)
      {
      printf ("Open succeeded.\n");
      }else{
      printf ("Open faild.\n");
      }

      printf("------ #### ------\n");
      printf("Array einblick.\n");

      Maximum = 38912;

      fileread = read (openfile, Buffer, Maximum);
      if (fileread < Maximum) {
      printf ("An incomplete record was read.\n");
      }

      int i = 38900;
      while(i<38912)
      {
      printf("Dataout[%i]: %c\n", i, Buffer);
      i++;
      }
      printf("------ #### ------\n");
      printf("Array Leange: %d \n", sizeof(Buffer));

      char *tmpbuf[(2*sizeof(Buffer))];

      int b = 0;
      int a = 0;

      do
      {
      tmpbuf = "\\";
      b++;
      tmpbuf[b] = "x";
      b++;
      tmpbuf[b] = Buffer[a];
      b++;
      a++;
      tmpbuf[b] = Buffer[a];
      b++;
      a++;
      } while (b < 20);

      int c = 0;
      while(c<20)
      {
      printf("tmpbuf out: %c\n", tmpbuf[code=c]);
      c++;
      }

      system("PAUSE");
      return EXIT_SUCCESS;
      }


      Ich habe auch bedenken das tmpbuf und Buffer zeiger sein müssen ... nur anders hats mir der Compiler nicht gefressen ....
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.
    • Wow, was hast du dir da bloß zurechtgestrickt?

      Nun ja. Das mit den Zeigerarrays ist schon mal... böse. Es wird nichts dummes passieren, weil du die Zeiger Gott sei dank nie dereferenzierst.
      Allerdings ist deine Ausgabe weder richtig noch elegant.

      Du wirst, wenn ich das richtig sehe (ich habs jetzt nicht probiert) bestenfalls Mist bekommen. Das Problem liegt hier an zwei Dingen:
      * Die Formatanweisung %c interpretiert den übergebenen Wert als ASCII Zeichen. Übergibst du also 65 (printf("%c", 65)) bekommst du ein großes A. Ich vermute, du wolltest einen String ausgeben. Das geschieht via %s. Dafür sind deine Arrays aber ungeeignet und du musst Arrays von Typ char nicht char* benutzen.
      * Selbst wenn du das soweit korrigiert hast, bekommst du noch Mist, weil per Standard in C alle Strings mit einer 0 (also \0 nicht '0') terminiert werden.

      Obendrein ist dein Ansatz unnötig kompliziert. Du könntest einfach die Datei in zwei Byte Schritten einlesen (okay, das wäre nicht sonderlich performant, aber fürs erste reichts) und dann folgendes tun:
      puts("\\x");
      putc(buffer[0]);
      putc(buffer[1]);

      Alternativ kannst du auch einfach dein altes Programm so schreiben, dass die Ausgabe wie gewünscht erfolgt:
      #include <errno.h>
      #include <fcntl.h>
      #include <stdio.h>

      typedef unsigned char UInt8;

      int main(int argc, char *argv[])
      {
      long openfile;
      UInt8 Buffer [19456];
      int Maximum, i;
      long fileread;

      if(argc != 2) {
      printf("Syntax: %s <FILE>\n", argv[0]);
      return 1;
      }

      openfile = open(argv[1], O_RDONLY);
      if (openfile > 0) {
      printf ("Open succeeded.\n");
      }else{
      printf ("Open failed.\n");
      return 1;
      }

      Maximum = 118;

      fileread = read (openfile, Buffer, Maximum);
      if (fileread < Maximum)
      printf ("An incomplete record was read.\n");

      for(i = 0; i < 10; i++)
      printf("\\x%02x", Buffer);
      puts("\n");

      close(openfile);
      return 0;
      }

      Ich hab das kurz durch gcc gejagt und getestet und das klappt.

      Wie ich gerade sah, wirst du Systemintegrator. Habt ihr in der Schule gerade mit C angefangen?
      MacBook Pro 15,4" 2.0 GHz/1. Generation/2048 MByte RAM/MacOS X 10.5.4
      Powerbook G3 12" (Wallstreet) 233MHz/256 MByte RAM/MacOS X 10.4.11
      iPod Video, 60 GByte
    • Jop lerne grade Systemintegrator, ich bin im dritten Lehrjahr.

      C mach ich mehr oder weniger aus dem Antrieb das ich in der Arbeit einfache immer wiederkehrende Routinen in eine Applikation packen kann und so sehr viel Zeit und auch Kosten sparen kann. Durch shellscripte geht zwar auch so einiges aber teilweise fehlen einige Funktionen die ich mir mal selbst Coden könne will. :)

      Mein Hauptaufgabenfeld liegt in der Administration, Wartung und Pflege von Unixsystemen auf Sparc, RISC und x86 Plattformen.

      Das ich etwas Dreckig Programmiere weiß ich schon :) aber wenns irgendwann funktioniert kann ich immer noch aufräumen und mir Gedanken zu Verbesserungen machen ....

      Deinen Geposteten Code werde ich mir morgen bzw. heute ^^ zu gemüte führen:)
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.
    • Erm ja gut, jetzt hab ich das mal getestet ... nur ich bekommen einen falschen output. Das muss mit der Zeile Zusammenhängen.

      printf("\\x%02x", Buffer[code=c]);

      die ich nicht ganz verstehe ...

      Der Output zeigt mir immer vier Byte an ... also:

      \x41354434

      In meinem Code wollte ich eigentlich nur einen Buffer in dem die angepassten Werte drinnen stehen. Also das aus "FF" ein "\xFF" wird. Um das dann später besser weiterverarbeiten zu können.
      An Apple a Day Keeps Windows Away ^^
      Microsoft is not the answer, it's the question and the answer is NO.