是否可以使用 gdb 将线程注入另一个进程?

Is it possible to inject a thread to another process with gdb?

我发现了一个自动执行 gdb 命令的技巧 "less disturbing",为此,我只需切换到不间断模式下的最后一个线程并停止该线程,然后执行请求的命令并继续该线程,然后return 回到主线程。

但是如果下级只有一个线程,这一招就不行了。所以我需要创建一个永远在后台运行的线程,这样我就可以随时附加到它而不必打扰下级。

我想到的唯一解决方案是:

1-)在 syscall
处中断 2-)用gdb分配一些内存来注入代码
3-)用指向分配内存
jmp指令替换syscall 4-)pushad 并执行 "somehow" 创建线程的代码
5-) 将 jmp 替换为 syscall back
6-)popadjmp 回到 syscall 所在的位置

但这太老套了,我仍然对 "somehow" 部分一无所知。有没有更优雅的方法来做到这一点?也许 gdb 有一些工具,但我错过了。如果没有,我该如何做 "somehow" 部分?

是的,是的。我找到了一种优雅的方式来做到这一点,你不必做这些骇人听闻的事情。您可以像这样注入线程:

1-)用任何可编译语言编写一个创建线程的代码
2-) 编译成 .so 文件(应该传递 -g 选项,gdb 需要调试符号)
3-) 用 linux 系统调用 dlopen 将其加载到下级:call dlopen(".so path",int)
4-)通过执行 call funcname() 调用您在注入的 .so 文件中实现的任何函数,当您按下 Tab 时 gdb 将自动拾取它(这就是为什么您需要调试符号)