hotpatch

NyaRuRuさんのところを読んでいたら、2003server/Vistaではhotpatchが可能とのこと。(話題が二年遅れ)

要するに DLL のエクスポート関数の先頭を jmp 命令で書き換えてしまうという,古典的な方法の模様.
(snipped)
これを実現するには DLL のエクスポート関数の先頭が 2 byte 命令でないと厄介なため,コンパイラレベルで考慮してあげる必要があって,実際最近の Visual C++ にはこんなオプションが追加されています.

Hot-patching - NyaRuRuの日記

Microsoftが提供するhotfixが再起動不要になるというだけで、ユーザーが作成するDLLにも対応しているわけではないようだが、コンパイルオプション自体はVC2005からあるみたい。
/hotpatchを試してみたところ、アセンブリソースレベルでは関数の先頭に「npad 2」というパディングが追加されていた。ステップ実行してみたところ、命令としては「mov edi, edi」に置換されるようだ。
なぜ関数の先頭(short jumpを埋め込む場所)を2バイト命令にしないといけないかというと

you can safely overwrite the single 2-byte instruction with another 2-byte instruction without worrying if a different thread has its instruction pointer in the middle of the instruction.

CodeProject: API hooking for hotpatchable operating systems. Free source code and programming help

1バイト命令を2バイト命令で書き換えると、2バイト命令の2バイト目が命令として実行されてしまう可能性があるから。

なんか見覚えがあると思ったら、Linuxの話だけどカーネル読書会のlivepatchの回でやってた。
YLUG 第84回カーネル読書会 ランタイム・バイナリパッチャ(KAHO)の開発
関数先頭の2バイト+関数前の数バイトを確保しておくことで、上の話の安全確認が不要になっている。また、XP以前の場合はWindows APIだけで別プロセスのメモリの書き換えはできるので(Linuxのように)カーネルモードのプログラムを書く必要はない。ただしVistaとか64bit版だとできないかもしれない。