richard_ljd 发表于 2024-9-22 12:18

关于修改PE完成节合并操作的问题

最近在看教程(课程一小时,代码写半天)

老师说作业要写代码实现节合并(就是多个节合并成一个节),看老师讲的应该不难,那我就写写吧,

先说说这个程序的思路

1.修改pe头中的NumberOfSection将其改为1,意为只有一个节   
//你如果问我·"人家不同的节有不同的作用,你这样一搞人家找不到了怎么办?",我只能说老师这样写直接过也没说怎么回事,可能是都是直接指地址的吧()

2.将第一个节的VirtualSize改成SizeOfImagebase - SizeOfHeader ,意为除了头部分,其他全是这个节的区域

3.将SizeOfRawData = VirtualSize

4.将后面几个节表空间置0(就怕万一)

然后我就开始搓代码,代码不算长

LoadPEFromImagebuffer()是从Imagebuffer中读取PE数据

ImagebuffertoFilebuffer() 是将Imagebuffer变形成Filebuffer的格式

下面就是代码了

int ModPEHead::Merge_Sections() {

        if (!pImageBuffer)
                return 0;

        LoadPEFromImagebuffer();

        //计算内存对齐大小,sizeofimage - sizeofheaders计算出除头以外的所有大小
        pSectionHeader->Misc.VirtualSize = pOptionHeader->SizeOfImage - pOptionHeader->SizeOfHeaders;


        pSectionHeader->SizeOfRawData = pSectionHeader->Misc.VirtualSize;

        //默认前两个节至少有一个有执行权限,进行或运算给予执行权限
        pSectionHeader->Characteristics = pSectionHeader->Characteristics | (pSectionHeader + 1)->Characteristics;

        //清空除第一个节以外的其他节
        for (size_t i = 1; i <= pPEHeader->NumberOfSections - 1; i++)
        {
                memset((pSectionHeader + i),NULL,40);
        }

        pPEHeader->NumberOfSections = 1;

        ImagebuffertoFilebuffer();

        return 1;
}

代码也是一遍过,这个函数执行以后写入文件

可以看出大了一倍

拉进010 edit看看


010 edit正常的读,至少没炸,然后我运行一下



炸了,dbg也开不进去。从pe看代码没有什么问题,但是跑不起来,所以来问一下,是我改的有问题还是怎么

richard_ljd 发表于 2024-10-31 13:58

ynzjbys 发表于 2024-10-18 14:49
合并节之前,要先让各节内存对齐,不能只是简单地修改节大小的值,得填充数据,具体可以看这篇帖子,https: ...

好的,这几天没上论坛没看到

ynzjbys 发表于 2024-10-18 14:49

合并节之前,要先让各节内存对齐,不能只是简单地修改节大小的值,得填充数据,具体可以看这篇帖子,https://www.52pojie.cn/thread-1411345-1-1.html
页: [1]
查看完整版本: 关于修改PE完成节合并操作的问题