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

时间:2016-02-22 22:03:38

标签: multithreading gdb code-injection

我找到了一个自动化gdb命令的技巧"不那么令人不安",这样做我只需在非停止模式下切换到最后一个线程并停止该线程,然后执行请求的命令并继续该线程然后返回主线程。

但是如果下级只有一个线程,这个技巧就不会起作用。所以我需要创建一个永远在后台运行的线程,通过这种方式,我可以随时随地附加到它而不必打扰下级。

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

1-)休息syscall
2-)用gdb分配一些内存来注入代码
3-)将syscall替换为指向已分配内存的jmp指令
4 - )pushad并执行"以某种方式"创建线程
5-)将jmp替换为syscall返回
6 - )popadjmp返回syscall所在位置

但这太过于苛刻了,我仍然不知道"不知何故"部分。有没有更优雅的方式来做到这一点?也许gdb有一些工具,我错过了它。如果没有,我怎么能以某种方式做到""一部分?

1 个答案:

答案 0 :(得分:1)

是的,确实如此。我发现了一种优雅的方式,你不必做这样的hacky东西。你可以注入一个这样的线程:

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

相关问题