首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >solaris中的ptrace

solaris中的ptrace
EN

Stack Overflow用户
提问于 2011-07-15 22:48:13
回答 3查看 1.4K关注 0票数 2

我正在尝试将一个使用ptrace的程序从linux移植到solaris,但是没有成功,因为它报告说找不到sys/ptrace.h。你知道怎么移植它吗?

EN

回答 3

Stack Overflow用户

发布于 2011-07-15 23:04:26

至少在我可以访问的solaris系统上,man ptrace说包括

代码语言:javascript
复制
#include <unistd.h>
#include <sys/types.h>

用于访问ptrace原型和常量。但是,有一个用法说明指出,ptrace只能在32位libc中使用,64位客户端应该改用/proc调试接口,所以我不确定这会给您带来多大的帮助。

票数 4
EN

Stack Overflow用户

发布于 2011-07-15 23:04:01

Solaris等

将ptrace作为系统调用完全删除,将其保留为库调用,以便根据平台的procf重新解释对ptrace的调用

http://en.wikipedia.org/wiki/Ptrace

此外,似乎strace实用程序在Solaris上不可用,相反,他们有一个名为truss的实用程序,看看您的系统上是否有该实用程序。

票数 2
EN

Stack Overflow用户

发布于 2014-10-20 01:41:25

编辑:添加和删除了有关如何联系我以及我如何将代码许可给您的陈旧信息

我最终使用/proc/<pid>/ctrl/proc/<pid>中的其他各种接口来编写自己的库,用于执行类似ptrace()的事情。不幸的是,该界面(至少在当时)被标记为不安全,不能直接使用,可以随时更改等,但它在实践中似乎是稳定的。不知道从那以后它是否改变了,这大约是2011年左右,我想…

要开发基本的ptrace等效功能,请从以下内容开始:

代码语言:javascript
复制
man 4 proc

使用/proc/<pid>/ctrl接口,您可以做几乎所有事情(而且比使用ptrace做的更多),比如读/写内存/寄存器、附加/分离、设置系统调用断点等。以下是我编写的API的低级部分的原型:

代码语言:javascript
复制
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内部结构》一书真的很有用--虽然关于proc接口的章节几乎是手册页的逐字副本,但能够快速翻阅还是很不错的。

最终,我没有生成与ptrace兼容的API- -我跳过了这一步,实现了执行高级函数的函数--这是一个使用这些基于/proc/<pid>/ctrl的低级函数的高级代码示例,下面是我基于这些低级函数实现的一些示例高级函数的列表,这些函数演示了它们提供的所有构建块(正如我所说的,几乎所有的东西)。

注意:这些函数是为特定的程序设计的,这些程序需要对运行的二进制文件(没有符号)做一些奇怪的/危险的/不受支持的事情,比如查找字符串和地址引用,定位和调用现有函数,注入和运行位置无关的代码,钩子系统调用以及修改参数和读取返回值等,所以这里有很多奇怪的函数。

此外,涉及到搜索对字符串和指针的引用的那些代码编写得不是很好-它们只是为了在我正在使用的应用程序上工作而编写的。你真的应该使用像真正的二进制分析库这样的东西,但这只是演示了proc接口是多么强大。这都是针对Solaris9/10SPARC的。示例:

代码语言:javascript
复制
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下分享

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6708859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档