問題タブ [ptrace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - この ptrace エラーはなぜですか?
呼び出しでメモリの読み取りと書き込みをテストしているだけですptrace()
が、以下に示すコードを実行すると、このようなエラーが発生しました。
ご覧のとおり、readmem()
正常に動作しますが、その後readmem()
エラーが出力されます。
しかし、これは私を夢中にさせました — 関数なしでコードをテストしたとき (コードをインラインで記述しただけですmain()
)、このコード全体が正常に動作しました!
どうしてこうなったかわかる方いますか...?
c++ - ptrace でシステムコールが実行されないようにする方法
私は、信頼されていないユーザー コードをサンドボックス モードで実行する必要がある Ideone のようなシステムに取り組んでいます。
このために、私はptrace
最初の保護層の可能性を探してきました。ただし、いくつかの実験の後、次のように思われます。
- システム コールが呼び出される前にインターセプトし、入力引数を変更できます。
- 呼び出されたシステム コールをインターセプトして、戻り値を変更できます。
- ただし、呼び出しがまったく発生しないようにする方法はないようです (アプリケーション全体を強制終了する以外)。
特定のシステム コールを傍受し、呼び出しが実際に行われることなく、偽の結果コードを返したいと考えています。これを実装する方法はありますか?
memory-management - Ptraceとメモリの割り当て
私はしばらく遊んでいptrace
ます。私はこれまたはこれのようないくつかのチュートリアルに従いました。これまでのところ、ptrace
-d子プロセスがある場合、次のことができます。
- システムコールを検出し、レジスタを参照します。
PTRACE_PEEKDATA
のオプションのおかげで、レジスタが指すアドレスに含まれる文字列をフェッチしますptrace
。PTRACE_POKEDATA
のオプションを使用して、これらのレジスタの値を変更し、子プロセスのユーザースペースのメモリ値を変更しますptrace
。
open
私の問題は次のとおりです。たとえば、システムコールを検出したとしましょう。ebxレジスタに格納されているアドレスのおかげで、開くファイルのファイル名を変更できます。ただし、ファイル名を任意のサイズに変更できるのではないかと思います。変更する名前が非常に大きい場合(たとえば、元のファイル名の長さの50倍)、書き込むべきではないメモリをいじっていませんか?子供のメモリ空間にメモリを「割り当てる」必要がありますか?もしそうなら、これはどのように行われますか?
子プロセスはで実行されるプログラムであることに注意してくださいexecve
。そのソースコードにアクセスできません。
c++ - マルチスレッドアプリケーションからのptraceの使用
ptrace
プログラムによって生成されたプログラムがどのシステムコールを呼び出すかを確認するために使用したいと思います。以前の質問への回答で説明されていたので、このチュートリアルから始めました。使用しているプラットフォーム(SLES 11 64ビット)にコードを適合させてコードを変更し、生成されたプロセスが行うすべてのシステムコールを出力する次のテストコードをまとめました。
これは非常にうまく機能します。プログラムによって行われたシステムコールのIDを出力します(実際には、それぞれを2回出力します。1回は開始時、もう1回は終了時ですが、今は問題ではありません)。ただし、私のプログラムはシステムコールのチェック以外のことを行う必要があるため、チェックを別のスレッドに移動することにしました(CよりもC ++の方が快適なので、C ++の方法で行いましたが、それは重要だとは思わないでください)。もちろん、この最初のプログラムでは、スレッドを開始してから参加するだけです。
今回はエラーメッセージが表示されます。
どうしてこれなの?答えを探してみましたが、こんなものは見つかりませんでした。子プロセスによって開始されたスレッドをトレースしないことがわかりましたptrace
が、それは後で処理する必要がある別のことです。別のセラドから子プロセスをチェックすることさえ可能ですか?
もう1つの奇妙なことは、実際のアプリケーションでは基本的に同じことを実行し(ただし、クラス、ミューテックスなど、はるかに複雑なコンテキストから)、異なる種類のエラーが発生することです。ptrace
エラーで戻る代わりにwait
、子プロセスのシステムコールに対しても戻りません(そして子プロセスは停止しません)。一方、wait
子プロセスが終了すると、期待どおりに機能します。
linux - システムコールの動作を変更するために ptrace(2) を使用する方法は?
ptrace
他のプロセスの実行に影響を与えるために使用するガイドや例 (特に ARM のもの) またはライブラリはありますか? たとえば、あるデータがファイル ディスクリプタに表示されていると信じ込ませるには (つまり、select/poll をリリースして何らかの結果を出し、カーネルの前で次の read syscall に「応答」します)。PTRACE_SYSEMU に関連する何かが予想されます。
ポータブルな方法で行うことはできますか?libc-overriding LD_PRELOAD トリックのようなものが必要ですが、実行時にアタッチできます。
いくつかの gdb コマンドで実行できますか?
LD_PRELOAD を使用して実行する場合のように、syscall に簡単かつ移植可能にフックして、実際の呼び出しが行われる前または後に編集 (またはエミュレート) できるライブラリがあれば、理想的なバリアントになります。
c++ - プロセスとすべての fork プロセスの syscall のトレース
ptrace
プロセスのシステムコールを追跡するために使用しています。プロセスをフォークした後、プロセスのPTRACE_TRACEME
トレースを開始するために使用します。コードは次のようになります。
次にhandleTrace
、次のような関数があります。
これで問題ありませんが、プログラムが分岐する (または新しいスレッドを作成する) 場合は、トレース対象のプロセスが作成する子プロセス (およびプロセスによって作成されるスレッド) もトレースしたいと考えています。PTRACE_O_TRACEFORK
、 、PTRACE_O_TRACEVFORK
およびを使用して実行できることは知っていますがPTRACE_O_TRACECLONE
、man
ドキュメントから、それがどのように正確に実行されるかを理解するのは非常に困難です。これについていくつかの例が必要です。
編集:
ここで同様の質問を見つけました:マルチスレッドアプリケーションをptraceする方法は? 以下のコードで試してみました。このコードは、開始されたプロセスのシステム コールを追跡し、フォークされたプロセスも追跡することになっています。fork()
親プロセスでa の後に実行されます (子は aPTRACE_TRACEME
および an を呼び出しますexec()
)。
編集2:
コードにさらにいくつかの変更を加え、さらに進歩しました。
CHECK_ERROR_VALUE
結果コードをチェックし、その中に記述された例外をスローする単なるマクロですerrno
。
どうやら、フォーク/クローンのイベントを取得すると、新しいプロセスはまだ存在せず、ptrace しようとすると「プロセスが存在しません」というエラー メッセージが表示されます。新しいプロセスを ptrace しようとする前にスリープ状態にすると、エラー メッセージは表示されません。プログラムが fork/clone のポイントに到達すると、新しいプロセスのトレースが開始されますが、親プロセスの syscall の戻りポイントには到達しませんclone()
。つまり、子は正常に終了しますが、親はその分岐点。
c - ptraceを使用したメモリデバッガ
既存のツールをメモリデバッガの機能(リーク検出のみ)で拡張したいと思います。
一部のメモリデバッガーは、malloc / freeを置き換え、解放されるのを保留しているものと、誰がそれを割り当てたかを追跡することで機能することを知っています。または、ある種の仮想マシンでプロセスを実行し、メモリアクセスを監視します。
たとえば、dmallocptrace()
を使用して再構築し、別のプロセスで割り当てを監視する代わりに、malloc/freeにブレークポイントを設定するために使用することが理にかなっているのかどうかを知りたいです。遅すぎるでしょうか?他のツールはこのように機能しますか?
python - LinuxのPythonでプロセスのメモリを読み取るにはどうすればよいですか?
pythonとpythonptraceを使用して、外部プロセスのメモリを読み取ろうとしています。私は完全にPythonで作業する必要があり、Linuxでプロセスのメモリを読み取って印刷しようとしています。
たとえば、次のコードを試しましたが、IOエラーが発生し続けます。
ほとんどの場合、プロセスのメモリを繰り返しダンプして、時間の経過とともに変化を探したいだけです。これがこれを行う正しい方法である場合、私の問題は何ですか?または、これを行うためのより適切な方法はありますか?
c++ - ptrace使用時のmmapの戻り値
ptrace の使い方を学んでいたところ、奇妙な問題に直面しました。
私はプログラムを書きました:
間違ったパラメーターで mmap syscall を実行するだけです。次に、戻り値 (これもバイナリ) と errno を出力します。
ここに、このプログラムを実行した後の出力があります。
そして、私はstraceでそれを実行します:
そして strace は、この間違った mmap がエラー ENOMEM で -1 を返すことを示しています。
今まではすべて問題ありません。
ここで、ptrace を使用した私のコード (実際には必要のないものはすべてカットしました):
子が出力するものと同じものを出力する必要があります-mmap2 syscallsの値を再実行します。
しかし、ここに出力があります:
mmap が -12 を返すのはなぜですか? 戻り値を間違ってキャプチャしていませんか?