問題タブ [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.
linux - ptrace 経由で挿入した sendmsg() 呼び出しが機能しないのはなぜですか?
私が所有するプロセスにコマンドを挿入しようとしています。具体的には、現在、ptrace プロセスのファイル記述子を ptracing プロセスに渡そうとしています。UNIXドメインソケットの作成に成功し、(私が見る限り)次のように接続しました:
ただし、実際には、 thisの変更された形式である次のコードを使用してファイル記述子を送信すると、機能しますが、失敗します。
sendmsg()
常に失敗し-1
ます。それで、私の質問は、なぜこれがうまくいかないのか、少なくともエラーについての手がかりを得るためにエラー番号を見つける方法を教えてくれる人はいますか? エラー番号を見つけるためにこれを試しましたが、PTRACE_PEEKDATA
常に失敗します:
linux - システムコールで停止したときに正しいorig_eax値を取得する方法は?
プロセスコール(nanosleep()など)にあるときに、ptrace(PTRACE_ATTACH ...)を使用してプロセスに接続しています。PTRACE_GETREGSを使用してレジスタの内容を取得できます。eipは予想される場所(__kernel_vsyscall内)にあります。ただし、eaxおよびorig_eaxレジスタには予期しない内容が含まれています。eaxには通常-516が含まれ、orig_eaxは通常0です。
これは私が使用したテストプログラムです(http://www.linuxjournal.com/article/6210から取得し、わずかに変更しました):
別の端末で実行されている「sleep10000」コマンドに接続する場合の出力:
eaxの値はどういう意味ですか?orig_eaxに元のシステムコール番号(162など)が含まれていないのはなぜですか?この場合、実際にシステムコール番号を取得するにはどうすればよいですか?
また、gdbが「print $ orig_eax」に対して「162」を正しく表示するのはなぜですか?
ところで。これは、カーネル3.2.0を使用するUbuntu12.04にあります。
- uname -a: "Linux edgebox 3.2.0-24-generic-pae#37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686 athlon i386 GNU / Linux"
- / proc / cpuinfo:「AMDAthlon(tm)IINeoK345デュアルコアプロセッサ」
- ファイル
which sleep
: "/ bin / sleep:ELF 32ビットLSB実行可能ファイル、Intel 80386、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24、BuildID [sha1] = 0x0965431bde4d183eaa2fa3e3989098ce46b92129、削除済み"。
つまり、これは32ビットPAEカーネルと64ビットCPUへの32ビットUbuntuインストールです。
linux - リクエストPTRACE_POKETEXTを使用したptraceが失敗する
トレースされたプロセスでコードを挿入しようとしています...レジスター(PTRACE_GETREGS
)を正しく読み取ることができ、動作しPTRACE_PEEKTEXT
ます...GDBで検証しました。ただし、リクエストを使用して呼び出すptrace
と返されますが、同じアドレスで再度読み取ると、予期されたバイトが見つかりません。PTRACE_POKETEXT
0
1つ目print_word
は、GDBによって表示される4バイトを正確に出力します。2番目print_word
は、代わりに、ではなく奇妙なバイトを出力します0xAABBCCDD
。
何か案は?
debugging - utrace プロジェクトは終了していますか?
この回答でアドバイスされているように、ユーザー空間の実行可能ファイルをトレースするために stap を使用しようとしていました: https://stackoverflow.com/a/324709/368507
これを行うには、カーネルに utrace パッチが必要ですが、最近のカーネル用の utrace パッチが見つかりません。
メーリング リストは閉鎖され、公式サイトの多くのリンクは壊れています。
誰かがこのプロジェクトがどこに行くのか知っていますか? それは死んでいますか?これは、最近のカーネルで実行可能ファイルをトレースするために stap を使用できなくなったことを意味しますか?
ありがとう
ptrace - PTRACE_SETREGS を使用してプロセスの実行順序を変更することはできますか?
PTRACE_SETREGS を使用してプロセスの実行順序を変更することはできますか? プロセス実行の時点でプロセス レジスタ ファイルを保存していますが、後でそれを使用してプロセスの現在のレジスタ ファイルを設定したいと考えています (この時点で再度実行を繰り返すため)。以下は私が使用しようとしているコードですが、動作しません。誰かが私にそれの何が悪いのか、またはptraceについて私が誤解していることを説明できますか?
c - C および execve(3) 引数
strace(1)
基本的に を使用するのと同じことを行うプロジェクトに取り組んでいptrace()
ます。基本的に、実行可能ファイルを引数として受け取り、実行可能ファイルによって行われたシステム コールを出力する controller.c プログラムがあります (たとえば、% controller ls -l
) を使用しexecve()
て実行可能ファイルを実行していますが、少し問題があります。execve は次の引数を取ります
このインスタンスの filename は で"ls"
ありargv[]
、指定されたファイル名の引数のリストです。したがって、次のようなものがあります(Cファイル内)
実行可能ファイルを取得した場合、たとえばcontroller ls -l
、where argv[0] = "controller"
、argv[1] = "ls"
およびargv[2] = "-l"
の場合、「ARGUMENT LIST」で正しいパラメーターを渡すにはどうすればよいでしょうか (この場合の引数は単なる"-l"
ものですが、それ以上になる可能性もあります)。
const char *
基本的に、配列が実行可能ファイルの引数値を持つような型の配列を初期化するにはどうすればよいでしょうか? argv
配列に余分な値があり、 ARGUMENT LIST の直前にあることを心配する必要さえありますか?
ご協力いただきありがとうございます!
linux - フォーク後の Linux ユーザー空間 ELF ローダーの非常に奇妙な動作
次のコードを考えてみましょう (公共の要求によりコンパイルするために再訪しました:):
a.out プログラムは単純な main() { return 0; です。プログラム。
このコードをコンパイルして実行すると、子プロセスが、親のfopen("log") 呼び出しによって開かれたファイルを mmap() しようとしたことがわかります。これは、失敗したアサーションによってわかります。
さらに調査したところ、これは子プロセスのロード中に発生することがわかりました。
これは 2 つの理由で奇妙です。
- fork() の後に発生したため、子供は fopen() 呼び出しにまったく気付かないはずです
- ローダーがこのファイルを mmap しようとするのはなぜですか? 実行可能ファイルでさえありません。
私は glibc で dl-load.c を見回しましたが、この種の動作を引き起こすものは何も見当たりませんでした。
何か案は?
ありがとう
xcode - vm_read と vm_write を使用した OS X 10.8.2 でのメモリの読み取り/書き込み
これは、Xcode (バージョン 4.5) でのみ動作する私のコードです。
私はptraceなども試していました。これが、他のライブラリも含めている理由です。
最初の問題は、これが Xcode でのみ機能することです。デバッガーで変数 (この場合は ) の位置 (メモリ アドレス) を見つけることができるためtest
、文字列を変更しvalue
て新しい値をコピーします。test
オンtest1
。
私は実際に vm_write がどのように機能するか (完全ではありません) を理解していませんtask_for_pid()
.そしてそれは動作します(Xcodeのみ)。
他のプロセスでそれを行うにはどうすればよいですか? 位置を読み取る必要があります (「何か」のアドレスを見つけるにはどうすればよいですか?)、これが最初の目標です。
linux - linux ptrace()は関数情報を取得します
ptrace()呼び出しを使用して、ユーザー定義関数から情報を取得したい。
ただし、関数アドレスは安定していません(ASLRのため)。
プログラムでgdbのような別のプログラムの関数情報を取得するにはどうすればよいですか?