首页
社区
课程
招聘
[旧帖] [求助]看PEArmor例子,代码感觉有些疑问 0.00雪花
发表于: 2016-3-12 22:17 1396

[旧帖] [求助]看PEArmor例子,代码感觉有些疑问 0.00雪花

2016-3-12 22:17
1396
// 循环依次读出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,"文件读入完成.");
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//