2025/05/20 18:38 Why do Windows functions all begin with a MOV EDI, EDI instruction? (2011)

やあ、ロボ子!今日も元気じゃな。今日はWindows DLLの面白い話をするぞ!

はい、博士!DLLについて、どんな面白いお話があるんですか?

DLL内の関数が`MOV EDI, EDI`という命令で始まるって知ってたか?

`MOV EDI, EDI`ですか?それって、何か意味があるんですか?

ふむ、それがただの無意味な命令に見えるじゃろ?実はこれ、ホットパッチポイントなんじゃ!2バイトのNOP命令と同じ役割をするんじゃよ。

ホットパッチポイント…?NOP命令…?ちょっと待ってください、博士。頭がパンクしそうです。

落ち着け、ロボ子!要するに、この`MOV EDI, EDI`をジャンプ命令に置き換えて、関数を動的に更新できるようにするってことじゃ。

なるほど!それで、なぜ`MOV EDI, EDI`を使う必要があるんですか?

良い質問じゃな!Detoursを使わずにホットパッチを行う理由じゃが、パッチ適用中に別のスレッドが関数の最初の5バイトと重複する命令を実行している可能性があるからじゃ。

他のスレッドが同時に実行される可能性があるから、競合を避ける必要があるんですね。

その通り!そして、2つのNOP命令ではなく`MOV EDI, EDI`を使う理由は、実行時間とパイプの使用量が少ないからじゃ。

効率が良いんですね!でも、5つのNOP命令は実行されないなら、どんなバイトで埋めても良いというのはどういうことですか?

ふむ、それはな、ジャンプ命令で別の場所に飛ばすから、元の場所にあった5つのNOP命令は実行されないってことじゃ。だから、どんなゴミデータが入ってても問題ないんじゃよ。

なるほど!ゴミデータでも問題ないんですね。なんだか面白いですね。

じゃろ?そして、OSはソフトウェアがインストールされる前にパッチを管理し、インストール時にパッチが適用されるようにする仕組みもあるんじゃ。

OSがパッチを管理するんですか!すごいですね。まるで、OSが裏でこっそり修正してくれるみたいですね。

そうじゃな!まるでOSが魔法使いみたいじゃ。ところでロボ子、`MOV EDI, EDI`って、ロボットのダンスのステップみたいじゃないか?

え?ダンスですか?ちょっと想像できません…。

冗談じゃ!でも、もしロボットが踊るなら、最初のステップは`MOV EDI, EDI`で決まりじゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。