- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 ptrace API 跟踪一个小程序。我发现每次运行跟踪器时,都会产生不好的结果。这是我要跟踪的短程序的反汇编:
$ objdump -d -M intel inc_reg16
inc_reg16: file format elf32-i386
Disassembly of section .text:
08048060 <.text>:
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 0x80
// ezptrace.c
#include <sys/user.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t child;
child = fork();
if (child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execv("inc_reg16", NULL);
}
else {
int status;
wait(&status);
struct user_regs_struct regs;
while (1) {
ptrace(PTRACE_GETREGS, child, NULL, ®s);
printf("eip: %x\n", (unsigned int) regs.eip);
ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
waitpid(child, &status, 0);
if(WIFEXITED(status)) break;
}
printf("end\n");
}
return 0;
}
$ gcc ezptrace.c -Wall -o ezptrace
$ ./ezptrace > inc_reg16.log
$ grep '8048065' inc_reg16.log | wc -l
65498
$ ./ezptrace > inc_reg16.log
$ grep '8048065' inc_reg16.log | wc -l
65494
最佳答案
我在virtualbox 和vmware 下都试过同一个程序,好像只有vmware 有正确的结果,而virtualbox 和你有同样的问题。我使用了虚拟机 4.2.1。
关于c - 为什么 ptrace SINGLESTEP 不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7697344/
有人添加到 Wikipedia "ptrace" article声称在 Linux 上,一个 ptraced 进程本身不能 ptrace 另一个进程。我正在尝试确定是否(如果是,为什么)是这种情况。下
我的 Linux 守护程序有问题。它以 root 权限开始,进行一些配置,然后通过切换到某个用户和组来永久删除权限并继续工作。切换到非特权用户是这样完成的: void switch_to_user_g
在 ptrace 上发了很多问题之后(最近的 5 个问题是我的 :( )我终于在替换时得到了想要的输出 reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 *
来自手册页: PTRACE_GET_SYSCALL_INFO (since Linux 5.3) Retrieve information about the system call that cau
我的Linux守护程序有问题。它从root特权开始,进行一些配置,然后通过切换到某些用户和组永久放弃特权并继续工作。切换到非特权用户的操作如下: void switch_to_user_group(s
目前,对于一个项目,我需要使用 ptrace() 编写某种调试器。最后,它应该显示程序中进入/退出的每个函数/系统调用以进行跟踪。 现在,我被困住了。我制作了一个小程序,它应该尝试跟踪给定的程序,并根
考虑这个无限循环的简单程序: int main(void) { for(;;); } 使用 ptrace 向其中注入(inject)系统调用非常简单,如下所示: #include #
我有以下代码。它只是在进入无限循环之前调用 ptrace(PTRACE_TRACEME)。 我有两个问题: 执行二进制文件后,即使我是 root,我也无法附加 gdb。 使用 ptrace(PTRAC
我正在使用 Go 的系统调用包 Ptrace 接口(interface)来跟踪进程。问题是,如果被跟踪者长时间运行,跟踪似乎会挂起。我尝试用 C 实现复制这个问题,但一切似乎都运行良好。 这是重现该问
我只想跟踪 C 程序的一部分以进行系统调用。我使用 ptrace() 和 PTRACE_TRACEME 选项来开始跟踪。如何在几行代码后阻止此进程被跟踪。我正在尝试使用 PTRACE_DETACH 但
ptrace 可以在进入/退出系统调用时获取寄存器和内存数据。但是,如果 linux 系统调用处理程序更改了一些内存,包括堆栈中的某个位置,我如何才能知道哪个内存已被更改。 最佳答案 你不能;但例如
我想在 Linux 上跟踪 PIE,例如在给定的指令地址中断。从反汇编中,我得到了指令的相对地址 - 如何找出可执行文件的加载位置,以便获得绝对地址? GDB 能够跟踪 PIE - 它是如何处理的?
我想使用 ptrace() 调用从用户定义的函数中捕获信息。 但是函数地址不稳定(因为ASLR)。 如何以编程方式获取另一个程序的函数信息,例如gdb? #include #include #in
我在研究项目上遇到了问题。我正在尝试的是使用 ptrace 来观察目标进程的执行。在 ptrace 的帮助下,我将 mprotect 系统调用注入(inject)目标代码段(类似于断点)并将堆栈保护设
我正在尝试使用 ptrace 实现数据流异常检测。经过一些研究,我实现了一个类似于 strace 的程序。现在,我对此感到困惑,这就是 wiki 告诉我的关于系统调用的内容: "System call
我以 ./main & 运行我的进程 它给了我一个看起来像这样的地址:[1] 4257 然后在一个新的终端上我这样做:./tracer 4257 这行代码返回-1 ptrace(PTRACE_ATTA
我正在编写一个程序来监视系统调用(除其他外)。但是我在让 ptrace 识别我传递给它的进程 ID 时遇到了一些麻烦。执行程序后,我收到此错误消息: :No such process 但是,我已经在调
当我附加到另一个进程时,我无法跟踪 fork/exec 事件,从 waitpid 返回的 status 始终为零(在右移 16 次之后)。 我已经成功附加到 bash shell,但是无论我运行什么命
我想按以下方式(伪代码)使用 ptrace: child : foo(); now that foo is done parent should use ptrace to chang
我正在尝试使用 ptrace 在运行时更改另一个程序变量,在我的例子中是一个虚拟 shell。 int main(void) { char buf[MAXLINE]; fgets
我是一名优秀的程序员,十分优秀!