2011-09-30 65 views
2

我試圖用一個JMP指令代替它的開頭,它應該導致我的函數掛鉤函數。但問題是我不知道如何計算JMP偏移量來定位我的函數的地址。那麼,如果你在內存中跳轉(目標地址 - 當前地址),我知道該怎麼做,但當你跳回內存時,我還沒有任何想法如何確定它。計算JMP指令的地址

有人可以幫忙嗎?

回答

1

相對跳轉是帶符號的,也就是說,它們使用符號位有正負位移。絕對跳躍是絕對的,所以沒關係。請參閱英特爾指令指南的第2A卷& 2B。

3

這是你應該弄清楚的基本數學。 :)

如果JMP前鋒Destination - Origin,那麼JMP落後是Origin - Destination

想想純數字:如果你想JMP着從100到110,你JMP110 - 100 = 10。如果你想JMP相同的數額落後,它將是100 - 110 = -10

+0

不,不,我知道如何向前跳躍。問題是,我不知道如何計算和表示它在十六進制然後。例如,如果我想從地址1000跳到2000,它將是「E9 3E8」,但如果我想從地址2000躍遷到1000,它會是什麼?像「E9 FFFFFFFFFFFFFC18」這樣的可怕東西? – user972948

+0

在代碼中做計算 –

+3

十六進制也沒有什麼不同。將我的例子從'100'改爲'0x100'和將'110'改爲'0x110',數學是一樣的。 –

5

只需使用負偏移向後跳。請注意0​​指令的大小。偏移量是相對於JMP指令的結尾而不是開始。如果當前地址是要寫入JMP的地址,那麼由於JMP指令的大小加上5字節的偏移量,所以需要5 + dest電流。

-4

偷偷摸摸

讓你的函數上方的位置僞呼叫

call location1 


.location1 
call location2 
.location2 
pop ax 
ret 
.yourfunction 

你現在有LOCATION2的斧頭

地址添加3斧子,你有內存地址你的功能