首页
社区
课程
招聘
如何获得节表地址?[求助]
发表于: 2006-7-17 16:51 4634

如何获得节表地址?[求助]

2006-7-17 16:51
4634
已经获得了PE头地址,按照<Iczelion的PE教程>中描述的两种方法,我都没有正确得到显示节表名,下面是部分代码:        
          NumberOfSections = NtHeader->FileHeader.NumberOfSections;
       
        //因为NT头之后就是节表,故,节表头地址就是nt头地址加上NT结
          // 构大小.
        //或者用ImageBase+SizeOfHeaders的办法直接定位.
        //SectionHeader = (PIMAGE_SECTION_HEADER)
                   ((UINT32)NtHeader+(UINT32)sizeof(NtHeader));
        SectionHeader = (PIMAGE_SECTION_HEADER)
                    ((UINT32)NtHeader->OptionalHeader.ImageBase+
                    (UINT32)NtHeader->OptionalHeader.SizeOfHeaders);

可以确定这段代码之前的部分没有问题,那么是哪里 出了错?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
PIMAGE_NT_HEADERS GetNtHeaders(LPBYTE lpImage) {

        PIMAGE_DOS_HEADER        pDsHdr;
        PIMAGE_NT_HEADERS        pNtHdr;
        pDsHdr = (PIMAGE_DOS_HEADER)lpImage;
        pNtHdr = (PIMAGE_NT_HEADERS)(pDsHdr->e_lfanew + (DWORD)lpImage);
        return pNtHdr;
}

PIMAGE_SECTION_HEADER GetFirstSection(LPBYTE lpImage) {

        PIMAGE_NT_HEADERS                pNtHdr;
        PIMAGE_SECTION_HEADER        pScHdr;
        pNtHdr = GetNtHeaders(lpImage);
        pScHdr = (PIMAGE_SECTION_HEADER)((DWORD)pNtHdr + 0x18 + pNtHdr->FileHeader.SizeOfOptionalHeader);
        return pScHdr;
}
2006-7-17 17:18
0
雪    币: 221
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
呵呵.谢谢楼上大哥提醒

您的代码的实质仍然是用Nt头的地址加上Nt头结构的大小:

         0x18 + SizeOfOptionalHeader = sizeof(IMAGE_NT_HEADERS)

我也从这里发现了我的程序的错误,就是不能用sizeof(NtHeader);
而要用sizeof(IMAGE_NT_HEADERS)。  汗,基础问题。

其实,还有更简单的方法:
  
         SectionHeader = (PIMAGE_SECTION_HEADER) (NtHeader + 1);

更清晰,是吧? :)
2006-7-17 17:34
0
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
SectionHeader = (PIMAGE_SECTION_HEADER) (NtHeader + 1);

pScHdr = (PIMAGE_SECTION_HEADER)((DWORD)pNtHdr + 0x18 + pNtHdr->FileHeader.SizeOfOptionalHeader);

还是这样用吧,具体原因看看看雪的书,你就明白了
2006-7-17 18:30
0
游客
登录 | 注册 方可回帖
返回
//