PE加载器流程
1.将PE文件用ReadFile读取数据
char szFileName[] = "1.exe";
//打开文件,设置属性可读可写
HANDLE hFile = CreateFileA(szFileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("文件打开失败\n");
return 1;
}
//获取文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
//申请空间将exe读取到内存中
char *pData = new char[dwFileSize];
if (NULL == pData)
{
printf("空间申请失败\n");
return 2;
}
DWORD dwRet = 0;
ReadFile(hFile, pData, dwFileSize, &dwRet, NULL);
CloseHandle(hFile);
2.根据PE结构获取镜像大小,在自己的程序中申请可读可写可执行的内存
char* chBaseAddress = NULL;
//获取镜像大小
DWORD dwSizeOfImage = GetSizeOfImage(pFileBuff);
//在进程中开辟一块内存空间
chBaseAddress = (char*)VirtualAlloc(NULL,
dwSizeOfImage,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
if (NULL == chBaseAddress)
{
printf("申请进程空间失败\n");
return NULL;
}
3.将申请的空间全部填为0
RtlZeroMemory(chBaseAddress, dwSizeOfImage);
4.将用ReadFile读取的数据映射到内存中
由上图可知,PE文件在加载到内存中对齐粒度不同,因此在写代码时要注意这个问