只申请一块sizeofimage的内存能否实现PE文件的拉伸


不能,别试了,浪费时间.
从最后一个节复制,也会被覆盖

BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer)
{
	FILE* file = (fopen(m_fileName, "rb"));
	if (file == NULL)
	{
		printf("error :%d", GetLastError());
		return FALSE;
	}
	
	// 从文件头跳转到偏移0x3C位置
	if (fseek(file, 0x3C, SEEK_SET) != 0) {
		perror("fseek failed");
		fclose(file);
		return FALSE;
	}
	//读到e_lfannew的值
	LONG e_lfannew = 0;
	if (fread(&e_lfannew, sizeof(LONG), 1, file) != 1) {
		perror("fread failed");
		fclose(file);
		return FALSE;
	}
	//从文件开始跳到可选头的imagebase的位置 
	fseek(file, e_lfannew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+0x38, SEEK_SET);
	DWORD sizeofimage = 0;
	fread(&sizeofimage, sizeof(DWORD), 1, file);
	
	//根据imagebase申请拉伸后的内存
	char* buffer = malloc(sizeofimage);
	if (buffer == NULL)
	{
		perror("malloc failed");
		fclose(file);
		return FALSE;
	}
	memset(buffer, 0, sizeofimage);
	
	fseek(file, 0, SEEK_END);//到文件尾部
	DWORD fileSize = ftell(file);//获得文件的大小
	fseek(file, 0, SEEK_SET);//返回文件头部
	fread(buffer, 1, fileSize, file);//将文件读取到内存中
	fclose(file);
	/
	/*已经将PE文件写到内存中了.但是需要分开拷贝,从最后的节开始拷贝数据*/
	
	//看看是多少位的程序
	WORD magic = *(WORD*)(buffer + e_lfannew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));
	//得到文件头,为了获取节区的数量,和可选头的大小,便于定位到节表中
	PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)(buffer + e_lfannew + sizeof(DWORD));
	//跳到最后一个节区信息结构列表
	WORD NumberOfSections = pFileHeader->NumberOfSections;
	PIMAGE_SECTION_HEADER PLastSectionTable = (char*)pFileHeader +sizeof(IMAGE_FILE_HEADER)+ (pFileHeader->SizeOfOptionalHeader) + ((NumberOfSections -1) * sizeof(IMAGE_SECTION_HEADER));
	//if (magic == 0X10B)
	//{
	//	//这是32位的程序

	//}
	//else 
	//{
	//	//这是64位的程序
	//}
	//循环
	// 从最后一个节区开始向前拷贝
	for (size_t i = pFileHeader->NumberOfSections; i > 0; i--) {
		size_t index = i - 1; // 计算索引(从0开始)
		PIMAGE_SECTION_HEADER currentSection = &PLastSectionTable[index]; // 获取当前节区的指针

		// 从文件中获取源地址和目标地址
		char* src = buffer + currentSection->PointerToRawData; // 文件中的数据
		char* dest = buffer + currentSection->VirtualAddress; // 内存中的目标地址

		// 计算拷贝的大小
		size_t sizeToCopy = currentSection->SizeOfRawData > currentSection->Misc.VirtualSize
			? currentSection->SizeOfRawData
			: currentSection->Misc.VirtualSize;

		// 拷贝数据
		memmove(dest, src, sizeToCopy);//内存被覆盖了
	}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值