3

mprotect ハンドラ内の現在のプログラム カウンタ(PC)の値を取得したい。そこから、プログラムがいくつかの命令をスキップするように、PC の値を「n」個の命令で増やしたいと考えています。Linux カーネル バージョン 3.0.1 に対してすべてを実行したいと考えています。PC の値を取得できるデータ構造と、その値を更新する方法について何か助けはありますか? サンプルコードをいただければ幸いです。前もって感謝します。

私の考えは、メモリアドレスが書き込まれているときに何らかのタスクを使用することです。したがって、私の考えは、 mprotect を使用してアドレスを書き込み禁止にすることです。コードがそのメモリ アドレスに何かを書き込もうとすると、mprotect ハンドラを使用して何らかの操作を実行します。ハンドラーの世話をした後、書き込み操作を成功させたいと思います。したがって、私の考えは、メモリアドレスをハンドラー内で保護されないようにしてから、書き込み操作を再度実行することでした。コードがハンドラー関数から戻ると、PC は元の書き込み命令を指しますが、私は次の命令を指すようにしたいと考えています。したがって、命令の長さに関係なく、PCを1命令増やしたいと思います。

以下の流れを確認

MprotectHandler(){
    unprotect the memory address on which protection fault arised
    write it again
    set PC to the next instruction of original write instruction
}

メイン関数内:

main(){
    mprotect a memory address
    try to write the mprotected address // original write instruction
    Other instruction    // after mprotect handler execution, PC should point here
}
4

2 に答える 2