手工解析PE(扩大节)

本次实验内容是将原文件的最后一个节区扩大 0x1000字节

步骤如下

1.将文件读取到内存buff1中

2.将buff1拉伸到buff2   大小为sizeofimage + 扩大的大小

3.修改buff2中 最后一个节的文件大小和内存大小为N 

         N的计算方法:

        找出最后一个节的内存大小 和 文件大小 哪个大,取较大的 然后根据内存对齐为largersize

        N = largersize + 扩大的字节数

4.修改buff2中 sizeofimage = sizeofimage + 扩大的字节数

5.将内存形式的buff2转化为文件形式的buff3

6.将buff3写入到文件 生成新exe

代码如下

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "mycode.h"
 
// 文件 -> Buffer1(ptr) -> Buffer2(pimagebuffer) -> Buffer3(p_newfilebuffer) -> 文件
//         文件对齐          内存对齐                  文件对齐

int main()
{
	char* sourcefile="D:\\CODE\\t\\Debug\\t.exe";
	char* targetfile="D:\\CODE\\t\\Debug\\t4.exe";
	int extendsize=0x1000;  //扩大节的大小
	char* ptr=read_file_to_file_buffer(sourcefile);
	
	PE filePE;
	set_pe(ptr,&filePE);

	//拉伸内存
	//申请空间 大小为 sizeofimage 
	char* pimagebuffer;
	pimagebuffer = (char*) malloc(*filePE.p_sizeofimage);
	if( pimagebuffer == NULL)
	{
		printf("空间不足\n");
		return 0;
	}
	memset(pimagebuffer,0,*filePE.p_sizeofimage);
	trans_file_buffer_to_image_buffer(ptr,pimagebuffer);

	//扩大内存
	//申请空间 大小为 sizeofimage + 扩大的大小
	char* pextendimagebuffer;
	pextendimagebuffer = (char*) malloc(*filePE.p_sizeofimage + extendsize);
	if( pextendimagebuffer == NULL)
	{
		printf("空间不足\n");
		return 0;
	}
	memset(pextendimagebuffer,0,*filePE.p_sizeofimage + extendsize);
	memcpy(pextendimagebuffer
			,pimagebuffer
			,*filePE.p_sizeofimage);
	//修改最后一个节的大小
	PE extendPE;
	set_pe(pextendimagebuffer,&extendPE);
	//找出最后一个节的内存大小和文件大小  哪个大 取大的
	int zhengshu = *(int*)((char*)extendPE.pmisc + (*extendPE.p_numberofsections - 1)*40) / *extendPE.p_sectionalignment;
	int yushu = *(int*)((char*)extendPE.pmisc + (*extendPE.p_numberofsections - 1)*40) - *extendPE.p_sectionalignment * zhengshu;
	int diff = *extendPE.p_sectionalignment - yushu;
	int memsize = *(int*)((char*)extendPE.pmisc + (*extendPE.p_numberofsections - 1)*40) + diff; //内存大小   内存对齐后的大小

	zhengshu = *(int*)((char*)extendPE.psizeofrawdata + (*extendPE.p_numberofsections - 1)*40) / *extendPE.p_sectionalignment;
	yushu = *(int*)((char*)extendPE.psizeofrawdata + (*extendPE.p_numberofsections - 1)*40) - *extendPE.p_sectionalignment * zhengshu;
	diff = *extendPE.p_sectionalignment - yushu;
	int filsize = *(int*)((char*)extendPE.psizeofrawdata + (*extendPE.p_numberofsections - 1)*40) + diff; //文件大小   内存对齐后的大小

	int largersize =  memsize > filsize ? memsize : filsize;
	int lastsize = largersize + extendsize;

	//最后一个节的内存大小和文件大小都改为 lastsize
	*(int*)((char*)extendPE.pmisc + (*extendPE.p_numberofsections - 1)*40) = lastsize;
	*(int*)((char*)extendPE.psizeofrawdata + (*extendPE.p_numberofsections - 1)*40) = lastsize;

	//修改sizeofimage
	*extendPE.p_sizeofimage = *extendPE.p_sizeofimage+extendsize;

	//将imagebuffer 转化为 filebuffer
	int lastsection_offset = *(int*)((char*)extendPE.ppointertorawdata + (*extendPE.p_numberofsections - 1)*40);
	int lastsection_size = *(int*)((char*)extendPE.psizeofrawdata + (*extendPE.p_numberofsections - 1)*40);
	int sizeofp_newfilebuffer=lastsection_offset+lastsection_size;
	char* p_newfilebuffer = (char*) malloc(sizeofp_newfilebuffer);
	if( p_newfilebuffer == NULL)
	{
		printf("空间不足\n");
		return 0;
	}
	else
	{
		printf("Newfilebuffer地址:%x \n",p_newfilebuffer);
	}
	memset(p_newfilebuffer,0,sizeofp_newfilebuffer);
	trans_image_buffe_to_file_buffer_normal(pextendimagebuffer,p_newfilebuffer);

	//将NewFileBuffer 中的内容写入到一个新的exe文件
	trans_file_buffer_to_file(p_newfilebuffer,targetfile,sizeofp_newfilebuffer);

	//释放内存
	free(pextendimagebuffer);
	pextendimagebuffer=NULL;
	read_file_to_file_buffer_free(ptr);
 
	return 0;
}
 

扩大节后程序可以正常运行

修改前最后一个节的大小

 修改后最后一个节的大小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值