對於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