貼個初級問題,高手莫入:呼叫PE檔案中引入表中的函式的方法 (1千字)

看雪資料發表於2015-11-15

當我們補丁一個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

相關文章