#include #include #include #include #include typedef struct { FILHDR file_header; PEAOUTHDR file_optional_header; SCNHDR section_header[32]; } exe_header_t; static exe_header_t * read_exe_header (int fd, exe_header_t * exe_header_buffer) { int i; int ret; assert (exe_header_buffer != 0); ret = lseek (fd, 0L, SEEK_SET); assert (ret != -1); ret = read (fd, &exe_header_buffer->file_header, sizeof (exe_header_buffer->file_header)); assert (ret == sizeof (exe_header_buffer->file_header)); assert (exe_header_buffer->file_header.e_magic == 0x5a4d); assert (exe_header_buffer->file_header.nt_signature == 0x4550); #ifdef __x86_64__ assert (exe_header_buffer->file_header.f_magic == 0x8664); #else assert (exe_header_buffer->file_header.f_magic == 0x014c); #endif assert (exe_header_buffer->file_header.f_nscns > 0); assert (exe_header_buffer->file_header.f_nscns <= sizeof (exe_header_buffer->section_header) / sizeof (exe_header_buffer->section_header[0])); assert (exe_header_buffer->file_header.f_opthdr > 0); ret = read (fd, &exe_header_buffer->file_optional_header, sizeof (exe_header_buffer->file_optional_header)); assert (ret == sizeof (exe_header_buffer->file_optional_header)); #ifdef __x86_64__ assert (exe_header_buffer->file_optional_header.magic == 0x020b); #else assert (exe_header_buffer->file_optional_header.magic == 0x010b); #endif for (i = 0; i < exe_header_buffer->file_header.f_nscns; ++i) { ret = read (fd, &exe_header_buffer->section_header[i], sizeof (exe_header_buffer->section_header[i])); assert (ret == sizeof (exe_header_buffer->section_header[i])); } return (exe_header_buffer); } int main () { int fd; exe_header_t exe_header_buffer; printf ("Type PEAOUTHDR has size %u bytes.\n", sizeof (PEAOUTHDR)); fd = open ("/bin/ls.exe", O_RDONLY); assert (fd >= 0); read_exe_header (fd, &exe_header_buffer); }