再貼一篇稍微複雜點的:對於DLL通過增加重定位項直接呼叫引入表函式 (2千字)

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

對於DLL檔案,還有一種比較簡單的方法,通過在衝定位表中增加IAT的重定位項實現。
  先看下面補丁程式:
                . 
0167:01077228  PUSH      EBX  ;函式名字
0167:01077229  PUSH      EDX  ;Kernel32的hModule
0167:0107722A  NOP
0167:0107722B  NOP
0167:0107722C  NOP
0167:0107722D  NOP
0167:0107722E  NOP
0167:0107722F  NOP
0167:01077230  CALL      [KERNEL32!GetProcAddress]
0167:01077236  TEST      EAX,EAX
0167:01077238  JZ        010772AC
                .
                .
  在SoftIce中寫補丁時候就像上面一樣寫,完成後,0167:01077230處的指令程式碼將為:FF 15 xx xx xx xx,我們需要做的就是將xx xx xx xx處寫入衝定位表。在本例子中,基地址為1040000,所以1077230處的RAV為37230,由於重定位表都是1000對齊的,所以要在重定位表中RVA為37000的索引中增加。
  1、找到重定位表中索引為37000的地方,如果沒有這個索引,就給
      它加上,並將它的長度欄位(第2個雙字)加2
  2、計算重定位專案值:37230 - 37000 + 2 = 232,加2是跳過指令
      字FF 15,指令字之後才是要重定位的地址。
  3、加上屬性:232 or 3000 = 3232,專案值是字單位,高4位是屬
      性。
  4、將專案值3232按照記憶體存放規律--低地址放低位元組,高地址放高
      位元組加到這個索引(37000)中,在這個例子中,高低一樣了。
  5、將重定表最後為0的位元組刪掉2個。同理,你要增加2個專案,就
      要刪掉4個0;增加了索引,最好刪掉同樣長度的0位元組。否則如
      果.reloc節不是最後一個節的話,這個節後面的資料或程式就出
      錯了。若是最後一個節,可以不刪,但要注意對齊PE檔案。
  6、將匯入表長度加2;若增加了n個專案,就要加n*2;若增加了索
      引,要加上同樣的長度。

    現在一切ok了,程式執行時,你呼叫的引入表函式被PE裝載器給重定位了。可以用LoadPe檢視改造後的.reloc表,將會多了一項:
Index RVA  偏移  Type    Far Address  Data Interpretion
5  37232  37232  HIGHLOW(3) 1002C1A8  IAT thunk of "Kernel32"

  需要注意的事項:增加索引或專案時,要注意PE檔案對齊,並要注意當.reloc不是最後一個節的特殊情況(往往是加了殼或打了補丁的才會這樣)。

  EXE檔案往往沒有重定位表,能不能這樣做呢?沒有試過。


                                        Spring.W
                                        2002/11/4

相關文章