Hex-Konverter
-
Nettes Thema,
hab ich gestern erst gemacht
Aber wenn wir schon dabei sind, ich hab sowas ähnliches geschrieben, allerdings leite ich den HEX Code in eine neues Datei.
Klappt auch wunderbar nur wenn ich die Quelldatei mit denm Hex Editor öffne, dann bekomm ich ja ja auch Zeilennummern angezeigt, sowas in der Form:
11 4d 5a ...
22 80 00 ...
33 00 00 ...Wobei 11,22,33,usw die Zeilennummern sind.
Wie bkomm ich die ebenfalls ausgelesen und vor die jeweilge Zeile in die Ausgabe gesetzt ?
Will praktisch ein exe2bat Programm machen.
Also den Hex Code einer Datei in eine Bat schreiben, die wiederum bei Ausführung die Quellexe erzeugt.Thx
-
Hi!
Zeilennummern? Das ist eigentlich der jeweilige Offset der Zeile in der Datei. Den kannst du einfach mitzählen, wenn du pro Zeile 16 Bytes darstellst dann inkrementierst du deine Nummerierung pro Zeile um 16.
printf( "%08X ", line ); line += 16;
grüße
-
Kannst du mir das etwas genauer erklären ?
-
Hi!
So kompliziert isses doch ned:
while ( !feof( f ) ) { fread( buffer, 16, 1, f ); printf( "%08X ", line ); line += 16; for ( i = 0; i < 16; i += 2 ) { printf( "%02X%02X ", buffer[ i ], buffer[ i+1 ] ); } for ( i = 0; i < 16; i++ ) { isPrintable( ( int )buffer[ i ] ) ? printf( "%c", buffer[ i ] ) : printf( "." ); } printf( "\n" ); }
grüße
-
Wie deklarierst du line ? Als normales char line[16] ?
-
Hi!
Der Typ ist unsigned long.
Einfach eine Durchnummerierung der Byteoffsets für den jeweiligen Zeilenanfang...
grüße
-
Ok, habs.
Das ist jetzt meine Ausgabe:
7C91D592 4D 5A 80 00 01 00 00 00 04 00 00 00 FF FF 00 00
7C91D5A2 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00Allerdings sieht der Offset nicht aus wie der den Ich vom HexEditor kenne.
7C91D592 sollte ja 11 oder sowas sein.
Hab ne bat die eine andere exe wiederherstellt und da sieht die erste zeile folgendermaßen aus:
echo e 0100 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00>>1
echi is klar. Aber das e ? und der Offset sieht auch anders aus.
Sorry, aber sonst noch nie was mit Hex am Hut gehabt.
-
Hi!
Wenn du dir die Mühe machst und deine Variable line mit 0 initialisierst... Das hat nichts mit "hex" zu tuen, was ist überhaupt Hex?
Und außerdem sollte das erste Offset nicht 11 sein sondern 0 und das zweite 10, da du immer 16 Bytes pro Zeile hast. Und was ist 0+16??? 0x10, genau!grüße
-
Sorry. *Kopf gegen Tisch schlägt*
Alles klar. Das war mein Fehler. Jetzt passt die Ausgabe.
1000 Dank.
-
Ich will den Text aus einer Datei lesen und dann den Text als Binaer und ASCII Code ausgeben. Der Text sieht folgend aus:
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988und so weiter.
-
noch eine frage,
wie kann ich auf den Code zugreifen,
: 10 0100 00 214601360121470136007EFE09D21901 40
DIE ERSTE 8 ZAHLEN INTERESIEREN MICH NICHT UND DIE LETZTEN 2 AUCH NICHT.
Wie kann ich nur die "DATEN" zugreifen.
-
Hat jemand schonmal ein exe2bat Programm geschrieben ?
Ich bekomms nämlich nich hin.
Der Hex Code der Quell-Exe wird inklusive Offset erfolgreich in eine Datei geschrieben.
Nur wie macht man aus der anderen Datei jetzt wieder eine exe ?Oder hab ich da das prinzip nicht verstanden ? Bin für jede Kritik und Vorschläge offen.
-
helvin schrieb:
noch eine frage,
wie kann ich auf den Code zugreifen,
: 10 0100 00 214601360121470136007EFE09D21901 40
DIE ERSTE 8 ZAHLEN INTERESIEREN MICH NICHT UND DIE LETZTEN 2 AUCH NICHT.
Wie kann ich nur die "DATEN" zugreifen.@ helvin
In dem du die Datei zeilenweise ausliest und jede
Zeile ab der 13. Position (Leerzeichen und was du nicht am Anfang brauchst überspringen)
bis zum Zeilenende minus 3 ausguibst.
-
Hi!
@Rubber:
Ne du hast es nicht verstanden... Du darfst natürlich nur die richtigen Daten in die Datei zurückschreiben, ohne Offset. Wenn du deine hexadezimale Darstellung verwendest musst du die einzelnen Blöcke (jeweils zwei Ziffern im Normalfall) in den entsprechenden Bytewert umwandeln.
Das speicherst du dann in deine Binärdatei.grüße
-
Ok, dann erklär es mir.
#include <stdio.h> typedef unsigned char byte; typedef unsigned long dword; int main( int argc, char **argv ) { FILE *f = fopen( argv[1], "rb" ); if ( !f ) { printf("Quelldatei \"%s\" nicht gefunden !!\n", argv[1]); return 1; } char batname[strlen(argv[1]) + 4]; strcpy(batname,argv[1]); strcat(batname,"copy.exe"); FILE *o = fopen( batname, "w+" ); if ( !o ) { printf("Zieldatei \"%s\" konnte nicht erstellt werden !!\n", batname); return 1; } byte buffer[ 16 ]; dword line = 0; dword i = 0; while ( !feof( f ) ) { fread( buffer, 16, 1, f ); char hex_string[12] = ""; line += 16; for ( i = 0; i < 16; i += 2 ) { hex_string[0] = '\0'; sprintf(hex_string," %02X %02X", buffer[ i ], buffer[ i+1 ] ); fputs(hex_string,o); } fputs("\r\n",o); } fclose( f ); fclose( o ); return 0; }
Das wurde jetzt den Hex Code in deine Zieldatei schreiben.
Wenn du deine hexadezimale Darstellung verwendest musst du die einzelnen Blöcke (jeweils zwei Ziffern im Normalfall) in den entsprechenden Bytewert umwandeln.
Wie mach ich das ?
-
Hi!
Ja, du hast jetzt die Daten als Hexadezimale Werte (im ASCII Format) in deine Datei geschrieben. Wenn du daraus wieder eine Binärdatei erzeugen willst musst die die einzelnen Bytes (ASCII->Hexadezimale Darstellung) wieder in die korrekten Bytewerte umwandeln.
Diese speicherst du dann in deine Binärdatei und schon hast du die Originaldaten wieder!grüße
-
Ok,
da die Ziel-Datei aber eigentlich eine .bat ist
und diese wiederrum die .exe erzeugt versteh ich nicht ganz wie ich der .bat
klarmache dass sie HEX wieder in die korrekten Bytewerte umwandelt.Das ist nämlich mein prob.
-
Hi!
Tja, Pech gehabt würd ich sagen. Du kannst die Daten nicht direkt in eine Datei schreiben, da du sonst genau das selbe Ergebniss hast wie zuvor. Du musst dir ein Programm schreiben das dir die Konvertierung erledigt!
grüße
-
Es geht schon, nur versteh ich nicht ganz wie !
Ich hab hier zum Beispiel eine Bat Datei die mir die ftp.exe wiedererstellt.
Ausschnitt der Datei:
@ECHO OFF>1 echo e 0100 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00>>1 echo e 0110 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00>>1 echo e 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1 echo e 0130 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00>>1 .... echo rcx>>1 echo 4400>>1 echo n ftp.sys>>1 echo w>>1 echo q>>1 debug<1>nul rename ftp.sys ftp.exe
So sieht die aus.
Das heist, der Hex Code (inkl. Offset) wird in die Datei 1 kopiert (zeile für zeile).
Was allerdings das "e" nach jedem echo soll weis ich nicht und die sachen am Ende sagen mir auch nix.Vlt sagt es ja dir was.
-
Hi!
Diese Scriptdatei erstellt dir eine weitere Scriptdatei die von debug ausgeführt werden kann.
q = quit (debugger beenden)
e = eintritt an angegebener Adresse
rcx = erlaubt in den CX register einen Wert einzutragen, in dem Fall 4400, im CX Register steht die Datengröße
n = setzt den Namen der Datei
w = schreibt die Datei auf den DatenträgerDas script sieht dann so aus:
e 0100 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
e 0110 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
e 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e 0130 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00
rcx
4400
n ftp.sys
w
qdebug<1>nul // führt debug mit dem generierten Script aus
rename ftp.sys ftp.exe // benennt die Datei umIm übrigen solltest du nich einfach irgendwas kopieren ohne es zu versehen.
grüße