首页
社区
课程
招聘
[求助]关于PE分析工具!
发表于: 2007-11-15 21:17 6318

[求助]关于PE分析工具!

2007-11-15 21:17
6318
看了个识别PE文件结构的小程序。有写不明白 的地方。
#include <windos.h>
int main(int argc ,char* argv[])
     {
        if (argc<2)return 1;
        char* pFileName=argv[1];
            if(pFileName)
               { FILE * filept=fopen(pFileName,"r");
                  IMAGE_DOS_HEADER dosHdr;
                  IMAGE_NT_HEADER    ntHdr;
                  if(filept)
                    { fread(&dosHdr,sizeof(IMAGE_DOS_HEADER,1,filept);
                       fseek(fliept,dosHdr.e_lfanew,SEEK_SET);
                       fread(&ntHdr,sizeof(IMAGE_NT_HEADER,1,filept);
                       if ((dosHdr.e_magic==IMAGE_DOS_SIGNATURE)&&(ntHdr.sinature==IMAGE_NT_SIGNATURE ))
                           printf("%s is PE \n",pFileName);
                      else
                           printf("%s is not PE \n",pFileName);
                    }
                 else
                 printf("open  %s error .\n",pFileName);
              }               
     return 0;
     }

程序我到是能看明白。也知道IMAGE_DOS_HEADER 等是在winnt.h里面定义的一些常量。
但是我想不明白PE文件是以二进制形式存放在硬盘的。当要识别PE文件的时候是先把它先读入内存,然后检查吗?

但是他怎么定位偏移的呢,为什么直接用 dosHdr.e_magic==IMAGE_DOS_SIGNATURE  比较呢?dosHdr.e_magic的值从何而来,怎么来的??

今天有看了论坛出的《软件加密技术内幕》中第2章 PE分析工具
比如这个函数:

BOOL IsPEFile(LPVOID ImageBase)
{
    PIMAGE_DOS_HEADER  pDH=NULL;
    PIMAGE_NT_HEADERS  pNtH=NULL;
  
    if(!ImageBase)
          return FALSE;
   
    pDH=(PIMAGE_DOS_HEADER)ImageBase;
    if(pDH->e_magic!=IMAGE_DOS_SIGNATURE)
         return FALSE;

    pNtH=(PIMAGE_NT_HEADERS32)((DWORD)pDH+pDH->e_lfanew);
    if (pNtH->Signature != IMAGE_NT_SIGNATURE )
        return FALSE;

    return TRUE;
       
}

ImageBase是在_IMAGE_OPTIONAL_HEADER 结构中定义的,为何可以作为IF的判断条件呢?比如:   if(!ImageBase)  ImageBase的值怎么确定?怎么从PE文件中获得?难道PE识别工具打开文件的时候,就可以把这些都翻译为确定的值了??
    这写问题困扰我几天了,希望各位大侠可以解惑,不吝赐教 !

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (3)
雪    币: 236
活跃值: (16)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
up ↑up ↑up ↑up ↑up ↑up ↑up ↑up ↑
2007-11-17 21:41
0
雪    币: 55943
活跃值: (21555)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
看头文件winnt.h,里面都有定义的。



看源码,LoadFileR()
2007-11-17 22:24
0
雪    币: 236
活跃值: (16)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
谢谢坛主的提醒,我明白了!!!

以前我误解了,我以为这些指针不需要自己用函数去获得呢,直接用WINNT.H中定义的名字就直接可以得到像DOS MZ HEADER的偏移指针和PE HEADER 的偏移指针,比如:
PIMAGE_DOS_HEADER  pDH; //先定义一个DOS_HEADER 结构
if(pDH->e_magic!=IMAGE_DOS_SIGNATURE);//然后就可以直接用来比较了,其他的“加载器”会为我们做的(加载器得到文件的MZ的偏移地址,然后通过e_lfanew定位到PE)。但是我自己又觉得不合适,所以就钻进去了出不来了 。
    坛主一提醒,我又不得不再仔细看看书上的代码,我就明白了。其实DOS,PE的偏移地址都是我们要用函数获得的,根本没有“加载器”。这个是我没有弄清楚。windows加载器是用来把PE文件映射到内存中的。
     再次谢谢坛主!在这里我学到了很多很多的东西。我还要继续努力的学习。
     可惜我还太菜,不然我也会努力帮助别人的
2007-11-18 14:26
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册