最近在看教程(课程一小时,代码写半天)
老师说作业要写代码实现节合并(就是多个节合并成一个节),看老师讲的应该不难,那我就写写吧,
先说说这个程序的思路
1.修改pe头中的NumberOfSection将其改为1,意为只有一个节
//你如果问我·"人家不同的节有不同的作用,你这样一搞人家找不到了怎么办?",我只能说老师这样写直接过也没说怎么回事,可能是都是直接指地址的吧()
2.将第一个节的VirtualSize改成SizeOfImagebase - SizeOfHeader ,意为除了头部分,其他全是这个节的区域
3.将SizeOfRawData = VirtualSize
4.将后面几个节表空间置0(就怕万一)
然后我就开始搓代码,代码不算长
LoadPEFromImagebuffer() 是从Imagebuffer中读取PE数据
ImagebuffertoFilebuffer() 是将Imagebuffer变形成Filebuffer的格式
下面就是代码了
[C++] 纯文本查看 复制代码 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看代码没有什么问题,但是跑不起来,所以来问一下,是我改的有问题还是怎么 |