Tag: ptrace

如何用ptrace跟踪程序执行?

我一直在尝试使用系统调用“ptrace”(使用PTRACE_SINGLESTEP宏)来跟踪简单应用程序的执行。 在记录程序的执行时,我想跳过阅读中无用的部分,只能从我的应用程序的“主要”开始。 因为每当我启动我的跟踪器时,我都会获得大约100k的执行步骤。 Cordialy

为什么ptrace SINGLESTEP无法正常工作?

我正在尝试使用ptrace API跟踪一个小程序。 我发现每次运行跟踪器都会产生不良结果。 这是我要跟踪的短程序的反汇编: $ objdump -d -M intel inc_reg16 inc_reg16: file format elf32-i386 Disassembly of section .text: 08048060 : 8048060: b8 00 00 00 00 mov eax,0x0 8048065: 66 40 inc ax 8048067: 75 fc jne 0x8048065 8048069: 89 c3 mov ebx,eax 804806b: b8 01 00 00 00 mov eax,0x1 8048070: cd 80 int […]

为什么WIFSIGNALED(状态)在使用ptrace跟踪进程时无法检测到信号?

我正在使用ptrace来跟踪子进程。 当子进程正常退出时,它可以很好地工作。 但是如果它exception退出,程序就会进入无限循环,尽管使用宏WIFSIGNALED(&status)。 这是示例子进程: try.c int main() { int a=5/0; } 这是追踪计划 #include #include #include #include #include #include /* For SYS_write etc */ #include #include int main() { pid_t child; long orig_eax, eax; int status,insyscall = 0; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl(“./try”, “try”, NULL); } else { siginfo_t […]

用ptrace解析调用和Ret。

我尝试使用ptrace解析可执行文件中的所有Calls和Rets。 符合x64opcode ,我找到了调用的操作码:0xe8和Rets:0xc3,0xc2,0xca,0xcb 。 自从我解析它们后,我发现了更多的Rets而不是Calls。 有我跟踪的程序: void func() { write(1, “i”, 1); } int main(int ac) { func(); return(0); } 有我的示踪剂: int tracer(t_info *info) { int status; long ptr; int ret = 0; int call = 0; waitpid(info->pid, &status, 0); while (WIFSTOPPED(status)) { ptrace(PTRACE_GETREGS, info->pid, NULL, info->regs); ptr = ptrace(PTRACE_PEEKDATA, info->pid, info->regs->rip); if (((ptr & […]

C – 用popen获取进程的PID

我有一个用C编写的程序,它使用popen打开另一个程序。 我想获得该程序的pid或某种处理程序,以便在一定的时间限制后杀死它,或者它超过某些ram和stdout限制。 我认为这必须用ptrace完成,它需要PID,我不知道如何获取。

如何ptracemultithreading应用程序?

编辑(制作进展): 我试图ptrace一个vsftpd守护进程。 我有以下代码附加到守护程序。 然后它成功显示第一个衍生进程的PID。 然而,对于这个衍生进程的子进程,它返回PID为2,3,..程序确实捕获了生成进程的退出,这让我觉得我很接近。 有任何想法吗? void * trace_process(void * pid){ pid_t child = atoi((char *) pid); long orig_eax, eax; int status; int callmade = FALSE; long opt = PTRACE_O_TRACEFORK; long newpid; long trace = ptrace(PTRACE_ATTACH,child,NULL,NULL); ptrace(PTRACE_SETOPTIONS,child,NULL,opt); if(trace == FALSE) printf(“Attached to %d\n”,child); while(TRUE) { child = waitpid(-1, &status, __WALL); if (status >> 16 == […]

使用ptrace进行系统调用跟踪

我编写了一个程序来列出命令执行的所有系统调用(比如/ bin / ls)。 现在我要做的是找到所有系统调用参数,环境变量,可以传递给它的命令行参数 示例:如果我打开文件。 系统调用sys_access会打开文件吗? 但是如何获得这些价值呢? 想要打开,读取,写入,关闭等系统调用。 根据我的研究,这些必须在寄存器中(ebx – edx)如果是这样,这些寄存器值表示什么? 我有这个链接 。 但我真的无法从那里得到太多。 此外,任何进一步的参考将是非常有帮助的。

在OS X中读取其他进程的内存?

我一直在努力了解如何阅读Mac OS X上其他进程的内存,但我没有太多运气。 我在网上看过很多使用ptrace和PEEKDATA等的例子,但它在BSD [ man ptrace ]上没有这个选项。 int pid = fork(); if (pid > 0) { // mess around with child-process’s memory } 如何在Mac OS X上读取和写入另一个进程的内存?