我想创建一个简单的工具(用C),它可以完成gdb
的这个小子集的功能:
- 附加到一个已经运行的程序(带PID)
- 像这样注入指令:
dup2(开放("/tmp/my_stdout" 1089, 0777), 1)
GDB可以毫无问题地做到这一点,但它有一个庞大的源代码。
我想要的是某种指导的起点。
谷歌上有大量的信息,但它们都是10多年前的了,我需要在当时还不存在的aarch64 arch上完成这项工作。
真的,任何帮助都是非常感谢的。
当gdb连接到一个进程时,我试图stracegdb,但是我的终端崩溃了。
我寻找的是某种起点的指引。
看一下这里的unwind-pid示例。它使用ptrace来展开由PID标识的外部进程的堆栈。
注意:您可以忽略所有unw_*
调用。附加于;部分相当琐碎:
pid_t pid = atoi(argv[1]);
if (ptrace(PTRACE_ATTACH, pid, 0, 0) != 0)
die("ERROR: cannot attach to %dn", pid);
...
(void) ptrace(PTRACE_DETACH, pid, 0, 0);
像这样注入指令:
dup2(open("/tmp/my_stdout", 1089, 0777), 1)
搜索"Linux注入代码到运行过程中"。下面是一个例子。
更新:
我想那不行。我不想破坏追踪器的输出。我要把tracee的stout弄掉!
是的,你知道,是的,它会。
嗯,也许不完全是这样(你可以用代码注入来做,但是你不有这样做)。
您要做的是(在堆栈和寄存器中)构造跟踪器的状态,就好像它只是调用open("/tmp/my_stdout", ...)
本身一样。然后在open
返回后设置断点,将IP
设置为open
,并继续跟踪。跟踪程序将一直运行到断点,此时在结果寄存器中将有一个打开的fd
。现在对dup2
重复同样的过程,就完成了。