Hex-Konverter
-
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
-
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.sysDiese 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 XSWenn 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.
-
Hi!
Also ist es eine andere Datei! Im übrigen kann ich das im Detail jetzt nicht checken da ich hier kein installiertes Windows habe, also fehlt mir auch die ftp.exe.
Musst wohl selbst schauen ob das was falsch läuft, debuggen ist das Zauberwort!grüße
-
ich habe eine Text Datei in dem ich einen Hex-code habe, der folgend aussieht:
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FFjetzt soll ich einen Program schreiben der mir den Hex-code als ASCII Code und als Binaer-code am Bildschirm ausgibt.
Bis jetz habe ich das geschaft :
#include <stdio.h>int main(void)
{
FILE * pFile;
char string [100];pFile = fopen ("hex.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
fgets (string , 100 , pFile);
puts (string);
fclose (pFile);
}return 0;
}Aber dieser Program gibt mir nur die erste zeile aus. Ich habe schon versucht den fgets mit EOF zu setzen, aber es ging nicht.
Kann mir weiter helfen ?
-
helvin schrieb:
ich habe eine Text Datei in dem ich einen Hex-code habe, der folgend aussieht:
#include <stdio.h>
int main(void)
{
FILE * pFile;
char string [100];pFile = fopen ("hex.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
fgets (string , 100 , pFile);
puts (string);
fclose (pFile);
}return 0;
}Aber dieser Program gibt mir nur die erste zeile aus. Ich habe schon versucht den fgets mit EOF zu setzen, aber es ging nicht.
Kann mir weiter helfen ?Das is klar, schließlich liest du ja auch nur die erste Zeile aus ! Die while Schleife fehlt.
Und du schreibst die ausgelesene Zeile ja wieder zurück in die Datei.Das wäre ein Beispiel um eine Datei auszulesen:
int main( int argc, char **argv ) { // Parameter 1 des Aufrufs ist die Quelldatei FILE *f = fopen( argv[1], "r" ); if ( !f ) { printf("Quelldatei \"%s\" nicht gefunden !!\n", argv[1]); return 1; } char inhalt[1024]; while(fgets(inhalt, 1024, datei)) { printf("%s", inhalt); } fclose( f ); }
Jetzt musst du die Ausgabe nur noch formatieren !
Viel Spass
-
Danke Jetzt funktioniert es
Kann mir jemand sagen wie ich mit einem POINTER auf eine besttimten Array zugreife der sich in der zeile befindet ?
-
helvin schrieb:
Danke Jetzt funktioniert es
Kann mir jemand sagen wie ich mit einem POINTER auf eine besttimten Array zugreife der sich in der zeile befindet ?
?? Bitte was ??
-
ich will das nicht die ganze Zeile ausgegben wird,
Der Code sieht folgend aus ::10010000 214601360121470136007EFE09D21901 40
Der erste Teil ist nur die Adresse, aber ich will nur die Daten Ausgeben, aber weiel ich mich nicht mit den pointern nicht auskenne, weis ich nicht wie ich das machen soll.
-
mach es halt nicht über pinter sondern über den index.
inhalt[10] zeigt dann auf den Anfang der Daten.
also würde ein
int i; for ( i = 10; i <= strlen(inhalt) - 3; i++) { printf("%s", inhalt[i]); }
versuchs mal so.
-
ich verstehe nicht wie ich ihm einsetzen soll, er gibt mir trotzdem alles aus
-
Das müsste klappen.
Allerdings setzt es voraus, dass nach jedem Eintrag in deiner Datei ein Zeilenumbruch stattfindet.
Wenn jemand ne bessere Lösung hat, dann posten !
#include <stdio.h> int main( int argc, char **argv ) { // Parameter 1 des Aufrufs ist die Quelldatei FILE *f = fopen( argv[1], "r" ); if ( !f ) { printf("Quelldatei \"%s\" nicht gefunden !!\n", argv[1]); return 1; } //Zählvariable i für die ausgabe int i = 0; char inhalt[80]; while( fgets(inhalt, 80, f) != NULL ) { for ( i = 10; i <= (strlen(inhalt) -5); i++) { printf("%c", inhalt[i]); } printf("\n"); } fclose( f ); }
-
Wenn ich diesen Code fuer diesen Text nehme, dann schreibt er mir die 5 zeile nicht aus.
#include <stdio.h>
#include <string.h>int main( int argc, char **argv )
{
// Parameter 1 des Aufrufs ist die QuelldateiFILE *pFile = fopen( "hex.txt", "r" );
if (pFile == NULL) perror ("Error opening file");
//Zählvariable i für die Ausgabe
int i = 0;
char inhalt[1024];
while( fgets(inhalt, 1024, pFile) != NULL )
{
for ( i = 9; i <= (strlen(inhalt) - 4); i++)
{
printf("%c", inhalt[i]);
}printf("\n",inhalt[i]);
}fclose( pFile );
return 0;
}
TEXT:
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FFbekomme ich nur diese ausgabe und die ausgabe aber die 5 Zeile nicht.Erst wenn die Zeile groesser ist gibt er Sie aus .Wo ist der Fehler?
-
Der Code lautet:
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
aber die 5 zeile gibt er nicht aus .