2011-03-30 75 views
1

我正在研究FastMM的代碼,它在運行時更改方法和函數的地址。但我不明白一些事情。FastCode:研究其代碼

http://koders.com/delphi/fid356C72C9C454FA74A916971690F624B0FF9111E5.aspx?s=pos

我的疑問是第47行: 「如果PBYTE(AStub)^ = $ E8則」 爲什麼這種比較?好的,檢查它是否被分配。我錯了嗎 ?但爲什麼$ E8(232)? 如果它總是相同的值,不會總是相同的結果?

其餘的代碼在我心中「確定」。但是,如果有人能解釋所有這一切,我感謝。

tks in advice。

回答

7

該代碼返回CALL指令的目標地址。測試只是爲了檢查它是否是一個已經傳遞給例程的CALL指令。這不是簡單的證明,因爲你可以傳遞指令中間的地址,甚至可以傳遞非代碼的地址。

所以,如果函數調用正確,測試應該總是成功。

這兩個例程大概是串聯使用的。首先你得到CALL指令的地址,然後該站點的代碼被JMP($ E9)代替。

+0

爲了進一步澄清,它正在查看AStub中第一個字節的**內容**,而不是AStub的**地址**(請注意解引用運算符'^'),以查看它是否爲CALL指令。 – 2011-03-30 17:04:30

+0

匈牙利....我發現http://faydoc.tripod.com/cpu/call.htm看看電話,真正的操作碼是E8。 :D有趣,我有更多的問題,我很快會問。 – 2011-03-30 17:48:56

+0

@SaCi完全如我所說。這個代碼是關於用自修改代碼替換另一個函數的。通過解碼CALL($ E8)旁邊的相對地址,FastcodeGetAddress可用於要更改的代碼。然後FastcodeAddressPatch找到該代碼,即CALL的目標,並將其更改爲JMP($ E9)以實現新實現。 – 2011-03-30 17:55:06