PE合并节的主要代码实现,详细注释(内存和文件对齐相同时的版本)

在这里插入图片描述
在这里插入图片描述

//合并节

//参数:传入拉伸后的imagebuffer

LPVOID MergeSection(LPVOID imagebuffer)

{

PIMAGE_DOS_HEADER pDosHeader4 = NULL;

PIMAGE_NT_HEADERS32 pNTHeader4 = NULL;

PIMAGE_FILE_HEADER pFileHeader4 = NULL;

PIMAGE_OPTIONAL_HEADER32 pOptionHeader4 = NULL;

PIMAGE_SECTION_HEADER pSectionHeader4 = NULL;

LPVOID MergeSec = NULL;

pDosHeader4 = (PIMAGE_DOS_HEADER)imagebuffer;

pNTHeader4 = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader4 + pDosHeader4->e_lfanew);

pFileHeader4 = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader4 + 4);

pOptionHeader4 = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pFileHeader4 + IMAGE_SIZEOF_FILE_HEADER);

pSectionHeader4 = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader4 + pFileHeader4->SizeOfOptionalHeader);

//取拉伸后这个imagebuffer的大小值

DWORD len =  (pSectionHeader4+4)->VirtualAddress + (pSectionHeader4->SizeOfRawData > pSectionHeader4->Misc.VirtualSize ? pSectionHeader4->SizeOfRawData : pSectionHeader4->Misc.VirtualSize);

//修改sizeofrawdata和misc.virtualsize 为len减去头部大小(一个节的总共大小),然后统一大小

pSectionHeader4->SizeOfRawData = len-pOptionHeader4->SizeOfHeaders;

pSectionHeader4->Misc.VirtualSize = len-pOptionHeader4->SizeOfHeaders;

int n = 1;

while (n<pFileHeader4->NumberOfSections)

{

pSectionHeader4->Characteristics |= (pSectionHeader4 + n)->Characteristics;

ZeroMemory((char*)pSectionHeader4 + sizeof(IMAGE_SECTION_HEADER)*n, sizeof(IMAGE_SECTION_HEADER));

n++;

}

//修改节数量

pFileHeader4->NumberOfSections = 1;

//修改sizeofimage值

pOptionHeader4->SizeOfImage = len;

//申请内存

MergeSec = malloc(len);

//复制进MergeSec

memcpy(MergeSec, imagebuffer,len);

return MergeSec;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值