本次实验内容是将原文件的最后一个节区扩大 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;
}