初识PE结构:编程在任意节空白区添加代码(一)

我们如果想在任意节空白区添加隐藏代码:首先我们先实验对PE文件进行正确的读写,是要将.exe文件从硬盘中完整地拷贝到内存中,这时我们称这个在内存数据块为FileBuffer,然后我们要将FileBuffer按照操作系统能运行的要求进行拉伸对齐生成内存映像文件ImageBuffer,我们才能得到正确的偏移,之后将ImageBuffer按照文件对齐的形式转成新的文件NewBuffer,最后将NewBuffer存储到硬盘中。


在这里详细说说从fileBuffer(文件缓冲区)转成ImageBuffer(镜像缓冲区)和ImageBuffer(镜像缓冲区)转成NewBuffer(新文件缓冲区两个步骤,这是PE文件读写的关键步骤:


从filebuffer转成imagebuffer
1、申请空间,大小为pOptionHeader->SizeOfImage,并初始化为零。
2、拷贝头,拷贝的大小为pOptionHeader->SizeOfHeaders。
3、按照节表的信息循环拷贝节,VisualSize(在内存中对齐前的大小),RawSize(在文件中对齐后的大小),从文件中哪里拷(PointToRawData),拷到内存中的位置(VisualAddress),拷贝的大小(SizeOfRawData)。
部分代码:

 //先拷贝头
    memcpy(pTempImageBuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
//根据节表,循环拷贝节
    PIMAGE_SECTION_HEADER ptempSectionHeader = pSectionHeader;
    int i = 0;
    for( i= 0;i<pPEHeader->NumberOfSections;i++,ptempSectionHeader++)
    {
        memcpy((void*)((DWORD)pTempImageBuffer + ptempSectionHeader->VirtualAddress),(void*)((DWORD)pDosHeader + ptempSectionHeader->PointerToRawData),ptempSectionHeader->SizeOfRawData);
    }


imagebuffer转成newbuffer
1、申请空间,申请大小为找到最后一个节在文件中的起始位置加上一个节对齐后的大小,PointToRawData+sizeofraw。并初始化为零
2、拷贝头,大小为SizeOfHeader。
3、按照节表信息拷贝节,从内存中的位置(VisualAddress)开始拷,拷到文件中(PointToRawData),拷贝的大小为(SizeOfRawData)。
部分代码:

//先拷贝头
    memcpy(pTempNewBuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
//拷贝节
    ptempSectionHeader = pSectionHeader;
    for( i= 0;i<pPEHeader->NumberOfSections;i++,ptempSectionHeader++)
    {
        memcpy((void*)((DWORD)pTempNewBuffer + ptempSectionHeader->PointerToRawData),(void*)((DWORD)pDosHeader + ptempSectionHeader->VirtualAddress),ptempSectionHeader->SizeOfRawData);
    }

阅读更多
个人分类: 逆向
上一篇初识PE结构:如何对程序加料
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭