c00005防止内存出错,
内核重载:操作系统启动内核.exe文件,重载用peloader启动操作系统的exe
filebuffer是直接从硬盘加载到内存
imagebuffer是文件映像,做了内存对齐
imageBuffer 是fileBuffer的拉伸,可以运行啦
imageBase是内存镜像基址。这里的大小不确定。
执行的时候还要做地址转换,把虚拟地址转换成物理地址。
第一节 代码 第二节数据 第三节资源
OEP(AddressOfEntryPoint):
程序入口地址,位于第一节代码的某一位置。
oep+imageBase:
内存的入口点
模块对齐。模块ob的e的dll就是模块。
pe loader:
加载对齐filebuffer-> imagebuffer加载不确定是否占用。内存地址占用。
SizeOfImage,imagebuffer的大小,内存中整个pe的映射文件,可以比实际大,但必须是SectionAlignmaent(内存对齐)的整数倍
SizeOfHeaders :
所有头+节表按照文件对齐后的大小,严格按照FileAlignment(文件对齐)对齐,否则加载会出错。(dos+pe标记+标准pe头+可选pe+节表)
节表:
- dos
- 垃圾数据哈哈
- pe标记(4字节)
- 标准pe头
- 可选pe头
- 节表(说明:节的文件中从那里开始,有多大,从内存那里开始,有多大,有几节就有几项)
CheckSum :
校验和,pe文件2个字节2个字节加,存不下自然溢出,用于判断文件是否修改,可逆,检验目的,(驱动程序,系统重要dll,系统检查和,可以改)(自己脑洞:先算出来,改了pe之后,修改这个和以前一样,2333)
SizeOfStackReserver: 初始化时保留的堆栈大小
SizeOfStackCommit: 初始化时实际提交的大小
SizeOfHeapReserver:初始化时保留的堆的大小
SizeOfHeapCommit: 初始化时实践提交的大小
NumberOfRvaAndSizes: 目录项数目 32位16
16个结构,每个结构都有特别的含义,编译器用的,纪录了编译器往exe加入的数据在哪里,干什么的。(导入表,导出表,重定向表,资源表,调试信息表等等)
LPVOID ReadPEFile(LPSTR lpszFile){
FILE *pFile=NUll;
DWORD fileSize = 0;
LPVOID pFileBuffer=null;
//打开文件
pFile=fopen(lpszFile,"rb");
if(!pFile){
printf("无法打开exe文件");
return NULl;
}
//读取文件大小
fseek(pFile,0,SEEK_END);
fileSize=ftell(pFile);
}