Ja und?
argv[0] mit "rb"-Modus (read-binary - siehe fopen) öffnen
Wenn die größe der Daten konstant ist vom Ende die Länge substrahieren und mit fseek() dahin und dann einlesen.
Wo liegt das Problem?
EDIT:
Wenn du den Abstand zu den Daten (bzw. "EOF-Daten", wie sie von einigen genannt werden - ich finde diese Bezeichnung aber nicht so gut... naja, anderes Thema) anhand des PE Formats berechnen willst, kannst du das so machen:
Code:
#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;
}
(der Code ist 3 Monate alt und ich habe ihn schon mehrfach gepostet - es wäre also eventuell auch möglich gewesen diesen via SuFu zu finden [bin mir aber eigentlich auch nicht sicher...])