-
-
[旧帖] [求助]看PEArmor例子,代码感觉有些疑问 0.00雪花
-
发表于: 2016-3-12 22:17 1408
-
// 循环依次读出SECTION数据到映象中的虚拟地址处
for (nIndex = 0, psecHeader = m_psecHeader; nIndex < nSectionNum; ++ nIndex, ++ psecHeader)
{
nRawDataSize = psecHeader->SizeOfRawData;
nRawDataOffset = psecHeader->PointerToRawData;
nVirtualAddress = psecHeader->VirtualAddress;
nVirtualSize = psecHeader->Misc.VirtualSize;
// 定位到SECTION数据起始处
SetFilePointer(hFile, nRawDataOffset, NULL, FILE_BEGIN);
// 读SECTION数据到映象中
ReadFile(hFile, &m_pImageBase[nVirtualAddress], nRawDataSize,&NumberOfBytesRW, NULL); // &m_pImageBase[nVirtualAddress] 还是指向段的VirtualAddress的地方, 只是变了种形式
if(IsDelShare)//设置区块共享 属性
psecHeader->Characteristics = psecHeader->Characteristics & ~IMAGE_SCN_MEM_SHARED;
}
psecHeader -- ; // 上面的循环结束后 psecHeader指向了 最后个段表的后一个字节,然后减一个结构大小,回到了 最后一个段表 首地址
// 修正可能存在的ImageSize没有对齐的情况
m_pntHeaders->OptionalHeader.SizeOfImage = psecHeader->VirtualAddress + psecHeader->Misc.VirtualSize; //最后个段内存地址+ 段大小 赋值给 内存映像大小
//***********额外数据读取********************/
/*保存地址:MapOfSData */
/*大小:nMapOfSDataSize */
/********************************************/
if(IsSaveSData)
{
nMapOfSDataSize=nFileSize - (psecHeader->PointerToRawData + psecHeader->SizeOfRawData); // 判断是否有额外数据, nMapOfSDataSize为长度
if(nMapOfSDataSize>0) // 一般来说 文件尺寸= 末段文件偏移+末段文件大小,但我们复制到内存的时候 是根据段开头 与 段大小 对齐放到 内存的
{ //就是说忽略了 不属于任何段 的内容,所以产生 文件尺寸不相等
MapOfSData = new char[nMapOfSDataSize];
memset(MapOfSData , 0, nMapOfSDataSize);
ReadFile(hFile, MapOfSData, nMapOfSDataSize,&NumberOfBytesRW, NULL);
问题就在ReadFile这里,在上面一个循环中,文件指针指向了 最后一个段的 首地址,这里就将 额外数据空间 复制过来,实际复制的是 最后一个段的内容呀?
AddLine(hDlg,"额外数据读取完毕.");
}
else
{
AddLine(hDlg,"没有额外数据.");
}
}
CloseHandle(hFile);
AddLine(hDlg,"文件读入完成.");
for (nIndex = 0, psecHeader = m_psecHeader; nIndex < nSectionNum; ++ nIndex, ++ psecHeader)
{
nRawDataSize = psecHeader->SizeOfRawData;
nRawDataOffset = psecHeader->PointerToRawData;
nVirtualAddress = psecHeader->VirtualAddress;
nVirtualSize = psecHeader->Misc.VirtualSize;
// 定位到SECTION数据起始处
SetFilePointer(hFile, nRawDataOffset, NULL, FILE_BEGIN);
// 读SECTION数据到映象中
ReadFile(hFile, &m_pImageBase[nVirtualAddress], nRawDataSize,&NumberOfBytesRW, NULL); // &m_pImageBase[nVirtualAddress] 还是指向段的VirtualAddress的地方, 只是变了种形式
if(IsDelShare)//设置区块共享 属性
psecHeader->Characteristics = psecHeader->Characteristics & ~IMAGE_SCN_MEM_SHARED;
}
psecHeader -- ; // 上面的循环结束后 psecHeader指向了 最后个段表的后一个字节,然后减一个结构大小,回到了 最后一个段表 首地址
// 修正可能存在的ImageSize没有对齐的情况
m_pntHeaders->OptionalHeader.SizeOfImage = psecHeader->VirtualAddress + psecHeader->Misc.VirtualSize; //最后个段内存地址+ 段大小 赋值给 内存映像大小
//***********额外数据读取********************/
/*保存地址:MapOfSData */
/*大小:nMapOfSDataSize */
/********************************************/
if(IsSaveSData)
{
nMapOfSDataSize=nFileSize - (psecHeader->PointerToRawData + psecHeader->SizeOfRawData); // 判断是否有额外数据, nMapOfSDataSize为长度
if(nMapOfSDataSize>0) // 一般来说 文件尺寸= 末段文件偏移+末段文件大小,但我们复制到内存的时候 是根据段开头 与 段大小 对齐放到 内存的
{ //就是说忽略了 不属于任何段 的内容,所以产生 文件尺寸不相等
MapOfSData = new char[nMapOfSDataSize];
memset(MapOfSData , 0, nMapOfSDataSize);
ReadFile(hFile, MapOfSData, nMapOfSDataSize,&NumberOfBytesRW, NULL);
问题就在ReadFile这里,在上面一个循环中,文件指针指向了 最后一个段的 首地址,这里就将 额外数据空间 复制过来,实际复制的是 最后一个段的内容呀?
AddLine(hDlg,"额外数据读取完毕.");
}
else
{
AddLine(hDlg,"没有额外数据.");
}
}
CloseHandle(hFile);
AddLine(hDlg,"文件读入完成.");
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
看原图
赞赏
雪币:
留言: