首页
社区
课程
招聘
PEArmor 额外数据部分 代码貌似有错误,在ReadFile中 读的是最后一个段内容
发表于: 2016-3-12 22:30 12222

PEArmor 额外数据部分 代码貌似有错误,在ReadFile中 读的是最后一个段内容

2016-3-12 22:30
12222
// 循环依次读出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这里,在上面一个循环中,文件指针指向了 最后一个段的 首地址,这里就将 额外数据空间 复制过来,实际复制的是 最后一个段的内容呀?
// 我觉得 既然是对 额外数据空间 的内容进行处理,那么应该是  检查一个段的 文件偏移 是否等于 前一个段的 文件偏移PointerOfRawData+ 段文件大小RawDataSize,多余的部分就是 额外数据了,而本书的例子 让我完全看不懂头脑
                                AddLine(hDlg,"额外数据读取完毕.");       
                        }
                        else
                        {
                                AddLine(hDlg,"没有额外数据.");
                        }
                }
                CloseHandle(hFile);
                AddLine(hDlg,"文件读入完成.");
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
2
ReadFile会自动调整文件指针的
2016-3-12 23:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不懂额, 您是说 到了ReadFile()这里,指针指向哪里了?
2016-3-13 15:19
0
游客
登录 | 注册 方可回帖
返回
//