学了一些PE结构的知识,看着许多大神都写了自己的PE结构查询软件,我也尝试写一个,照葫芦画瓢,查询几个关键的,代码如下(不定时更新):
#include<stdio.h>
#include<windows.h>
#include<time.h>
int main(int argc, char* argv[])
{
FILE *f;
long e_lfanew; //存放IMAGE_NT_HEADERS32结构在文件中的偏移
char *Machine; //存放Machine对应的平台 存放TimeDateStemp对应的区时
time_t timep; //存放TimeDateStmap,并用于转换
IMAGE_FILE_HEADER F1; //构造一个结构
IMAGE_OPTIONAL_HEADER F2; //构造一个结构
system("color 0A");
f = fopen("1.exe","rb+");
if(f == NULL)
{
return -1;
}
rewind(f); //重新调整文件指针
fseek(f,0x3c,SEEK_SET); //fseek(文件指针,文件指针移动的偏移量,从哪里开始偏移)
fread(&e_lfanew,4,1,f); //fread(存储的地址,读取数据块的长度,读取数据块的数量,文件指针)
fseek(f,e_lfanew+4,SEEK_SET);
fread(&F1,sizeof(F1),1,f);
printf("此文件的文件头偏移地址为:000000%x\n\n",e_lfanew);
printf("此文件的IMAGE_FILE_HEADER结构如下:\n");
/*判断运行平台*/
if(F1.Machine == 332)
{
Machine = "x86";
}
else if(F1.Machine == 512)
{
Machine = "Intel Itanium";
}
else if(F1.Machine == 34404)
{
Machine = "x64";
}
else
{
Machine = "未知";
}
timep = F1.TimeDateStamp;
printf(" Machine(运行平台) :%x(%s)\n",F1.Machine,Machine);
printf(" NumberOfSections(文件的区块数目) :%d\n",F1.NumberOfSections);
printf(" TimeDataStamp(文件创建的时间) :%s",ctime(&timep));
printf(" SizeOfOptionalHeader(自查) :%d\n",F1.SizeOfOptionalHeader);
printf(" Characteristics(文件属性) :%x\n",F1.Characteristics);
rewind(f); //重新调整文件指针
fseek(f,e_lfanew+24,SEEK_SET);
fread(&F2,sizeof(F2),1,f);
printf("\n此文件的IMAGE_OPTIONAL_HEADER结构如下:\n");
printf(" AddressOfEntryPoint(程序入口) :%x\n",F2.AddressOfEntryPoint);
printf(" ImageBase(程序的首选装载地址) :%x\n",F2.ImageBase);
printf(" NumberOfRvaAndSizes(数据目录的项数 :%d\n",F2.NumberOfRvaAndSizes);
return 0;
}
由于Windows程序设计没学多少,暂时值能写出命令行窗口下的程序,慢慢更新~