PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Hex auslesen und reinschreiben



Darkmiller
24.12.2008, 15:08
Moin Leute,

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.

Frohe Weihnachten

Darkmiller

enco
24.12.2008, 15:26
Definiere "den Hex" ...

wolf
24.12.2008, 15:32
Definiere "den Hex" ...

Er meint in Hexadezimal denk ich mal..
Wozu brauchst das denn?

Darkmiller
24.12.2008, 16:03
Will meinen ersten test-crypter schreiben, wäre Sinnvoll das zu wissen ;)

wolf
24.12.2008, 16:13
Ich würd mal sagen Datei binär öffenen, in Hex umrechnen, verändern oder was du auch immer machen willst, neues wieder zurückrechnen und wieder reinschreiben... aber was willst du denn damit bezwecken?
was hat das denn mit nem Crypter zutun? =D :?:

google:

http://forum.chip.de/c-c/binaere-datei-oeffnen-hex-editor-format-darstellen-361098.html

blackberry
24.12.2008, 16:47
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 ^^:

#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?".