2013年11月20日 星期三

Windows API mov instruction for hot patch

如果去反組譯 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

沒有留言:

張貼留言