是否可以使用 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-)popad
和 jmp
回到 syscall
所在的位置
但这太老套了,我仍然对 "somehow" 部分一无所知。有没有更优雅的方法来做到这一点?也许 gdb 有一些工具,但我错过了。如果没有,我该如何做 "somehow" 部分?
是的,是的。我找到了一种优雅的方式来做到这一点,你不必做这些骇人听闻的事情。您可以像这样注入线程:
1-)用任何可编译语言编写一个创建线程的代码
2-) 编译成 .so
文件(应该传递 -g
选项,gdb 需要调试符号)
3-) 用 linux 系统调用 dlopen 将其加载到下级:call dlopen(".so path",int)
4-)通过执行 call funcname()
调用您在注入的 .so 文件中实现的任何函数,当您按下 Tab
时 gdb 将自动拾取它(这就是为什么您需要调试符号)
我发现了一个自动执行 gdb 命令的技巧 "less disturbing",为此,我只需切换到不间断模式下的最后一个线程并停止该线程,然后执行请求的命令并继续该线程,然后return 回到主线程。
但是如果下级只有一个线程,这一招就不行了。所以我需要创建一个永远在后台运行的线程,这样我就可以随时附加到它而不必打扰下级。
我想到的唯一解决方案是:
1-)在 syscall
处中断
2-)用gdb分配一些内存来注入代码
3-)用指向分配内存
的jmp
指令替换syscall
4-)pushad
并执行 "somehow" 创建线程的代码
5-) 将 jmp
替换为 syscall
back
6-)popad
和 jmp
回到 syscall
所在的位置
但这太老套了,我仍然对 "somehow" 部分一无所知。有没有更优雅的方法来做到这一点?也许 gdb 有一些工具,但我错过了。如果没有,我该如何做 "somehow" 部分?
是的,是的。我找到了一种优雅的方式来做到这一点,你不必做这些骇人听闻的事情。您可以像这样注入线程:
1-)用任何可编译语言编写一个创建线程的代码
2-) 编译成 .so
文件(应该传递 -g
选项,gdb 需要调试符号)
3-) 用 linux 系统调用 dlopen 将其加载到下级:call dlopen(".so path",int)
4-)通过执行 call funcname()
调用您在注入的 .so 文件中实现的任何函数,当您按下 Tab
时 gdb 将自动拾取它(这就是为什么您需要调试符号)