`gdb` 如何附加到 运行 进程?
How is `gdb` attaching to running processes?
我想创建一个简单的工具(使用 C),它可以执行 gdb
功能的这一小子集:
- 附加到已经 运行 的程序(带 PID)
- 像这样向其中注入指令:
dup2(open("/tmp/my_stdout", 1089, 0777), 1)
GDB 可以毫无问题地做到这一点,但它有大量的资源。
我正在寻找的是某种指导的起点。
关于 Google 的信息很多,但它们都已有 10 年历史,我需要在当时还不存在的 aarch64 架构上完成这项工作。
真的,非常感谢任何帮助。
我试图 strace gdb 附加到进程时,但我的终端确实炸毁了。
Im looking for is some kind of starting point of guidance.
看看 unwind-pid 示例 here。它使用 ptrace 展开由 PID 标识的外来进程的堆栈。
注意:您可以忽略所有 unw_*
调用。 “附加到 pid”部分相当简单:
pid_t pid = atoi(argv[1]);
if (ptrace(PTRACE_ATTACH, pid, 0, 0) != 0)
die("ERROR: cannot attach to %d\n", pid);
...
(void) ptrace(PTRACE_DETACH, pid, 0, 0);
Inject instructions into it like this: dup2(open("/tmp/my_stdout", 1089, 0777), 1)
搜索“Linux 将代码注入 运行ning 进程”。这是一个 example.
更新:
That will not work, I think. I don't want to dup2 the tracer's stdout. I want to dup2 the tracee's stdout!
是的,你会的,是的。
好吧,也许不完全是(你可以通过代码注入来做到这一点,但你没有这样做)。
您要做的是构造(在堆栈和寄存器中)被跟踪者的状态 ,就好像 它只是调用了 open("/tmp/my_stdout", ...)
本身一样。然后在open
returns后设置断点,将IP
设置为open
,恢复tracee。 tracee 将 运行 直到断点,此时您将在结果寄存器中打开 fd
。现在对 dup2
重复相同的过程,您就完成了。
我想创建一个简单的工具(使用 C),它可以执行 gdb
功能的这一小子集:
- 附加到已经 运行 的程序(带 PID)
- 像这样向其中注入指令:
dup2(open("/tmp/my_stdout", 1089, 0777), 1)
GDB 可以毫无问题地做到这一点,但它有大量的资源。
我正在寻找的是某种指导的起点。
关于 Google 的信息很多,但它们都已有 10 年历史,我需要在当时还不存在的 aarch64 架构上完成这项工作。
真的,非常感谢任何帮助。
我试图 strace gdb 附加到进程时,但我的终端确实炸毁了。
Im looking for is some kind of starting point of guidance.
看看 unwind-pid 示例 here。它使用 ptrace 展开由 PID 标识的外来进程的堆栈。
注意:您可以忽略所有 unw_*
调用。 “附加到 pid”部分相当简单:
pid_t pid = atoi(argv[1]);
if (ptrace(PTRACE_ATTACH, pid, 0, 0) != 0)
die("ERROR: cannot attach to %d\n", pid);
...
(void) ptrace(PTRACE_DETACH, pid, 0, 0);
Inject instructions into it like this:
dup2(open("/tmp/my_stdout", 1089, 0777), 1)
搜索“Linux 将代码注入 运行ning 进程”。这是一个 example.
更新:
That will not work, I think. I don't want to dup2 the tracer's stdout. I want to dup2 the tracee's stdout!
是的,你会的,是的。
好吧,也许不完全是(你可以通过代码注入来做到这一点,但你没有这样做)。
您要做的是构造(在堆栈和寄存器中)被跟踪者的状态 ,就好像 它只是调用了 open("/tmp/my_stdout", ...)
本身一样。然后在open
returns后设置断点,将IP
设置为open
,恢复tracee。 tracee 将 运行 直到断点,此时您将在结果寄存器中打开 fd
。现在对 dup2
重复相同的过程,您就完成了。