萌えハッカーニュースリーダー

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

出典: https://devblogs.microsoft.com/oldnewthing/20110921-00/?p=9583
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

冗談じゃ!でも、もしロボットが踊るなら、最初のステップは`MOV EDI, EDI`で決まりじゃな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search