Как создать программу проверки PE файла - PullRequest
1 голос
/ 15 января 2020

Я хочу написать программу для проверки, если какой-либо файл в формате PE, используя C? Я прочитал и узнал о файлах PE, мне нужно проверить две вещи:

  1. Заголовок DOS, MZ (45 5A)
  2. Заголовок PE 50 45 00 00

Я не очень хорош в кодировании, поэтому его сложно кодировать. Я попробовал код. Я использую FILE * для чтения байта файла, результат 0000000000905A4D, в отличие от того, что я вижу в HxD.

Можете ли вы мне помочь? Пожалуйста, дайте мне некоторые конкретные c инструкции или ссылку, чтобы я мог следовать.

Большое вам спасибо. Вот мой код, я пытался прочитать 2 байта, но потерпел неудачу: (

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n,address;
	FILE *fptr;
	if ((fptr = fopen("Easy Keygen.exe","rb")) == NULL)
	{
		printf("error!");
	}

	fread(&n, 4,2,fptr);
	printf("address: %p ", n);
	fclose(fptr);	
}

1 Ответ

1 голос
/ 15 января 2020

Добро пожаловать в переполнение стека! Вы сталкиваетесь с главной заглушкой нового программиста, называемой little endian .

Что это означает по существу, так это то, что ваши байты будут в обратном порядке по сравнению с тем, который вы ожидать, когда вы читаете некоторые значения как целое число. Я думаю, что тебя тоже может сбить с толку. Чтобы прочитать только два байта, ваш вызов fread должен быть похож на:

fread(&n,1,2,fptr);

Третий аргумент для fread - это количество «элементов» для чтения, а второй аргумент - это размер каждого элемент. Так что этот вызов fread будет читать два элемента, каждый размером 1 - два байта.

Пример программы, которая может сделать то, что вы просите для заголовка DOS (кстати, 4D5A в большом endian) может быть:

short magic;
FILE* fptr;
if ((fptr = fopen("Easy Keygen.exe","rb")) == NULL)
{
    printf("error!");
}
fread(&magic,1,2,fptr);
printf("magic value was 0x%x\n",magic);

Этот должен распечатать, что значение magi c равно 0x5a4d . Опять же - байты будут обратными, потому что целые числа (и указатели тоже) интерпретируются в обратном порядке . Чтобы действительно подтвердить ваш чек, вам нужно сравнить его с 0x5a4d, а НЕ с 0x4d5a.

Надеюсь, это поможет!

...