#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
für die Strukturen in "winnt.h"
*/
#include <windows.h>
int main(void)
{
FILE *fp;
char *buffer;
int sz;
int offset;
IMAGE_DOS_HEADER *idh;
IMAGE_NT_HEADERS *inh;
IMAGE_SECTION_HEADER *ish;
/* Datei öffnen */
if (!(fp = fopen("test.exe", "rb")))
{
puts("Fehler: konnte die Datei nicht öffnen!");
exit(0);
}
/* Dateigröße holen */
fseek(fp, 0, SEEK_END);
sz = ftell(fp);
fseek(fp, 0, SEEK_SET);
/* Speicherplatz reservieren */
if (!(buffer = (char *) malloc(sz + 1)))
{
puts("Fehler: nicht genug Speicher vorhanden!");
exit(0);
}
/* Datei einlesen */
fread(buffer, 1, sz, fp);
fclose(fp);
/* IMAGE_DOS_HEADER zuweisen */
idh = (IMAGE_DOS_HEADER *) buffer;
/* IMAGE_NT_HEADERS zuweisen */
inh = (IMAGE_NT_HEADERS *) &buffer[idh->e_lfanew];
/* den letzten IMAGE_SECTION_HEADER finden */
offset = idh->e_lfanew + sizeof(IMAGE_NT_HEADERS) + (inh->FileHeader.NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER);
ish = (IMAGE_SECTION_HEADER *) &buffer[offset];
/* offset zu "EOF" berechnen */
offset = ish->PointerToRawData + ish->SizeOfRawData;
/* offset und "EOF-Daten" ausgeben (falls möglich) */
printf(
"Das Offset zu \"EOF\" beträgt %d Bytes!\n"
"---------------------------------------\n"
"%s\n"
"---------------------------------------\n"
, offset
, &buffer[offset]
);
getc(stdin);
return 0;
}