HotFixHook & 原理與實現(xiàn)(2)


作者?| 榴蓮
編輯?| 楌橪
?HotFixHook也可以稱為熱補丁,這種HOOK方法本質(zhì)上與InlineHook沒有什么區(qū)別,但是它的效率更高,之所以這樣,是因為HotFix的指令替換原理與Inline不同。InlineHook因為占用了函數(shù)頭至少5個字節(jié)的空間,所以這種方式是影響函數(shù)正常運行的,如果需要在HOOK函數(shù)中調(diào)用原有的執(zhí)行流程,那么就必須在調(diào)用原有流程之前卸載掉HOOK,也就是將被替換的字節(jié)碼還原。而當退出之前如果想要繼續(xù)接管這個函數(shù),那么又需要將HOOK代碼再次替換掉。那么一來二去,每次調(diào)用HOOK函數(shù)都需要摘一次掛一次HOOK,造成了很大的資源浪費,導致效率降低。而HotFix采取了另外的替換思路。例如說MessageBoxA原有的函數(shù)實現(xiàn)是下圖這樣的:

如果是InlineHook,那么就會直接替換5個字節(jié),變成下圖這樣:

而HotFixHook采取另外的思路,因為根據(jù)上面的第一張圖可以發(fā)現(xiàn),函數(shù)頭的位置是8BFF,也就是mov edi,edi,這種代碼本身在函數(shù)中并沒有起到任何作用,也就說,即使破壞了這句硬編碼,但是只要從函數(shù)地址加二的位置上開始執(zhí)行,依然不影響函數(shù)的正常功能,也因此,我們可以將這兩個字節(jié)替換成EB F9,也就是一個短跳指令,如下圖:

此時我們就可以在75E034CB的位置往下數(shù),此處地址距離函數(shù)頭正好有5個字節(jié)的空間,那么我們就可以將JMP ADDRESS的指令放到這5個字節(jié)里。完成流程劫持的目的,并且,如果我們需要調(diào)用原始函數(shù),只需要跳過短跳即可。修改完成后如下圖:

下面,我們采用MessageBoxA的Hook作為例子,實際體驗一下HotFixHook的實現(xiàn)方式。
首先,我們需要一個目標程序,代碼如下:

然后我們來看一下HOOK后的效果:
正常情況下:

HOOK后:

接下來,我們將使用代碼實現(xiàn)HotFixHook,我這里采用的操作系統(tǒng)是Windows 10 20H2(19042.1288),集成開發(fā)環(huán)境采用的是Visual Studio 2017。
??公眾號:極安御信安全研究院? ? ? ?閱讀全文(更多免費知識分享)