小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); } }
好,我们来运行一下,第一讲输入的命令一样