1

當我用jmp操作碼覆蓋函數的第一個操作碼時,實際上我寫了5個字節(或jmp短爲2)。 但是如果另一個線程(來自同一個進程)在我改變它的時候會調用這個函數呢? 這將導致意外的行爲。 但我沒有找到任何解釋。鉤的物品igonre它,就像沒有問題。hooking,dll注入和線程安全

也許在win32api你使用mov edi,edi。但我的問題更具理論性

謝謝

回答

1

這很可能會導致問題。您可以在要更改的代碼上創建關鍵部分,並輸入關鍵部分以確保在更改代碼時進行獨佔訪問。

在相互訪問的情況下,正在執行的線程可以(理論上)看到第一個字節,然後繼續在接下來的4個字節(在長跳轉的情況下)執行跳轉。在調用的情況下,下一條指令(IP)在跳轉之前被推送,即當前爲5.理論上,ret可能導致該線程運行到未修改的指令中(例如,您可能需要一個nop) 。

這是全部的理論,但是你應該在改變代碼時避免互相訪問。

+0

關鍵部分不會幫助,因爲只有您的代碼將使用它。當你的線程擁有關鍵部分時,不屬於你的線程將簡單地執行指令。 –

1

如果您注入特定進程,您可以暫停進程,安裝所有鉤子並在此之後繼續。

+0

不是100%,因爲一個線程可能會在執行鉤子覆蓋的指令的中間時暫停。 –

+2

也許你可以在更改代碼之前用GetThreadContext檢查特定線程的eip – defragger

+0

這應該使它成爲100%。我猜如果任何線程的eip都存在,那麼代碼可以等到所有線程都沒有eip,然後覆蓋指令。 –