程序建立期修改PE輸入表法注入

2021-10-23 01:13:46 字數 2099 閱讀 5457

內部包含了一些有關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

virtualallocexdwsectionva+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 檔案中的資料被載入記憶體後根據不同頁面屬性被劃分成很多區塊 節 並有區塊表 節表 的資料來描述這些區塊。這裡我們需要注意的問題是 乙個區塊中的數 據僅僅只是由於屬性相同而放在一起,並不一定是同一種用途的內容。例如輸入表 輸出表等就有可能和唯讀常量一起被放在同乙個區塊中,因為他們的...