我正在Linux64位下开发一个小调试器,我在查找系统调用的返回值时遇到了问题,我正在测试RIP值,我的意思是我执行PEEK_USERDATA并且ptrace直接通过这种方式给我返回操作码而不是RIP地址(其中0x050f是SYSCALL的操作码):if(rip&0x0000ffff==0x050f)然后获取系统调用名称参数等问题是我如何获得这些系统调用的返回值,我知道ptrace提供PTRACE_SYSCALL来警告我们进入/离开内核模式,但我想直接检查RIP值,所以我使用SINGLESTEP,我检查了我的rip是否匹配SYSLEAVE和SYSEXIT操作码,但它从来没有。我可以检查
根据ptrace手册页,IfthePTRACE_O_TRACEEXECoptionisnotineffect,allsuccessfulcallstoexecve(2)bythetracedprocesswillcauseittobesentaSIGTRAPsignal,givingtheparentachancetogaincontrolbeforethenewprogrambeginsexecution.如果选项是有效,Stopthetraceeatthenextexecve(2).Awaitpid(2)bythetracerwillreturnastatusvaluesuchth
在我的项目中,我需要附加到进程,恢复它们,然后使用ptrace分离。但是,分离失败并显示errno=ESRCH(没有这样的过程)。如果我不使用PTRACE_CONT恢复进程,分离工作正常,但在这种情况下,进程停止/无响应,这在我的项目中是NotAcceptable。在Arch和Ubuntu12.04LTS上测试,结果相同。#include#include#include#include#includeintmain(intargc,char*argv[]){pid_tpid=21000;if(ptrace(PTRACE_ATTACH,pid,NULL,NULL)==-1){perror
在Linux机器上,我使用带有PTRACE_SINGLESTEP参数的ptrace来计算程序的机器指令数。我关注了这篇文章:http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html.然而,结果对我来说似乎很奇怪。对于一个非常简单的程序,计算超过95000条机器指令。测试程序是intmain(void){return23;}这是怎么回事?文章中的代码是错误的吗?(我看不出有什么问题。)如果不是,是什么导致如此简单的程序需要>95000条指令? 最佳答案 您正在编译的C程序已
有没有人对PTRACE_SYSEMU的使用有任何好的解释、教程、书籍或指南?? 最佳答案 我觉得有趣的地方:ExampleImplementationforptracePlayingwithptrace,PartI-LinuxJournal.comPlayingwithptrace,PartII-LinuxJournal.com以及使使用ptrace更容易的编程库:PinkTrace-ptrace()wrapperlibrary.对于pinktrace有示例,sydbox源是复杂pinktrace用例的示例。总的来说,我发现作者是有
我想使用ptrace来检查系统调用了由我的程序生成的程序。我从thistutorial开始正如在对我的previousquestion的回答中所解释的那样.我修改了代码,使其适应我正在使用的平台(SLES1164位),并将以下测试代码放在一起,打印出派生进程进行的每个系统调用:#include#include#include#include#include#include#include/*ForSYS_writeetc*/pid_tchild;voidrun(){longorig_eax;intstatus;while(1){intpid=wait(&status);if(pid==
我有以下代码。它只是在进入无限循环之前调用ptrace(PTRACE_TRACEME)。我有两个问题:执行二进制文件后,即使我是root,我也无法附加gdb。使用ptrace(PTRACE_TRACEME),我无法使用Ctrl-C(SIGINT)终止进程。它只是停止了。谁能解释一下这是怎么回事?提前谢谢你。PS:我知道大多数调试器会派生一个子进程,然后在execve之前调用ptrace(PTRACE_TRACEME)。无需提醒我这一点。#include#include#include#include#include#include#include#include#includeintm
问题陈述:程序C由一个循环组成。该程序的执行必须由另一个进程控制,该进程将定期显示受控进程的进度。在kill(pid,SIGSTOP),函数ptrace(PTRACE_PEEKTEXT,pid,...)之后不再找到C进程。根据我的阅读,ptrace(PTRACE_PEEKTEXT,pid,...)应该在pid标识的进程停止时工作。我不知道我到底错过了什么,所以任何帮助将不胜感激。以下是我到目前为止所做的:有两个进程,P和C。第一个进程(P)通过fork()创建第二个进程(C)。C的代码是这样的:inti=0;intmain(){ptrace(PTRACE_TRACEME,0,NULL,
我正在尝试使用ptrace编写一个程序来跟踪child进行的所有系统调用。现在我有一个禁止child使用的系统调用列表。我能够使用ptrace跟踪所有系统调用,但我只是不知道如何跳过特定的系统调用。目前,每当子进程进入或退出系统调用(PTRACE_SYSCALL)时,我的跟踪(父)进程都会收到一个信号。但是,如果child试图输入禁止的系统调用,那么我不想让child跳过该调用并转到下一步。此外,当我这样做时,我希望child知道存在权限被拒绝错误,所以我将设置errno=13,这就足够了吗?更新:gdb提供了这种跳过一行的功能..gdb使用什么机制?如何实现?更新:使用ptrace实
我在gdb调试的时候执行ni命令遇到这样的错误:Warning:Cannotinsertbreakpoint0.Erroraccessingmemoryaddress0x3ac706a:Input/outputerror.0xf6fa4771insiglongjmp()from/lib/libc.so.6为了调查gdb遇到了什么问题,我对gdb进行了跟踪并得到了这样的输出:rt_sigprocmask(SIG_BLOCK,NULL,[RT_1],8)=0ptrace(PTRACE_PEEKTEXT,651,0xcc4fdf60,[0x1cc4fe470])=0ptrace(PTRACE