首页 > 解决方案 > 如何创建程序检查PE文件

问题描述

我想编写一个程序来检查是否有任何文件是使用 C 的 PE 格式?我已经阅读并了解了 PE 文件,我需要检查两件事:

  1. DOS 接头,MZ (45 5A)
  2. PE 头 50 45 00 00

我不擅长编码,所以很难编码。我已经尝试过代码。我使用 FILE * 读取文件字节,结果是 0000000000905A4D,与我在 HxD 中看到的相反。

你能帮助我吗?请给我一些具体的说明,或者给我一个链接让我遵循。

非常感谢这是我的代码,我尝试读取 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);	
}

标签: cportable-executable

解决方案


欢迎来到堆栈溢出!你遇到了一个叫做little endian的新程序员。

这本质上意味着,当您将某些值作为整数读取时,您的字节将以与预期相反的顺序结束。我想你也可能会被 fread 绊倒。为了只读取两个字节,您的 fread 调用需要更像:

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

fread 的第三个参数是要读取的“元素”的数量,第二个参数是每个元素的大小。所以这个 fread 调用将读取两个元素,每个元素的大小为 1 - 两个字节。

一个程序示例可能会执行您要求的 DOS 标头(顺便说一下,大端的 4D5A)可能是:

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);

应该打印出魔法值是0x5a4d。再次 - 字节将向后,因为整数(以及指针)以相反的顺序解释。为了实际确认您的支票,您需要比较 0x5a4d 而不是 0x4d5a。

希望这可以帮助!


推荐阅读