在內核中,如果要hook某個函數,只要把函數開頭的5個字節替換成call/jmp指令.
步驟
1. 保存orig 函數的前5個字節指令.
2.定義一個stub函數,用於跳轉回orig函數.
3.在新函數中,調用stub函數.
具體實現
給函數插入指令
掃描函數所有的指令序列
校準針對函數外部的相對尋址的指令(call/jmp),使其操作數減去函數搬移的偏移值
offset = function_A - stub_B + offset
注意事項:
1. 如果不使用text_poke接口,需要手動對ip_rcv的內存進行重新映射,讓內存變爲可寫,或者直接禁止CR0寫保護
2. stub函數和orig function需要在2G範圍內。
3.如果時給內核函數插入指令,需要校準相對偏移
校準針對函數外部的相對尋址的指令(call/jmp),使其操作數減去函數搬移的偏移值
offset_B = function_A - stub_B + offset_A