ptrace
Linux から Solaris に使用するプログラムを移植しようとしていますが、うまくいきsys/ptrace.h
ません。それを移植する方法はありますか?
3 に答える
少なくとも私がアクセスできるsolarisシステムでman ptrace
は、含めるように言っています
#include <unistd.h>
#include <sys/types.h>
ptrace プロトタイプと定数にアクセスするため。ただし、ptrace は 32 ビットの libc でのみ使用可能であり、64 ビットのクライアントは代わりに /proc デバッグ インターフェイスを使用する必要があることを示す使用上の注意があるため、これがどこまで役立つかはわかりません。
Solaris などの一部では、システム コールとしての ptrace を完全に削除し、プラットフォームの procfs に関して ptrace への呼び出しを再解釈するライブラリ コールとして保持しています。
http://en.wikipedia.org/wiki/Ptrace
また、strace
ユーティリティはSolarisでは利用できないようです。代わりに、と呼ばれるものがありtruss
ます。システムにそれがあるかどうかを確認してください。
編集:私に連絡する方法とコードをライセンスする方法に関する古い情報を追加および削除しました
私は/proc/<pid>/ctrl
、他のさまざまなインターフェイスを使用して、同様のこと/proc/<pid>
を行うための独自のライブラリを作成することになりましptrace()
た。残念ながら、そのインターフェースは(少なくとも当時は)直接使用するのは安全ではなく、いつでも変更できるなどとマークされていましたが、実際には安定しているように見えました。その後変更されたかどうかはわかりませんが、これは2011年頃だったと思います...
基本的な ptrace と同等の機能を開発するには、以下から始めます。
man 4 proc
インターフェイスを使用する/proc/<pid>/ctrl
と、メモリ/レジスタの読み取り/書き込み、アタッチ/デタッチ、syscall ブレークポイントの設定など、ptrace でできることよりもほぼすべて (およびそれ以上) を実行できます。独自の ptrace エミュレーション API。以下は、私が作成した API の低レベル部分のプロトタイプです。
procfs_ctl_PCSFAULT (pid_t pid, fltset_t * fltset);
procfs_ctl_PCWATCH (pid_t pid, prwatch_t * prwatch);
procfs_ctl_PCSTRACE (pid_t pid, sigset_t * sigset);
procfs_ctl_PCSEXIT (pid_t pid, sysset_t * sysset);
procfs_ctl_PCSENTRY (pid_t pid, sysset_t * sysset);
procfs_ctl_PCWSTOP (pid_t pid);
procfs_ctl_PCSVADDR (pid_t pid, long vaddr);
procfs_ctl_PCSTOP (pid_t pid);
procfs_ctl_PCWRITE (pid_t pid, off_t off, void *buff, size_t count);
procfs_ctl_PCTWSTOP (pid_t pid, long delay);
procfs_ctl_PCSCRED (pid_t pid, prcred_t * cred);
procfs_ctl_PCREAD (pid_t pid, off_t off, void *buff, size_t count);
procfs_ctl_PCSSIG (pid_t pid);
procfs_ctl_PCRUN (pid_t pid, long flags);
procfs_ctl_PCDSTOP (pid_t pid);
procfs_ctl_PCCSIG (pid_t pid);
procfs_ctl_PCCFAULT (pid_t pid);
procfs_ctl_PCKILL (pid_t pid, long signal);
procfs_ctl_PCSREG (pid_t pid, long lwpid, prgregset_t * regs);
これらの関数の上に ptrace の互換性レイヤーを作成することがいかに簡単であるかがわかります。Solaris Internalsという本は、これを行う際に非常に役に立ちました。proc インターフェイスに関する章は、man ページのほぼそのままのコピーでしたが、すばやくめくって読む必要があったのは良かったです。
最終的に、私は ptrace と互換性のある API を作成しませんでした-私はそのステップをスキップし、はるかに高レベルの機能を実行する機能を実装しました-これらの低レベル/proc/<pid>/ctrl
ベースの機能を使用した高レベルコードの例です。高レベルの例のリストを次に示します-これらの低レベル関数に基づいて実装したレベル関数は、それらが提供するすべての構成要素を示しています (私が言ったように、ほとんどすべて)
注: これらは、文字列とアドレス参照の検索、既存の関数の検索と呼び出し、位置に依存しないコードの挿入と実行、システム コールのフックなど、実行中のバイナリ (シンボルなし) に対してエキゾチック/危険/サポートされていないことを実行する必要がある特定のプログラム用に設計されました。引数を変更したり、戻り値を読み取ったりするため、ここにはかなりの数の奇妙な関数があります。
また、文字列とポインターへの参照の検索に関するものはあまりよく書かれていません。それらは、私が使用しているアプリケーションで動作するように書かれただけです。そのようなことには実際のバイナリ解析ライブラリのようなものを実際に使用する必要がありますが、これは proc インターフェイスがいかに強力であるかを示しています。これはすべて、Solaris 9/10 SPARC の場合です。例:
TrapPostSyscall (pid, SYS_dup);
SingleStep(pid,lwpid,flags);
AttachProcess (pid);
ContinueProcess (pid, PRCFAULT | PRCSIG | PRSABORT);
DetachProcess (pid);
GetFaultAddress(pid,1);
GetMainDataSection (pid, &datamap);
WhyStopped (pid, 1));
PrintRegisters(regs);
ReadGeneralRegisterSet (pid, 1, &saved_regs);
SetProgramCounter (pid, 1, mapping - 4);
StopProcess (pid);
TraceFault (pid, FLTWATCH);
TrapPostSyscall (pid, SYS_dup);
TrapPostSyscall (pid, SYS_execve);
TrapSyscallClearall (pid);
WaitForProcessStop (pid);
WatchMemory (pid, datamap.pr_vaddr, datamap.pr_size,WA_TRAPAFTER | WA_WRITE);
WriteGeneralRegisterSet (pid, 1, &saved_regs);
WriteToProcess (pid, mapping, call_pic, sizeof (call_pic));
ReadFromProcess (pid, prmap.pr_vaddr, buff, size);
GetIndividualRegister (pid, 1, R_O0, (long *) fd);
SetIndividualRegister (pid,1,R_O0,fd);
IsProcessStopped (pid);
SearchProcessForReference (pid, stringat);
SearchProcessMem (pid,needle,strlen(needle)+1);
GetPreviousSave (pid, SearchProcessForReference (pid, stringat));
GetMapFromVirtualAddress (pid, base, &prmap);
GetNextProcessMapping (pid, &prmap);
SearchProcessWordRef (pid, addr);
GetReadWriteExecMapping (pid);
CreateRemoteMapping (pid, NULL, PAGESIZE)
TrapSyscall (pid, SYS_dup);
TrapSyscallClearall(pid);
TrapPostSyscall (pid, SYS_dup);
TrapPostSyscallClearall (pid);
これに興味があれば、低レベルまたは高レベルのものを GPL することができます。それらの周りに ptrace 互換のラッパーを非常に簡単に作成できます。メモを送ってください。GPLv2の下で共有します