在第39期的课后作业中,有两道题目,可能会难到没有C语言代码基础的同学,这里我将写出来的作业分享给大家:
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;
}
这里我写出的程序可能有很多可优化的地方,非常希望大家可以改进并提出