1、将PE文件从磁盘中读出
2、根据PE结构获取镜像大小,再申请一段可读可写可执行的内存,并填充为0
3、将读取的数据映射到内存中
4、修复导出导入入表
5、修复重定位
6、跳转到PE入口点进行执行
0x00 将PE文件从磁盘中读出
使用ReadFile()读取数据 。
0x01 根据PE结构获取镜像大小,再申请一段可读可写可执行的内存,并填充为0
//获取镜像大小
DWORD SizeOfImage = GetSizeOfImage(pFileBuff);
//在进程中开辟一块内存空间
PEAddress= (char*)VirtualAlloc(NULL,
dwSizeOfImage,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
RtlZeroMemory(PEAddress, SizeOfImage);
0x02 将读取的数据映射到内存中
这里需要注意的地方是内存粒度对齐的问题。
在磁盘中对齐粒度为0x200;
再内存中的对齐粒度为0x1000.
0x03 修复导入表
https://blog.csdn.net/weixin_43742894/article/details/105155489
0x04 修复重定位表
https://blog.csdn.net/weixin_43742894/article/details/105155482