熱補丁原理

2021-10-22 05:50:24 字數 485 閱讀 7838

熱補丁

普通**修改技術是修改api起始位址的5個位元組, 而熱補丁是修改7個位元組.

相比**修改的api鉤取, 採用熱補丁能提高多執行緒系統的穩定性和效能.

二次跳轉

api起始位址7個位元組是5個nop和2個位元組的mov edi, edi沒有實際意義, 是設計時專門留給打熱補丁用的7位元組.熱補丁實現時就是利用這7個位元組, 在push ebp指令上方是乙個短跳轉指令(2位元組), 用來跳轉到就在該指令上方的遠跳轉指令(5位元組), 遠跳轉指令才是跳到鉤取函式起始位址. 這就是二次跳轉.

不需要鉤取函式進行脫鉤/掛鉤操作

因為修改的指令都是在無意義位元組, 所以呼叫原api時從[api起始位址 + 2]呼叫可以直接得到原函式. 不需要額外進行掛鉤/脫鉤操作. 多執行緒環境下, 如果乙個執行緒修改了api(掛鉤)還沒修改回來(脫鉤), 其他執行緒有需要呼叫這個api, 就會發生記憶體異常錯誤. 所以熱補丁技術可以提高系統穩定性, 同時因為不用經常執行脫鉤/掛鉤操作, 效能也能提公升.

Linux熱補丁的實現

如果要修改乙個已經編譯完成的可執行檔案中某個函式的執行流程,有2種方式 這裡討論第2種方式,即熱補丁 hotpatch 下面分別介紹下這2種方式的實現。先在可執行檔案中找到儲存函式的的位址prelocate 在程式的relocation section 儲存原始函式的位址poriginal 即 pr...

安卓App熱補丁動態修復原理分析

2.解決原理 public class findclass string name return null 乙個classloader可以包含多個dex檔案,每個dex檔案是乙個element,多個dex檔案排列成乙個有序的陣列dexelements,當找類的時候,會按順序遍歷dex檔案,然後從當前...

熱補丁hook解決多執行緒下inline hook

一次面試的問題 inline hook時如何穩定hook多執行緒下的四個位元組的函式?因為普通inline hook是覆蓋五個位元組長度,所以函式位址長度不夠。這種情況下可以採用熱補丁hook。比如隨便進入乙個loadlibrarya函式 可以看到函式前有五個位元組的nop 算上函式第一行的mov ...