读取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
,即二进制文件的读取模式,不使用此模式新文件的大小会不一致