4

私は現在デバッガーを研究しています。デバッガーにはソフトウェアブレークポイントがあることを読みました(明らかに、これらは最も一般的に使用されるブレークポイントです)。これらは、オペコードの最初のバイトをInt 3(opcode 0xcc)に置き換えることで機能します。

プログラムのテキスト(/ code)セグメントが読み取り専用であることを読みました(このセグメントを読み取る必要がない場合は、コードを停止して独自の命令を変更し、コードを自己変更します)。私の質問は、読み取り専用の場合、デバッガーが命令をどのように変更できるかということです。私はここで何かが欠けていますか?これに関するコメントまたはこれに関する理論へのポインタをいただければ幸いです。

ありがとう。

4

1 に答える 1

2

Windowsデスクトップおよびサーバープラットフォームでは、kernel32.dllによってエクスポートされたVirtualProtect関数を使用してメモリページ保護を変更できます。したがって、たとえば、デバッガーがあるアドレスに0xccを書き込みたいが、そのアドレスが読み取り専用とマークされたページにある場合、デバッガーはそのページの保護を読み取り/書き込みに設定して(十分な特権があると仮定して)、書き込みを行うことができます。価値。

これを行うことの副作用は、メモリのそのページに対してコピーオンライト(COW)障害が発生し、デバッグ対象プロセスがページの独自の物理コピーを持つようになることです。これにより、その物理ページを共有していたすべてのプロセスでブレークポイントが設定されるのを防ぎます。

于 2012-12-07T14:47:10.193 に答える