使用ptrace获取所有printfs
我想将自己连接到一个进程,并截获来自该进程的所有使用ptrace获取所有printfs,c,printf,ptrace,C,Printf,Ptrace,我想将自己连接到一个进程,并截获来自该进程的所有printf调用 main.c int main() { int i; for(i = 0; i < 10; i++) { printf("HelloWorld\n"); sleep(5); } return 0; } intmain() { int i; 对于(i=0;i
printf
调用
main.c
int main()
{
int i;
for(i = 0; i < 10; i++)
{
printf("HelloWorld\n");
sleep(5);
}
return 0;
}
intmain()
{
int i;
对于(i=0;i<10;i++)
{
printf(“HelloWorld\n”);
睡眠(5);
}
返回0;
}
然后附加我有这段代码,我想做一个无限循环,或者直到main.c完成——无限循环可以工作这只是Hello World和ptrace的测试,没什么特别的
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h> // For user_regs_struct
int main(int argc, char *argv[])
{
struct user_regs_struct regs;
pid_t traced_process = atoi(argv[1]);
long t = ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process, NULL, ®s);
long ins = ptrace(PTRACE_PEEKTEXT, traced_process, regs.eip, NULL);
printf("EIP: %lx Instruction executed: %lx\n", regs.eip, ins);
char *c = &ins;
printf("%c\n",c);
ptrace(PTRACE_DETACH, traced_process, NULL, NULL);
return 0;
}
#包括
#包括
#包括
#包括
#包含//用于用户\u注册表\u结构
int main(int argc,char*argv[])
{
结构用户\u注册表\u结构注册表;
pid_t_进程=atoi(argv[1]);
长t=ptrace(ptrace\u ATTACH,tracked\u process,NULL,NULL);
等待(空);
ptrace(ptrace_GETREGS、tracked_process、NULL和regs);
long-ins=ptrace(ptrace_-peek-text,跟踪_-process,regs.eip,NULL);
printf(“执行的EIP:%lx指令:%lx\n”,regs.EIP,ins);
char*c=&ins;
printf(“%c\n”,c);
ptrace(ptrace_分离,跟踪_进程,NULL,NULL);
返回0;
}
我试图在附加后放置while(1)
,但实际上这只是在main.c中执行的第一个printf上循环
我真的很难做到这一点,我遇到的每一个例子实际上都是另一个例子的复制粘贴,其中包含大量与我试图做的事情无关的代码。我确实知道printf在内核中是一个write(),所以这就是我应该寻找的
所以我想再次获得printf试图打印到另一个终端屏幕上的字符串的引用。我该怎么做 您需要复制调试器的一半才能执行此操作 简言之:
这很简单。只需找到ABI文档,或阅读其他人编写的代码,或将一个简单函数编译到汇编程序中,然后查看汇编程序如何访问函数的第一个参数。使用该信息将第一个参数提取到printf。您需要使用GETREGS(或等效工具)ptrace中获取寄存器和数据的功能(或等效功能)读取字符串的数据。为什么不使用dtrace?尝试为需要它的实际项目学习ptrace。@Vijay必须有一种方法来完成这个HelloWorld ptrace。到目前为止,我发现的最好的例子不是附加到该进程,而是执行
main
,然后使其成为子进程。似乎您想要实现一个函数调试器提供的特性…您可能需要找到tracee的printf地址,然后插入陷阱(作为断点)。请注意,源代码中的printf
调用可能不会映射到可执行文件中的printf
调用。例如,代码中的printf(“HelloWorld\n”)