首页
社区
课程
招聘
[旧帖] [求助]如何得到PE文件的输入表......... 0.00雪花
发表于: 2009-7-28 14:23 1634

[旧帖] [求助]如何得到PE文件的输入表......... 0.00雪花

2009-7-28 14:23
1634
我是这样定位的
import=(IMAGE_IMPORT_DESCRIPTOR *)(section_header->PointerToRawData+((nt_header->OptionalHeader.DataDirectory[1].VirtualAddress)-section_header->VirtualAddress))

但是我import->Name却出错....有没高手能告诉小弟这是为什么

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人知道????
2009-7-28 15:39
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
VirtualAddress是虚拟内存地址,而我们的文件并没有装入内存,所以需要的是文件偏移地址。必须把VirtualAddress转换为文件偏移才可以。下面是虚拟内存地址转换文件偏移的函数,其中pFileMap是文件指针,RVA是虚拟内存地址。
int RVAToOffset(char *pFileMap, DWORD RVA)
{
        char *buff=pFileMap;
        int rva=RVA;
        IMAGE_DOS_HEADER *idh2;
        IMAGE_NT_HEADERS *inh2;
        IMAGE_SECTION_HEADER *ish2;

        idh2=(IMAGE_DOS_HEADER*)buff;
        inh2=(IMAGE_NT_HEADERS*)(buff+idh2->e_lfanew);
       
        int i=inh2->FileHeader.NumberOfSections;
        for(int j=0;j<i;j++)
        {
                ish2=(IMAGE_SECTION_HEADER*)(buff+idh2->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*j);
                if(rva>=(ish2->VirtualAddress))
                {
                        int off=ish2->VirtualAddress+ish2->SizeOfRawData;
                        if(rva<off)
                        {
                                off=rva-ish2->VirtualAddress+ish2->PointerToRawData;
                                return off;
                        }
                }
        }
        return rva;

}

有了这个函数以后就可以这样:
IMAGE_NT_HEADERS *inh;
IMAGE_EXPORT_DIRECTORY *ied;
DWORD offset=RVAToOffset(buff,inh->OptionalHeader.DataDirectory[0].VirtualAddress);
ied=(IMAGE_EXPORT_DIRECTORY *)(buff+offset);
2009-7-28 17:37
0
游客
登录 | 注册 方可回帖
返回
//