最近在学习PE结构,自己试着写了一个合并节的函数,但是生成的文件总是有问题。
在不模仿操作系统装载PE的情况下,在文件中怎么做到合并节。大家看看我写的这个函数有什么问题?或者能贴一份思路或代码,那就感激不尽了~
因为我把这个函数写进了一个类里面,所以可能有些成员的声明看不到,但从变量的字面意思应该可以看得懂。
(附加:自从学了PE之后,感觉对指针的理解又深了一层,现在有一种强迫症,定义空指针然后来回强转,放到以前根本不敢这么用
)
PVOID PE_Headers::CompressSection(IN PVOID File_Buffer)
{
PVOID newbuff = NULL;
PBYTE read = NULL, write = NULL;
DWORD filesize = 0;
DWORD i;
if (File_Buffer == NULL)
{
Error_Flag |= EMPTY_IMAGEBUFFER;
return FALSE;
}
filesize = pSection_Header[pPE_Header->NumberOfSections - 1].VirtualAddress
+ pSection_Header[pPE_Header->NumberOfSections - 1].SizeOfRawData;
newbuff = malloc(filesize);
memset(newbuff, 0, filesize);
memcpy (newbuff, pDos_Header, pOptional_Header->SizeOfHeaders);
for (i = 0; i < pPE_Header->NumberOfSections; i++)
{
read = (PBYTE) pDos_Header + pSection_Header[i].PointerToRawData;
write = (PBYTE) newbuff + pSection_Header[i].VirtualAddress;
if (i == 0)
{
write = (PBYTE) newbuff + pSection_Header[i].PointerToRawData;
}
memcpy(write, read, pSection_Header[i].SizeOfRawData);
}
GetPEHeaders(newbuff);
//合并后,virtualsize = ImageSize - 第一个节的偏移量(头的内存大小)
pSection_Header->Misc.VirtualSize = pOptional_Header->SizeOfImage
- pSection_Header->VirtualAddress;
//合并后,sizeofrawdata = 最后节的内存偏移 + 最后节的文件大小 - 第一节的文件偏移量(头的大小)
pSection_Header->SizeOfRawData = filesize - pSection_Header->PointerToRawData;
for (i = 1; i < pPE_Header->NumberOfSections; i++)
{
pSection_Header->Characteristics |= pSection_Header[i].Characteristics;
memset(&pSection_Header[i], 0, sizeof(IMAGE_SECTION_HEADER));
}
pPE_Header->NumberOfSections = 1;
return newbuff;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)