重建重定位表指令碼

看雪資料發表於2004-10-18

/*
    ☆☆☆☆☆重建重定位表指令碼--Reloc Mission☆☆☆☆☆

  由於看了fly的OD脫upx dll文章心裡還是一直不爽--用不了◇UPXAngela.exe◇,沒有天使.exe。為何重定位表非要用看雪老師的寶貝UPXAngela.exe,偶就不能自己處理實現嗎?又是重定位認識一知不解,動以何功,於是到處翻資料,終於找到琢磨琢磨,再琢磨……,弄明白了PE裝載器對重定位表的要求,於是手起鍵落,可是老毛病還沒改掉,寫得慢呀,測試了也提煩,終於不負自己寫下了這個指令碼。

  如果重定位表被“幹掉”了,那麼在它解密實現重定位時,應該可以使用此指令碼為你的PE檔案(多數是DLL吧)重建一份重定位表。我相信它有通用性,因為重定位指標是不可能不出現的(除非它不進行重定位),但未經怎麼測試,不知效果如何……放出來讓大家調戲它,看它是不是“阿茂整餅”^o^!歡迎批評指正,給出意見!

使用環境:OllyDbg1.10,OllyScript 0.92,OD執行平臺,重定位表沒有存在記憶體

使用說明:基本上我都把註釋寫清楚了,而且使用中文設計,沒理由你不明白,除非你根本不知重定位為什麼!不按要求輸入,造成指令碼無法使用不關我事。另外,ask命令的部分,你完全可以省去,將它下面的mov語句的$RESULT改為你對應的輸入值即可。如果重定位指標指令不只1處重定位,那麼此指令碼要修改了,我想這樣的可能性不大吧,因為要浪費程式碼空間!另外,本指令碼有比較多的出錯考慮,所以你如果熟悉重定位表實現過程,就可省省省……

*/

var P+
var VA
var RVA
var mRVA
var pRVA
var RAT
var SOB
var bPoint
var bound
var START
var SIZE
var ImageBase
var endaddr


ask "請輸入現在除錯程式的基址:"
cmp $RESULT,0
je non_error
mov ImageBase,$RESULT

ask "請輸入自定義重建重定位表起始地址:"  //可以是00空間地址,也可以是垃圾空間地址
cmp $RESULT,0
je non_error
mov START,$RESULT
mov P+,START
mov VA,P+

ask "請輸入設定檢測重定位表邊界地址:"
cmp $RESULT,0
je non_error
mov bound,$RESULT //設定重定位表在記憶體的邊界--大於起始地址,檢測是否超範圍(一般我們不知重建需要多少空間),我設計成結束後才檢測而不是實時,不然要死腦細胞-_-
cmp bound,START
jb enter_error
cmp bound,80000000
jae enter_error

ask "請輸入重定位指標的中斷指令地址:"
cmp $RESULT,0
je non_error
mov bPoint,$RESULT
bp bPoint  //upx殼是這麼一條指令:mov dword ds:[ebx],eax

ask "請輸入重定位處理結束的指令地址:"
cmp $RESULT,0
je non_error
mov endaddr,$RESULT
bp endaddr  //upx殼是 POPAD 指令

msgyn "你的輸入已經完成,現在繼續執行點按 'Y',否則點按 'N'?Y/N"
cmp $RESULT,0
jne pass
msg "指令碼已經暫停,點 Resume 繼續執行"
pause

pass:
eob break
eoe exception
run

break:
cmp endaddr,eip
je end
cmp bPoint,eip
je hRVA
jmp berror

hRVA:     //處理VA,SOB
mov mRVA,ebx    //☆☆☆映像區塊重定位指標地址,需手工設定,一般是暫存器,比如:upx殼是ebx☆☆☆
and mRVA,0FFFF000
sub mRVA,ImageBase  //計算VA塊RVA地址
cmp mRVA,[VA]    //是否還是同一VA塊
je hPoint
mov VA,P+
mov [VA],mRVA
add P+,4  //修正移動指標
mov SOB,P+
mov [SOB],8
add P+,4  //修正移動指標
jmp hPoint

hPoint:    //處理Point
mov pRVA,ebx //放入Point地址
and pRVA,0FFF //取低12位
add pRVA,3000 //定為:HIGLOW 型別,這裡沒有考慮設計 ASBSOULT 型別,俺覺得沒必要複雜化!
mov [P+],pRVA
add P+,2  //修正移動指標
add [SOB],2 //實時修正SIZEOfBlock
jmp pass

exception:
msg "指令碼發現不明的異常,指令碼安全至上現在結束任務!"
ret

enter_error:
msg "邊界地址小於起始地址或共享地址錯誤!"
ret

berror:
msg "指令碼發現不明的中斷,指令碼安全至上現在結束任務!"
ret

non_error:
msg "你沒有輸入任何地址,指令碼結束!"
ret

merror:
msg "檢測到超出指定的邊界範圍,或者你需要關閉OD重來!"
jmp count

end:
cob
coe
bc bPoint
bc endaddr
mov [P+],0  //RAT最後一個VA修0作為結束!
add P+,4  //修正移動指標
cmp P+,bound  //檢測邊界是否合格
ja merror

count:
mov SIZE,P+
sub SIZE,START  //計算RAT的大小
mov RVA,START
sub RVA,ImageBase
msg "重定位表寫結束!"
cmt eip,"具體資訊參看Log視窗!"
log "下面是本指令碼修復的重定位表資訊:"
log START
log ImageBase
log RVA
log SIZE
msgyn "你需要將重定位表另存為 C:\Reloc.bin 檔案嗎?Y/N"
cmp $RESULT,0
je exit
dm START,SIZE,"C:\Reloc.bin"

exit:
ret

相關文章