1、找到檔案載入到記憶體的基址
通常為0x0040 0000
2、取得記憶體對齊粒度
3、載入pe頭,按照記憶體對齊粒度讀取到指定起始位址的記憶體處
4、載入各個節。得到節數目,定位節表,按照記憶體對齊粒度讀取到記憶體,不足的用0填充。
5、基址不對,需要重定位修復。
//#include "stdafx.h"
#include #include //以dwalignment 對齊dwoperatenum 值,也就是讓dwoperatenum為dwalignment的整數倍
dword alignmentnum(dword dwoperatenum, dword dwalignment )
int itemp = dwoperatenum % dwalignment;
if (itemp != 0)
return dwoperatenum ;
}int main(int argc, char* ar**)
dword dwfilesize = 0, dwreadinfactsize = 0;
dwfilesize = getfilesize(hfile, null);
if (dwfilesize == 0xffffffff)
lpvoid pfile = globalalloc(gmem_fixed | gmem_zeroinit, dwfilesize);
if (pfile == null )
bool bread = readfile(hfile, pfile, dwfilesize, &dwreadinfactsize, null);
if (!bread || dwfilesize != dwreadinfactsize)
//pfile指向dos頭
//獲得pe檔案實際起始位置,即pe檔案標誌位置
pimage_nt_headers ppeheader = (pimage_nt_headers)((pbyte )pfile+((pimage_dos_header)pfile)->e_lfanew);
//獲得pe節表起始位址
pimage_section_header psectionheader = (image_section_header *)((char *)&ppeheader->optionalheader +
ppeheader->fileheader.sizeofoptionalheader);
//獲得pe檔案中節的個數
int isectionnum = ppeheader->fileheader.numberofsections;
//最後乙個節的記憶體偏移加上該節資料相對記憶體對齊粒度對齊後的值即該pe檔案載入到記憶體後所佔記憶體的總大小
dword dwcalcimagesize = psectionheader[isectionnum-1].virtualaddress+
alignmentnum(psectionheader[isectionnum-1].sizeofrawdata, ppeheader->optionalheader.sectionalignment);
//pe檔案頭的sizeofimage域儲存了pe檔案載入到記憶體後所佔記憶體的總大小。需要記憶體對齊
dword dwimagesize = alignmentnum(ppeheader->optionalheader.sizeofimage,
ppeheader->optionalheader.sectionalignment);
//通常以上兩種方法得到的兩個值是相等的,如果不等則取較大的乙個
if (dwimagesize < dwcalcimagesize)
//分配記憶體空間,並將其全部初始化為0
lpvoid pmem = globalalloc(gmem_fixed | gmem_zeroinit, dwimagesize);
if (pmem == null )
//將pe頭複製到申請的記憶體中
memcpy(pmem, pfile, ppeheader->optionalheader.sizeofheaders);
//將各個節資料複製到記憶體中
for (int i=0; i
載入PE檔案 記憶體對映檔案
將程式安裝記憶體對齊的方式讀取到記憶體有兩種方法 1 記憶體對映檔案 2 pe載入器模擬法 1 記憶體對映檔案 lpheader所指記憶體是唯讀的,儘管是page readwrite include stdafx.h include include int main int argc,char ar...
PE加載重定位
pe exe檔案載入有時候會重定位,主要是因為 fileheader中的乙個字段 characteristics 這個域描述pe檔案的一些屬性資訊,比如是否可執行,是否是乙個動態連線庫等.具體定義如下 define image file relocs stripped 0x0001 重定位資訊被移除...
PE檔案載入過程揭秘(2)
2011年10月09日 星期日 16 23 自 cvvd 最終編輯 cvvd 圖1pe 載入器在完成檔案實體資料到記憶體虛擬資料的對映之後,便開始從位於 image option header 末端的image data directory 陣列的第 2項 如圖 2 取出輸入表的 rva和大小,準備...