首页
社区
课程
招聘
[讨论]有关pe的疑问
发表于: 2008-4-29 09:20 3897

[讨论]有关pe的疑问

2008-4-29 09:20
3897
为什么PE文件中的"PE"映射到内存,rva是0x3c,这个东西是怎么计算出来的。。。
我推了半天 不清除怎么回事。。我是菜鸟,别笑我。。不吝赐教。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 50161
活跃值: (20620)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
看PE结构。

http://bbs.pediy.com/upload/bbs/unpackfaq/ARTeam%20PE_appendix1_offsets.htm

文字描述:
http://bbs.pediy.com/showthread.php?t=61497
2008-4-29 09:35
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没想到坛主居然会光顾新兵论坛!
论坛中有pe格式的文献,3c不是算的,是规定的,那里存放pe签名的offset
2008-4-29 09:55
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我一直很激动的。。。
我向知道那个pe的rva和直接用ultraedit32打开看到的东西,怎么直接对应。。。
我是写程序输出的。。。
0x3c 后的两个字符是PE
0x3d输出的怎么跑到文件开始的地方去了。。。这个地方我很模糊。。。
        basP= (unsigned char*)lpMemory ;
                        for(int j = 0; j < 2; j++)
                        {
                           printf("%x\n",basP[j]);
                        }
                printf("\n");
                                curP=0x3d+basP;
                curP=(unsigned char*)((DWORD)*curP + (DWORD)lpMemory);
                //printf("%x",(DWORD)lpMemory);
                for(int j = 0; j < 0x10; j++)
                        {
                           printf("%x\n",curP[j]);
                        }
curP文件指针的当前位置

lpMemory 是内存映射后的基址。。。

给我小菜说说问题出哪了吧
2008-4-29 11:28
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
你似乎搞错了吧?PE结构中的0x3C是IMAGE_DOS_HEADER结构中的e_lfanew成员偏移地址,并不是'PE'的rva偏移地址。e_lfanew成员保存着的才是'PE'结构的rva偏移。
PIMAGE_DOS_HEADER pIDH;
PIMAGE_NT_HEADERS pINH;
pIDH = (PIMAGE_DOS_HEADER)lpMemory;
pINH = (PIMAGE_NT_HEADERS)((DWORD)pIDH->e_lfanew + (DWORD)pIDH);
printf("%s\n",(char*)&pINH->Signature);
2008-4-29 12:30
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
貌似你加了两次lpMemory !
curP=(unsigned char*)((DWORD)*curP + (DWORD)lpMemory);
你把这一句注释起来看看`~~
或者把:
curP=0x3d+basP;
改成:
curP=0x3d;
2008-4-29 12:52
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
什么也不说了 眼泪哗哗的。。。。谢谢大家。。。我会更加努力的。。。
2008-4-30 10:17
0
游客
登录 | 注册 方可回帖
返回
//