首页
社区
课程
招聘
[求助]导入表编程问题那位解释下?
发表于: 2009-10-20 20:04 3207

[求助]导入表编程问题那位解释下?

2009-10-20 20:04
3207
请问MapViewOfFile映射文件与PE装载文件是否不同?

我想问下。MapViewOfFile映射文件。PE文件其实还是以磁盘文件结构映到内存中去?就是以文件对齐方式在内存?
PE加载的。就是以节对齐之后的排列在内存中。

http://bbs.pediy.com/showthread.php?t=99771
发到了这里了。不知是否太简单的了啊。一楼说以内存对齐方式的,但是我看怎么好像不是吧???

那位说说啊????还有那些十六进制的工具,他是如何读文件的???

下面是Iczelion的PE教程里的说明。。。

本例中,我们直接将文件映射到内存而不是通过PE装载器载入,因此我们不能直接使用那些RVAs。必须先将那些RVAs转换成文件偏移量,RVAToOffset函数就起到这个作用。

http://www.win32asm.com.cn/view.asp?file=117
RVAToOffset PROC uses edi esi edx ecx pFileMap:DWORD,RVA:DWORD
   mov esi,pFileMap
   assume esi:ptr IMAGE_DOS_HEADER
   add esi,[esi].e_lfanew
   assume esi:ptr IMAGE_NT_HEADERS
   mov edi,RVA ; edi == RVA
   mov edx,esi
   add edx,sizeof IMAGE_NT_HEADERS
   mov cx,[esi].FileHeader.NumberOfSections
   movzx ecx,cx
   assume edx:ptr IMAGE_SECTION_HEADER
   .while ecx>0 ; check all sections
     .if edi>=[edx].VirtualAddress
       mov eax,[edx].VirtualAddress
       add eax,[edx].SizeOfRawData
       .if edi<eax ; The address is in this section
         mov eax,[edx].VirtualAddress
         sub edi,eax
         mov eax,[edx].PointerToRawData
         add eax,edi ; eax == file offset
         ret
       .endif
     .endif
     add edx,sizeof IMAGE_SECTION_HEADER
     dec ecx
   .endw
   assume edx:nothing
   assume esi:nothing
   mov eax,edi
   ret
RVAToOffset endp

ShowTheFunctions proc uses esi ecx ebx hDlg:DWORD, pNTHdr:DWORD
   LOCAL temp[512]:BYTE
   invoke SetDlgItemText,hDlg,IDC_EDIT,0
   invoke AppendText,hDlg,addr buffer
   mov edi,pNTHdr
   assume edi:ptr IMAGE_NT_HEADERS
   mov edi, [edi].OptionalHeader.DataDirectory [sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
   invoke RVAToOffset,pMapping,edi
   mov edi,eax
   add edi,pMapping
   assume edi:ptr IMAGE_IMPORT_DESCRIPTOR

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
http://bbs.pediy.com/showthread.php?t=64036

结贴吧。

~找到了。原来用内存映射文件的方法把文件映射到
内存中的文件数据是同文件在磁盘上放置是一样的。
即都是以文件对齐放置~
2009-10-20 20:45
0
游客
登录 | 注册 方可回帖
返回
//