PE文件的问题

yongdu 2000-05-23 06:23:00
LPVOID WINAPI ImageDirectoryOffset (
LPVOID lpFile,
DWORD dwIMAGE_DIRECTORY)
{
PIMAGE_OPTIONAL_HEADER poh;
PIMAGE_SECTION_HEADER psh;
int nSections = NumOfSections (lpFile);
int i = 0;
LPVOID VAImageDir;

/* Must be 0 thru (NumberOfRvaAndSizes-1). */
if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
return NULL;

/* Retrieve offsets to optional and section headers. */
poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET (lpFile);
psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET (lpFile);

/* Locate image directory's relative virtual address. */
VAImageDir = (LPVOID)poh->DataDirectory
[dwIMAGE_DIRECTORY].VirtualAddress;

/* Locate section containing image directory. */
while (i++<nSections)
{
if (psh->VirtualAddress <= (DWORD)VAImageDir &&
psh->VirtualAddress +
psh->SizeOfRawData > (DWORD)VAImageDir)
break;
psh++;
}

if (i > nSections)
return NULL;

/* Return image import directory offset. */
return (LPVOID)(((int)lpFile +
(int)VAImageDir. psh->VirtualAddress) +
(int)psh->PointerToRawData);
}
请教:
psh->VirtualAddress 和 VAImageDir这两个虚地址到底分别指向什么?为何要用这种方式来找到对应的SECTION呢?上函数的return好像不对,它的(int)VAImageDir. psh->VirtualAddress) 是何意思?
...全文
226 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanhan 2000-05-25
  • 打赏
  • 举报
回复
好象是MSDN上敲错了。幸好代码是对的。

用这么笨的办法只是为了把虚地址转换成文件中的实际地址。
sanhan 2000-05-25
  • 打赏
  • 举报
回复
(int)VAImageDir. psh->VirtualAddress) 当然错了
(int)VAImageDir- psh->VirtualAddress) 才对

从哪里弄来的文件?错了一个字符。
Kenny 2000-05-25
  • 打赏
  • 举报
回复
生数据是可执行文件中的真正数据,也就是写在磁盘上的数据。它的长度是指Section在磁盘文件中的长度,即psh->SizeOfRawData。
Directioy是指PE文件中的特定的IMAGE在文件中的位置。以IMPORT为例,IMPORT DIRECTORY就是IAT信息,也就是本PE程序需调用的动态链接库及函数的信息。它的结构中VIRTUAL ADDRESS是一个虚地址,要找到在文件中存储的真实地址,就要使用你的那段代码。
如果要了解详情,这里说清楚是不太可能的,建议你去www.wotsit.org去查一下PE文件格式的文章,或买一本<Windows 95 系统编程奥秘>(电子工业出版社)来看看。
yongdu 2000-05-25
  • 打赏
  • 举报
回复
Kenny:
(注意: PB生成的EXE中,psh->VirtualSize的值可能为0,应取生数据长度或(psh+1)->VirtualAddress)

"应取生数据长度"是什么意思?

能再告诉我Section和Directory的作用和区别吗?
我只知道Section像DOS中的Code Segment,Data Segment一样,Directory有什么IMPORT, EXPORT, RESOURCE的指针
Kenny 2000-05-25
  • 打赏
  • 举报
回复
psh是节(section)的描述,psh->VirtualAddress是指节的开始位置的虚地址,也就是说,在执行该文件时,此节在内存中的地址为:psh->VirtualAddress+本程序在内存中映射的起始地址。
VAImageDir是Directory的起始地址的虚地址。这个值的取值范围须在某一个Section的psh->VirtualAddress+psh->VirtualSize(注意: PB生成的EXE中,psh->VirtualSize的值可能为0,应取生数据长度或(psh+1)->VirtualAddress),则此Directory就在该Section内。这样,装载程序能容易地找到VAImageDir所在的Section。显然这段程序是要对PE进行操作,而不是装载,目的是为找到VAImageDir在磁盘文件的实际地址。
VAImageDir————————一个虚地址
psh->virtualAddress————Section的起始虚地址
psh->VirtualSize—————Section的虚长度(可为0)
psh->PointToRawData————Section在文件中实际存储地址
psh->SizeOfRawData————Section在文件中实际存储的字节数
yongdu 2000-05-24
  • 打赏
  • 举报
回复
有大侠指点吗?

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧