gpt4 book ai didi

c - 为什么 ptrace SINGLESTEP 不能正常工作?

转载 作者:行者123 更新时间:2023-12-04 06:11:45 25 4
gpt4 key购买 nike

我正在尝试使用 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, &regs);
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;
}

跟踪器的工作是单步执行 inc_reg16 程序和每个遇到的处理器指令的日志地址。当我运行并检查遇到指令“inc ax”的次数时,每次运行跟踪器时数字都会不同:
$ 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

问题是上面的结果应该都是 65536,因为指令 'inc ax' 正好执行了 65536 次。现在的问题是:我的代码中有错误还是 ptrace 中的一些错误?非常感谢您的帮助。

最佳答案

我在virtualbox 和vmware 下都试过同一个程序,好像只有vmware 有正确的结果,而virtualbox 和你有同样的问题。我使用了虚拟机 4.2.1。

关于c - 为什么 ptrace SINGLESTEP 不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7697344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com