滴水三期逆向基础系列(三)-新建节,可添加代码

VOID AddNewSection(
	size_t sectionLength
){
	LPVOID pFileBuffer = NULL;
	LPVOID pTempFileBuffer = NULL;
	size_t fileSize = ReadPEFile(FilePath_In, &pFileBuffer);
	if(pFileBuffer == NULL){
		printf("文件 --> 文件缓冲区失败");
		return ;
	}

	PIMAGE_DOS_HEADER pDosHeader = NULL;
	PIMAGE_NT_HEADERS pNTHeader = NULL;
	PIMAGE_FILE_HEADER pFileHeader = NULL;
	PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL;
	PIMAGE_SECTION_HEADER pSectionHeader = NULL;

	pTempFileBuffer = malloc(fileSize + sectionLength);
	if(pTempFileBuffer == NULL){
		printf("临时文件缓冲区申请失败");
		free(pFileBuffer);
		return ;
	}
	memset(pTempFileBuffer, 0, fileSize + sectionLength);
	memcpy(pTempFileBuffer, pFileBuffer, fileSize);

	pDosHeader = (PIMAGE_DOS_HEADER)pTempFileBuffer;
	pNTHeader = (PIMAGE_NT_HEADERS)((BYTE *)pDosHeader + pDosHeader->e_lfanew);
	pFileHeader = (PIMAGE_FILE_HEADER)((BYTE *)pNTHeader + sizeof(DWORD));
	pOptionHeader = (PIMAGE_OPTIONAL_HEADER)((BYTE *)pFileHeader + IMAGE_SIZEOF_FILE_HEADER);

	pSectionHeader = (PIMAGE_SECTION_HEADER)((BYTE *)pOptionHeader + pFileHeader->SizeOfOptionalHeader);
	pFileHeader->NumberOfSections = pFileHeader->NumberOfSections + 1;
	pOptionHeader->SizeOfImage = pOptionHeader->SizeOfImage + sectionLength;
	pSectionHeader += pFileHeader->NumberOfSections - 1;

	DWORD SizeOfData = 0;
	DWORD maxSize = 0;

	strcpy((char *)pSectionHeader->Name, ".yangle");
	pSectionHeader->Misc.VirtualSize = sectionLength;
	maxSize = (pSectionHeader - 1)->Misc.VirtualSize > (pSectionHeader - 1)->SizeOfRawData?(pSectionHeader - 1)->Misc.VirtualSize:(pSectionHeader - 1)->SizeOfRawData;
	if(maxSize % pOptionHeader->SectionAlignment == 0){
		SizeOfData = maxSize / pOptionHeader->SectionAlignment * pOptionHeader->SectionAlignment;
	}else{
		SizeOfData = maxSize / pOptionHeader->SectionAlignment * pOptionHeader->SectionAlignment + pOptionHeader->SectionAlignment;
	}
	pSectionHeader->VirtualAddress = (pSectionHeader - 1)->VirtualAddress + SizeOfData;
	pSectionHeader->SizeOfRawData = sectionLength;
	pSectionHeader->PointerToRawData = (pSectionHeader - 1)->PointerToRawData + (pSectionHeader - 1)->SizeOfRawData;
	pSectionHeader->Characteristics = (pSectionHeader - 1)->Characteristics;

	MemoryToFile(pTempFileBuffer,fileSize + sectionLength,FilePath_Out);

}

脑海里一定要有PE文件结构图,写这才能的心应手。

一定要记得节对齐!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值