Zitat von
Darkmiller
ich wollte mal nachfragen ob jemand weiß, wie ich aus einer Datei, gehen wir mal von *.exe aus, den Hex rauslese und neuen Hex reinschreiben kann.
Denk doch mal nach.
Was ist in einer "*.exe"? Zeichenfolgen (8 bit -> 1 byte -> 2^8 [=256] mögliche Kombinationen von Einsen und Nullen -> 0, 1, 2, ..., 255)
Wieso wird das normalerweise im Hexadezimalsystem dargestellt? Es ist übersichtlicher... im Dezimalsystem schwankt der Zahlenwert für die Zeichen zwischen ein bis drei Stellen (zB. 3, 5, 55, 33, 163, 200, ...).
Im Hexadezimalsystem hast du maximal zwei Stellen, es ist also einfacher zu lesen.
Wie konvertiere ich zwischen dem Dezimal und Hexadezimalsystem? http://de.wikipedia.org/wiki/Hexadezimalsystem (Funktionsbeispiel folgt)
Weils ja Weihnachten ist ^^:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_HEX_STRLEN 8
char *dec2hex(unsigned int dec)
{
static const char table[] = "0123456789ABCDEF";
char *hex = (char *) malloc(MAX_HEX_STRLEN + 1);
memset(hex, 0, MAX_HEX_STRLEN + 1);
while(dec)
{
memmove(hex + 1, hex, MAX_HEX_STRLEN);
*hex = table[dec % 16];
dec /= 16;
}
return hex;
}
void hexdump(void *buffer, unsigned int size, FILE *out)
{
unsigned char *data = (unsigned char *) buffer;
unsigned int x;
unsigned int y;
for(x = 0; x < size; x += 16)
{
for(y = 0; y < 16; y++)
if (x + y < size)
fprintf(out, "%02x ", data[x + y]);
else
fprintf(out, " ");
fprintf(out, " ");
for(y = 0; y < 16; y++)
if (data[x + y] > 31 && data[x + y] < 127 && x + y < size)
fprintf(out, "%c", data[x + y]);
else if (x + y < size)
fprintf(out, ".");
fprintf(out, "\n");
}
}
int main(void)
{
int n = 12345;
char buffer[] = "4HWQH6J/%\x01Huj3H$WqwG§13\x02ZUJ7mi5L&(O%43u5$H";
FILE *fp = fopen("C:\\Windows\\System32\\mspaint.exe", "rb");
unsigned int sz;
char *file;
printf("%d = %s\n", n, dec2hex(n));
hexdump(buffer, sizeof(buffer), stdout);
if (fp)
{
fseek(fp, 0, SEEK_END);
sz = ftell(fp);
fseek(fp, 0, SEEK_SET);
file = (char *) malloc(sz);
fread(file, 1, sz, fp);
fclose(fp);
hexdump(file, sz, stdout);
}
else puts("fopen failed");
system("PAUSE > NUL");
return 0;
}
Die erste Funktion (dec2hex) habe ich nur hinzugefügt um mich später nicht der Frage stellen zu müssen "du hast ja %x von fprintf benutzt - wie macht fprintf das denn?".