當我們補丁一個PE檔案時,常常要用到呼叫這個PE檔案引入表中的函式,那麼怎樣來呼叫呢?要想很透徹的瞭解其原理,需要對引入表很熟悉,並且要對PE檔案的載入機制有所瞭解。
對於引入表的介紹和PE載入機制,看雪老大的著作上已經介紹的很清楚,只要花點時間,很容易弄清楚。按照下面步驟,即使對不太熟悉引入表的朋友,也能直接使用其中的函式。
準備的工具:LoadPe、Softice或TRW2000
步驟:
1、用LoadPe開啟PE檔案,檢視其目錄中的匯入表,選中要使用的DLL並紀
錄下它的FirstThunk的值(這是IAT表的起始RVA),假設為:E1B7。
2、找到要在這個DLL中要使用的函式,假設為:LoadLibraryA。
3、數一數這個函式在這個DLL函式列表中是第幾個,假設為:第3個。
4、那麼在補丁中呼叫這個函式就是:
call
dword ptr[e1b7+ImageBase][(3-1)*4]
5、ImageBase的獲得:
當我們補丁一個程式時,補丁的起始RVA是已知的(可以根據VA用LoadPe
的FLC計算出來),請看下面程式:
假設補丁開始地址(VA)為:0040d000,透過計算知道對應的RVA為n
0040d000:pushad
0040d001:call 0040d006
0040d006:pop ebp
xxxxxxxx:sub ebp-n-6 ;此時,ebp就是ImageBase,減6是
;pushad 和 call 0040d006的指令長度
xxxxxxxx:call dword ptr[ebp+e1b7][(3-1)*4]
;呼叫
;LoadLibraryA
.
.
.
xxxxxxxx:popad
僅此拋磚引玉,歡迎高手賜教其他方法。
Spring.W
2002/11/3