小E qq592646022
别怕,我们只是输出一些结构体的东西,具体是nt头里面的Image_file_header的结构体和image_optional_header的结构体,呵呵不难吧,我们需要些两个函数分别显示这两个,这样我们调用一下就可以了,呵呵,同样我们还是进行文件操作,所以参数还得有个文件指针FILE * p,呵呵,那就看代码吧。顺便我们把image_data_directory 的内容一起输出吧,什么?你不知道image_data_directory ?其实它是在image_optional_header里面的结构体数组你可以看到 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];,IMAGE_NUMBEROF_DIRECTORY_ENTRIES这个只是常数值为16 ,不要当心这个很长,其实很好玩的,好了。看下面。
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
//这个就是什么提到的数组长度为16的东东,我们用宏定义,你直接给值也可以的,不过宏定义用的比较方便,不是么?
恩,下面我要放大绝了,大家小心,嘿嘿,只用了一个printf函数和一个for循环,hoho,大家看了有点吃惊吧,呵呵,我当初写这个也没注意到会用这么多个呵呵写完后,我只记都大吃一惊。
呵呵,不多说了,我觉的我今天废话特别多,呵呵
你觉的呢?不过写之前有个小问题,如何找到,ntheader的头呢,别当心,我们都知道dosheader.e_lfanew这个东西,这个很有用哩,主要是指向nt头的在文件的所在位置,我们用它定位到ntheader,然后进行读写,呵呵,然后就好了,不信?你看看。
void main(int argc,char* argv[])
{
FILE* p;
DWORD Sig;
if(argc>1)
{
p=fopen(argv[1],"rb");
if(p!=NULL)
{
fread(&dosheader,sizeof(dosheader),1,p);
if(dosheader.e_magic==IMAGE_DOS_SIGNATURE)
{
PrintDosHeader(dosheader);
fseek(p,dosheader.e_lfanew,SEEK_SET);
fread(&Sig,sizeof(Sig),1,p);
if(Sig==IMAGE_NT_SIGNATURE) printf("是pe文件\n\n");
fseek(p,dosheader.e_lfanew,SEEK_SET); //这个定位到nt开头处
fread(&ntheader,sizeof(ntheader),1,p); //读写到ntheader大小的结构体
PrintNtHeader(ntheader); //输出nt头
}
else
printf("无效文件\n");
fclose(p);
}
else printf("Erro open file\n");
}
else
{
printf("参数不正确\n");
}
//getchar();
}
//输出nt头函数
void PrintNtHeader(IMAGE_NT_HEADERS ntheader)
{
printf("IMAGE_FILE_HEADER结构:\n");
printf("Machine : %04X\n",ntheader.FileHeader.Machine);
printf("NumberOfSections : %04X\n",ntheader.FileHeader.NumberOfSections);
printf("TimeDateStamp : %08X\n",ntheader.FileHeader.TimeDateStamp);
printf("PointerToSymbols : %08X\n",ntheader.FileHeader.PointerToSymbols);
printf("NumberOfSymbols : %08X\n",ntheader.FileHeader.NumberOfSymbols);
printf("SizeOfOptionalHeader : %04X\n",ntheader.FileHeader.SizeOfOptionalHeader);
printf("Characteristics : %04X\n\n",ntheader.FileHeader.Characteristics);
printf("IMAGE_OPTIONAL_HEADER结构:\n");
printf("OptionalHeader.Magic :%04x\n",ntheader.OptionalHeader.Magic);
printf("%04x\n",ntheader.OptionalHeader.MajorLinkerVersion);
printf("%04x\n",ntheader.OptionalHeader.MinorLinkerVersion);
printf("%04x\n",ntheader.OptionalHeader.SizeOfCode);
printf("%04x\n",ntheader.OptionalHeader.SizeOfInitializedData);
printf("%04x\n",ntheader.OptionalHeader.SizeOfUnInitializedData);
printf("%04x\n",ntheader.OptionalHeader.AddressOfEntryPoint);
printf("BaseOfCode : %04x\n",ntheader.OptionalHeader.BaseOfCode);
printf("BaseOfData : %04x\n",ntheader.OptionalHeader.BaseOfData);
printf("ImgaeBase : %04x\n",ntheader.OptionalHeader.ImgaeBase);
printf("SectionAlignment : %04x\n",ntheader.OptionalHeader.SectionAlignment);
printf("FileAlignment : %04x\n",ntheader.OptionalHeader.FileAlignment);
printf("%04x\n",ntheader.OptionalHeader.MajorOperatingSystemVersion);
printf("%04x\n",ntheader.OptionalHeader.MinorOperatingsystemversion);
printf("%04x\n",ntheader.OptionalHeader.MajorImageVersion);
printf("%04x\n",ntheader.OptionalHeader.MinorImageVersion);
printf("%04x\n",ntheader.OptionalHeader.MajorSubsybtemVersion);
printf("%04x\n",ntheader.OptionalHeader.MinorSubsybtemVersion);
printf("%04x\n",ntheader.OptionalHeader.Win32VersionValue);
printf("%04x\n",ntheader.OptionalHeader.SizeOfImage);
printf("%04x\n",ntheader.OptionalHeader.SizeoOfHeaders);
printf("%04x\n",ntheader.OptionalHeader.CheckSum);
printf("%04x\n",ntheader.OptionalHeader.Subsystem);
printf("%04x\n",ntheader.OptionalHeader.DllCharacteristics);
printf("%04x\n",ntheader.OptionalHeader.SizeOfStackCommit);
printf("%04x\n",ntheader.OptionalHeader.SizeOfHeapReserve);
printf("%04x\n",ntheader.OptionalHeader.SizeOfHeapCommit);
printf("%04x\n",ntheader.OptionalHeader.LoaderFlages);
printf("%04x\n\n",ntheader.OptionalHeader.NumberOfRvaAndSizes);
printf("IMAGE_DATA_DIRECTORY:\n");
for(int i=0;i<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;i++)
{
printf("VirtualAdress%d : %04x\n",i,ntheader.OptionalHeader.DataDirectory[i].VirtualAdress);
printf("isize%d : %04x\n",i,ntheader.OptionalHeader.DataDirectory[i].isize);
}
}
好,我们来运行一下,第一讲输入的命令一样