Hex-Konverter



  • 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
    :100110002146017EB7C20001FF5F16002148011988

    und 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äger

    Das 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
    q

    debug<1>nul // führt debug mit dem generierten Script aus
    rename ftp.sys ftp.exe // benennt die Datei um

    Im übrigen solltest du nich einfach irgendwas kopieren ohne es zu versehen.

    grüße



  • Kann mir nich vorstellen dass das so funktioniert. Im übrigen solltest du nich einfach irgendwas kopieren ohne es zu versehen.

    1. Es funzt ! Hab es oft genug versucht.

    2. Deshalb versuch ich den Code ja nachzuempfinden um ihn zu verstehen.

    rcx
    4400
    n ftp.sys

    Diese 3 Zeilen sagen mir überhaupt nichts.

    das is aus der Help von Debug:

    vergleichen C Bereich Adresse
    eingeben E Adresse [Liste]
    benennen N [Pfadname] [Argumentliste]
    Registeranz. R [Register]
    Expansionsspeicher zuordnen XA [#Seiten]
    Expansionsspeicher freigeben XD [Zugriffsnummer]
    Expansionsspeicher abbilden XM [LSeite] [PSeite] [Zugriffsnummer]
    Expansionsspeicherstatus anzeigen XS

    Wenn r die Registeranzahl ist, wieso folgt ihr dann kein Wert sondern cx ?
    Fragen über Fragen.

    Will es ja nur verstehen.



  • Hi!

    Ok, les dir meinen Beitrag oben durch und versuchs zu verstehen... :-S

    grüße



  • Ok, die debugger sache hab ich verstanden.

    Allerdings geht es immernoch nicht. Die funktionierende bat hat sieht ja wie folgt aus:

    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 e 44C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1
    echo e 44D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1
    echo e 44E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1
    echo e 44F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1
    

    Die bat, die aber jetzt von dem C-Code erzeugt sieht so aus:

    echo e 0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00>>1
    echo e 0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00>>1
    echo e 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>1
    echo e 0030 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 00 00>>1
    ...
    echo e AFD0 49 4E 47 58 58 50 41 44 44 49 4E 47 50 41 44 44>>1
    echo e AFE0 49 4E 47 58 58 50 41 44 44 49 4E 47 50 41 44 44>>1
    echo e AFF0 49 4E 47 58 58 50 41 44 44 49 4E 47 50 41 44 44>>1
    echo e B000 49 4E 47 58 58 50 41 44 44 49 4E 47 50 41 44 44>>1
    

    Wie du siehst unterscheiden sie die Offsets aus beiden Dateien obwohl sie ja die selbe Datei zeigen.



  • Hi!

    100 ist der standard Offset von debug der als Startpunkt der Datei dient. addier zu deinem Offset halt immer 100 hinzu, dann passt das...

    Die Bytes unterscheiden sich im übrigen auch.

    grüße



  • Das sich die Bytes unterscheiden ist mir auch schon aufgefallen. Woran kann das liegen ?



  • Hi!

    Das du's falsch ausliest? Das die andere Datei fehlerhaft ist? Das du die falschen Zeilen kopiert hast?
    Keine Ahnung!

    grüße



  • Dann schau dir den Code an:

    #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,".bat");
    
    	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;
    
    	fputs("@echo off>1\r\n",o);
    
        while ( !feof( f ) )
        {
            fread( buffer, 16, 1, f );
    
    		char hex_string[12] = "";
    		sprintf(hex_string,"echo e %04X", line );
    		fputs(hex_string,o);
            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(">>1\r\n",o);
        }
    
        fclose( f );
    	fclose( o );
    
        return 0;
    }
    

    Lese ich da was falsch aus ? Ich glaube nicht. Die Datei aus der ich versuche den hex zu lesen ist die ganz normale ftp.exe aus dem Windows\System32 Ordner. Die ist ok und funktioniert ordnungsgemäß. Die ftp.exe die mir aus der funktionierenden Bat-Datei erstellt wird funktioniert genauso ordnungsgemäß. Allerdings ist die erstellte Datei 17 Kb groß und nicht 44 Kb wie das Orginal.


Anmelden zum Antworten