我試圖用一個JMP指令代替它的開頭,它應該導致我的函數掛鉤函數。但問題是我不知道如何計算JMP偏移量來定位我的函數的地址。那麼,如果你在內存中跳轉(目標地址 - 當前地址),我知道該怎麼做,但當你跳回內存時,我還沒有任何想法如何確定它。計算JMP指令的地址
有人可以幫忙嗎?
我試圖用一個JMP指令代替它的開頭,它應該導致我的函數掛鉤函數。但問題是我不知道如何計算JMP偏移量來定位我的函數的地址。那麼,如果你在內存中跳轉(目標地址 - 當前地址),我知道該怎麼做,但當你跳回內存時,我還沒有任何想法如何確定它。計算JMP指令的地址
有人可以幫忙嗎?
相對跳轉是帶符號的,也就是說,它們使用符號位有正負位移。絕對跳躍是絕對的,所以沒關係。請參閱英特爾指令指南的第2A卷& 2B。
這是你應該弄清楚的基本數學。 :)
如果JMP前鋒Destination - Origin
,那麼JMP
落後是Origin - Destination
想想純數字:如果你想JMP
着從100到110,你JMP
會110 - 100 = 10
。如果你想JMP
相同的數額落後,它將是100 - 110 = -10
。
只需使用負偏移向後跳。請注意0指令的大小。偏移量是相對於JMP
指令的結尾而不是開始。如果當前地址是要寫入JMP
的地址,那麼由於JMP
指令的大小加上5字節的偏移量,所以需要5 + dest電流。
偷偷摸摸
讓你的函數上方的位置僞呼叫
call location1
.location1
call location2
.location2
pop ax
ret
.yourfunction
你現在有LOCATION2的斧頭
地址添加3斧子,你有內存地址你的功能
不,不,我知道如何向前跳躍。問題是,我不知道如何計算和表示它在十六進制然後。例如,如果我想從地址1000跳到2000,它將是「E9 3E8」,但如果我想從地址2000躍遷到1000,它會是什麼?像「E9 FFFFFFFFFFFFFC18」這樣的可怕東西? – user972948
在代碼中做計算 –
十六進制也沒有什麼不同。將我的例子從'100'改爲'0x100'和將'110'改爲'0x110',數學是一樣的。 –