內部包含了一些有關pe結構的變數和一些函式函式列表如下
利用createprocess
並以掛起的方式啟動需要注入程式
首先readprocessmemory
讀取pe程式,並初始化pe頭,根據基位址獲取pimage_dos_header
根據dos頭e_lfanew
獲取pimage_nt_header
位址
根據nt頭fileheader
獲取檔案頭位址,optionalheader
獲取可選頭位址
根據檔案頭numberofsections
獲取節區個數
根據可選頭datadirectory[image_directory_entry_basereloc]
獲取基址重定位表,加上可選頭大小即可得到節區頭位址。addressofentrypoint
獲取程式入口位址。sizeofimage
獲取映象大小。imagebase
獲取基址datadirectory[image_directory_entry_import]
獲取匯入表,datadirectory[image_directory_entry_export]
獲取匯出表。
根據匯入表virtualaddress
獲取匯入表虛擬位址,size
獲取大小
根據匯出表virtualaddress
獲取匯出表虛擬位址。
遍歷各個節區頭的virtualaddress
,來判斷。
計算好新節區大小(匯入表原始大小+乙個匯入表結構體+4*sizeof(ulong_ptr)
+strlen(szdllname)
+1+sizeof(word)
+strlen(szdllexportfunname)
+1)
其中4個(ulong_ptr)的指標分別為import_by_name結構體va和0填充再加上iat和0填充
計算新節區的記憶體偏移
dwsectionva = plastsecheader->virtualaddress + align_size_up(plastsecheader->misc.virtualsize,m_poptheader->sectionalignment);
計算新節區頭偏移
pimage_section_header pnewsecheader = m_psecheader + m_sectioncnt
virtualallocex
以dwsectionva+imagebase
開始分配記憶體,大小為新節區大小
之後將節區頭大小偏移。並且將節區頭各屬性一一賦值。
再更新檔案頭的節區個數,可選頭的sizeofimage大小要加上新節區大小。
首先填充dllname,之後填充pimport_by_name結構,之後再填充originalfirst其中oringalfirst指向pimport_by_name偏移。firstthunk就用0來填充。
將更新匯入表的大小,設立新匯入表的偏移
image.m_pimpdatadir->size = dwnewiidsize;
image.m_pimpdatadir->virtualaddress = dwvatostorenewiid;
image.m_poptheader->datadirectory[image_directory_entry_bound_import]
.virtualaddress =0;
image.m_poptheader->datadirectory[image_directory_entry_bound_import]
.size =
0;
將改寫的資料(檔案頭,可選頭,節區頭,新節區)全部寫入程序記憶體。
最後執行主線程。注入完畢,程式載入該dll。
**參考:加密與解密4
關於PE檔案 輸入表
什麼是輸入表?輸入表就相當於exe檔案與 dll檔案溝通的橋梁,形象的可以比喻成兩個城市之間交流的高速公路。在pe檔案對映到記憶體後,windows將相應的dll檔案裝入,exe檔案通過 輸入表 找到相應的dll中的匯入函式,從而完成程式的正常執行。輸入表的組成與工作原理?首先大概了解整體的結構 三...
PE檔案中的輸入表
pe檔案中的輸入表含有三個重要結構iid,int,iat。pe檔案為需要載入的dll檔案建立乙個iid結構,乙個dll與乙個iid對應。int是輸入名稱表,iat輸入位址表,在沒有繫結輸入的情況下磁碟中的檔案int與iat相同。如果有繫結輸入的話因為繫結輸入的函式其磁碟檔案中的iat項就已經是對應函...
PE檔案詳解五 PE詳解之輸入表(匯入表)詳解1
首先,我們知道pe 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...