#include <stdio.h>
#include <windows.h>
#define RTN_OK 0
#define RTN_FAILURE 1
const size_t expected_count = 1;
char* read_file_name(int argc, char** argv);
int main(int argc, char** argv)
{
// Parsing command line args
char* file_name = read_file_name(argc, argv);
// Opening our executable
FILE* portable_executable = fopen(file_name, "r");
// Reading dos header
IMAGE_DOS_HEADER dos_header_buffer;
fread(&dos_header_buffer, sizeof(IMAGE_DOS_HEADER), expected_count, portable_executable);
// Setting offset for reading PE header
fseek(portable_executable, (long)dos_header_buffer.e_lfanew, SEEK_SET)
// Reading signature field from PE header
DWORD signature = 0;
fread(&signature, sizeof(DWORD), expected_count, portable_executable);
// Reading file header
IMAGE_FILE_HEADER file_header_buffer;
fread(&file_header_buffer, sizeof(IMAGE_FILE_HEADER), expected_count, portable_executable);
// Reading optinal header
IMAGE_OPTIONAL_HEADER optional_header_buffer;
fread(&optional_header_buffer, file_header_buffer.SizeOfOptionalHeader, expected_count, portable_executable);
// Get info about all the sections
for (int i = 0; i < file_header_buffer.NumberOfSections; ++i)
{
// Reading each section header
IMAGE_SECTION_HEADER section_header_buffer;
fread(§ion_header_buffer, sizeof(IMAGE_SECTION_HEADER), expected_count, portable_executable);
printf("Section name: %7s, Raw data size: %10d, Pointer to raw data: %10d\n",
section_header_buffer.Name,
section_header_buffer.SizeOfRawData,
section_header_buffer.PointerToRawData);
}
fclose(portable_executable);
}
char* read_file_name(int argc, char** argv)
{
if (argc != 2)
{
return NULL;
}
return argv[1];
}