c - 如何创建程序检查PE文件
问题描述
我想编写一个程序来检查是否有任何文件是使用 C 的 PE 格式?我已经阅读并了解了 PE 文件,我需要检查两件事:
- DOS 接头,MZ (45 5A)
- 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);
}
解决方案
欢迎来到堆栈溢出!你遇到了一个叫做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。
希望这可以帮助!
推荐阅读
- python - 我想在另一列下方附加一个 df 列并根据其他列分配行值
- javascript - 在 DOJO 中格式化 ddmmyy
- scrapy - 我究竟做错了什么 ?我想让我的蜘蛛使用 URL 爬到下一页
- node.js - Nodejs发送后事件未出现在推送器中
- salesforce - 无法在 Salesforce 中激活流程
- neo4j - 如何从单个密码查询中导出单独的节点和边缘文件?
- office-js - RangeAreas 按索引
- javascript - 如何防止firestore快照,打印结果太多次?
- react-native - react-navigation标签导航器特定标签按钮的自定义导航操作
- html - Html 块引用样式和放置