x86 命令を使用していますが、x86 レジスタ (EIP、ESP など) が格納されている場所について混乱しています。
たとえば、ollydbg を使用すると、実際の EIP レジスタ値とその変化を確認できました。
それらがメモリに保存されている場合、実際の場所はどこですか? (たとえば、.data .text または .bss 内)
また、別のプロセスの EIP を手動で変更できますか? どのように?
x86 命令を使用していますが、x86 レジスタ (EIP、ESP など) が格納されている場所について混乱しています。
たとえば、ollydbg を使用すると、実際の EIP レジスタ値とその変化を確認できました。
それらがメモリに保存されている場合、実際の場所はどこですか? (たとえば、.data .text または .bss 内)
また、別のプロセスの EIP を手動で変更できますか? どのように?
あなたはレジスターとは何かについて深刻な誤解をしています。
レジスタは実際にはレジスタです。オペランドを格納したり、CPU 命令のターゲットにすることができるプロセッサ内の非常に小さなメモリ。メモリ内にアドレスはありません。実際にはレジスタとしてアドレス指定可能です。
RAM はまったく別のものです。x86 プログラムは RAM がなくても完全に動作しますが、レジスタで動作しない操作はありません。たとえば、RAM のどこかにある 2 つの数値を加算するには、LOAD 命令を使用してこれら 2 つの数値を 2 つのレジスタにロードし、ADD 命令を使用して一方の数値をもう一方の数値に加算し、レジスタをターゲットにします。レジスタ値を取得し、RAM のあるアドレスに書き込みます。
したがって、「プロセス固有」のレジスタはありません。すべての CPU コアには正確に 1 セットのレジスタがあり (仮想化に関係なく、いくつかの専門分野があります)、レジスタを RAM に保存し、たとえば関数を呼び出したりコンテキストを切り替えたりするときに RAM から復元するメカニズムがあります。
レジスタは、プロセス自体のメモリではなく、レジスタに格納されます。
デバッガーは、OS によって提供される特別なインターフェイスを使用して、EIP を含む実行中のプロセスのレジスターを変更します。Linux では、それはptrace(2)
APIです。
プロセスの外部からプロセスのレジスタを変更できることは、OS がコンテキスト スイッチのためにプロセスのアーキテクチャ状態をメモリに保存する方法に関連しています。