读取exe文件到内存中并存储到另一个exe文件

读取exe文件到内存中并存储到另一个exe文件

滴水逆向三期,内存分配-文件读写的练习题

实现代码

#include "stdafx.h"
#include "stdlib.h"

#define F_PATH "C:\\WINDOWS\\system32\\notepad.exe"
#define NF_PATH "C:\\new_notepad.exe"
typedef unsigned char uchar;

int OpenFunction();
uchar* GetMemorySpace(FILE*,int);
int CreateNewFile(uchar*, int);


int OpenFunction() {
	int len;
	
	FILE *fp = NULL;
	fp = fopen(F_PATH,"rb");	//设置文件指针
	
	if (fp == NULL) return -1;	//判断是否成功设置
	
	fseek(fp, 0, SEEK_END);		//将文件指针定位到文件末尾
	len = ftell(fp);			//获取文件大小
	
	fseek(fp, 0, SEEK_SET);		//将文件指针定位到文件开头
	uchar *addr = GetMemorySpace(fp,len);//分配存储空间,并将内容存储到分配的空间中
	CreateNewFile(addr,len);	//创建文件,并将将获取的内容放入其中
	
	fclose(fp);
	return 0;
}

uchar* GetMemorySpace(FILE* fp, int len) {
	/**
	 * 分配存储空间,并将内容存储到分配的空间中,返回内存空间的首地址
	 **/
	uchar *addr = (uchar*)malloc(len);
	fread(addr, len+1, 1, fp);	//读取文件
	return addr;
}

int CreateNewFile(uchar* addr, int len) {
	/**
	 * 创建文件,并将将获取的内容放入其中
	 **/
	FILE *nfp;
	nfp = fopen(NF_PATH,"wb");
	
	fwrite(addr, len, 1, nfp); //写入文件
	
	fclose(nfp);
	return 0;
}

int main(int argc, char* argv[]) {
	int flag = OpenFunction();
	if (flag) printf("error\n");
	return 0;
}

注意事项

在完成此练习时,遇到如下问题

  • fopen()的模式应为*b,即二进制文件的读取模式,不使用此模式新文件的大小会不一致
posted @ 2021-09-16 22:59  Ybitsec  阅读(294)  评论(0编辑  收藏  举报