1.将notepad.exe程序读取到内存,并且返回内存中的地址
话不多说,直接给出源码:
#include<stdio.h> #include<stdlib.h> int main(){ FILE *fp; int File_size; char *File_Buffer; //打开文件 if((fp=fopen("E:\\个人\\逆向\\练习.exe","rb"))==NULL){ printf("File open error!\n"); exit(0); } //获取文件大小 rewind(fp); fseek(fp,0,SEEK_END); if((File_size=ftell(fp))==-1){ printf("读取文件大小错误!\n"); } rewind(fp); printf("文件大小:%d字节。\n",File_size); //申请内存 File_Buffer=(char*)malloc(File_size); printf("内存地址:%x\n",File_Buffer); //写入 while(!feof(fp)){ fread(File_Buffer,1,File_size,fp); } //释放内存 free(File_Buffer); //关闭文件 if(fclose(fp)){ printf("Can not close the file!\n"); exit(0); } printf("读入完成。\n"); return 0; } }
2.将内存中的数据存储到文件中(exe)文件,完成之后观察是否可运行
这里直接给出源码,大家自己琢磨出来会有更深刻的理解
#include<stdio.h> #include<stdlib.h> int main(){ FILE *fp1,*fp2; int File_length,*File_Buffer; //打开原文件 if((fp1=fopen("C:\\Windows\\System32\\notepad.exe","rb"))==NULL){ printf("File open error!\n"); exit(0); } //获取文件大小 rewind(fp1); fseek(fp1,0,SEEK_END); File_length=ftell(fp1); rewind(fp1); printf("文件大小:%d。\n",File_length); //申请内存 File_Buffer=malloc(File_length); //新建文件 if((fp2=fopen("E:\\个人\\逆向\\逆向作业\\39练习生成文件(二进制文件).exe","wb"))==NULL){ printf("新建文件失败!\n"); exit(0); } //写入数据 if(!feof(fp1)){ fread(File_Buffer,1,File_length,fp1); fwrite(File_Buffer,1,File_length,fp2); } //释放内存 free(File_Buffer); //关闭文件 if(fclose(fp1)&&fclose(fp2)){ printf("Can not close the file!\n"); exit(0); } printf("文件写入成功!\n"); return 0; }
这里我写出的程序可能有很多可优化的地方,非常希望大家可以改进并提出