现在的位置: 首页 > 综合 > 正文

pe格式研究2

2014年03月17日 ⁄ 综合 ⁄ 共 3982字 ⁄ 字号 评论关闭

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

}

   

  好,我们来运行一下,第一讲输入的命令一样 


抱歉!评论已关闭.