如果去反組譯 Windows API 的話, 會發現很多 API 的開頭都有一道看似無意義的指令
mov edi edi
例如反組譯 OpenProcess 這個 API
這是一個 2 bytes 的指令, windows 希望能讓 API 支援 hot patch, 也就是 inline hook.
所以在 API 的開頭插入這個指令
通常這類 API 的上方會發現 5 個 nop 指令
我們知道 2 bytes 可以放一個 X86 組合語言的 short jump
5 bytes 可以放一個 long jump
結合以上, 要對這類 API 做 inline hook 就很容易了
先把一個要跳到 hook 函式的 long jump 指令放到 API 上方 5 bytes 處
再用一個 short jump 蓋掉 mov 指令來跳到上方 5 bytes 處
用這種二段跳就可以完成 inline hook 了
而為什麼是用一個 mov 指令不是用兩個 nop 指令?
因為一道指令的速度比兩道指令快
Reference:
http://blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx
http://blogs.msdn.com/b/ishai/archive/2004/06/24/165143.aspx
沒有留言:
張貼留言