首页
社区
课程
招聘
[求助]问个DLL加载到内存中的总大小问题
发表于: 2017-4-6 15:38 3198

[求助]问个DLL加载到内存中的总大小问题

2017-4-6 15:38
3198

本人小白一个,最近需要用到内存加载dll.在网上找了些资料看了看,关于下面这段代码有几个疑问,还望大家指点一二。

//计算对齐边界

int CMemLoadDll::GetAlignedSize(int nOrigin, int nAlignment)

{

//这里-1个字节是为了处理PE头大小刚好=nAlignment整数倍的情况

return (nOrigin + nAlignment - 1) / nAlignment * nAlignment;

}

//计算整个dll映像文件的尺寸

int CMemLoadDll::CalcTotalImageSize()

{

int nSize = 0;

if (m_pNTHeader == NULL)

{

return 0;

}

int nAlign = m_pNTHeader->OptionalHeader.SectionAlignment; //段对齐字节数

// 计算所有头的尺寸。包括dos, coff, pe头 和 段表的大小

nSize = GetAlignedSize(m_pNTHeader->OptionalHeader.SizeOfHeaders, nAlign);

// 计算所有节的大小

for (int i=0; i < m_pNTHeader->FileHeader.NumberOfSections; ++i)

{

//得到该节的大小

int nCodeSize = m_pSectionHeader[i].Misc.VirtualSize ;

int nLoadSize = m_pSectionHeader[i].SizeOfRawData;

int nMaxSize = (nLoadSize > nCodeSize) ? (nLoadSize) : (nCodeSize);

int nSectionSize = GetAlignedSize(m_pSectionHeader[i].VirtualAddress + nMaxSize, nAlign);

if (nSize < nSectionSize)

{

nSize = nSectionSize;  //Use the Max;

}

}

return nSize;

}

以上的代码是在网上找的计算DLL加载到内存中的镜像的大小。

疑问一, IMAGE_OPTIONAL_HEADER32结构中的  SizeOfImage 这一项表示PE文件加载到内存中的总大小,为什么不用这一项而是采用计算的方式。

疑问二, for (int i=0; i < m_pNTHeader->FileHeader.NumberOfSections; ++i)  这个计算节大小的for语句,是否可以直接改成找到最后一个节的位置,

也就是说直接比较每个节的 VirtualAddress 值,取最大的,这个值加上本节按照SectionAlignment对其后的大小,这样得出的值不就是整个镜像文件的大小吗?而没必要把每个节的大小计算出来,按我的理解上面代码处理有点多此一举,毕竟我是个小白,对PE理解不深,如果非要按照上面的代码处理的话,想问问大家我有什么地方没考虑周全。谢谢!!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//