0

特定のアドレスのコードが実行されたときに、コードに表示せずに例外を発生させたいと思います。

ハードウェアブレークポイントを使用する可能性があることは知っていますが、誰かがそれらを使用するデバッガーを接続すると、これらは削除され、欠落しているかどうかを検出して置き換える方法がありません。他にどのようなオプションがありますか?

速度が問題です。つまり、PAGE_GUARDシングルステッピングを実行できません。ユーザーは遅れて死ぬでしょう。

私はWindowsを使用しており、C++を使用したVC2012を使用しています。

4

1 に答える 1

1

例外処理にコストがかかりすぎる場合、他の唯一の解決策は、CPUが行うようにコードをエミュレートすることです。

ただし、いくつかの注意点があります。

  • たくさんの命令があり、それらを正しくデコードしてエミュレートすることは大きな仕事です。エミュレーションと実行を切り替えると、余分なCPUサイクルが発生します。
  • すべてをエミュレートすることはできず、そのため、「プレイグラウンド/サンドボックス」でいくつかの命令(FPU / MMX / SSE命令など)を実行する必要があります。
  • システムコールを適切に処理するには、実際にCPUの状態を準備して実行し、エミュレータに戻る必要があります。ここでは、おそらくその場でコードを生成する必要があります。
  • エミュレートされたコードがCPU例外を引き起こし、SEHを使用してそれらを処理する場合(または、C ++例外をCPU例外としてスローし、キャッチします。これもSEHを介して)、スタックの巻き戻しが外部(エミュレーター)で機能しないため、コードが破損する可能性が非常に高くなります。スタック。
  • マルチスレッドコードでは、特にマルチプロセッサシステムでは、事態が複雑になります。スレッドの作成/破棄をキャッチし、エミュレータの個々のインスタンスを作成/破棄し、スレッド間のメモリ共有を処理し、エミュレート/実行された命令のアトミック性を処理する必要があります。
  • 私が考えるのを忘れたものは何でも。
  • それでも動作が遅すぎるか、まったく動作しない可能性があります。

もう1つの、おそらくより実用的なオプションは、目的のアドレスで実行可能ファイルにパッチを適用し、実行をコードに(jmp命令を使用して)迂回させ、そこで必要なことをすべて実行してから戻ることです。すべてのコンテキストの保存/復元に注意を払い、jmpその上に書かれた指示によって破損した指示をエミュレートする必要があります。ここにも注意点があります。これらの上書きされた命令は、コードの他の場所からジャンプする可能性があります。途中でジャンプしないようにアドレスを選択するか、jmp何らかの方法でアドレスを処理する必要があります(まだどのようになっているかはわかりません)。

于 2013-02-03T05:57:18.360 に答える