我找到了一个自动化gdb命令的技巧"不那么令人不安",这样做我只需在非停止模式下切换到最后一个线程并停止该线程,然后执行请求的命令并继续该线程然后返回主线程。
但是如果下级只有一个线程,这个技巧就不会起作用。所以我需要创建一个永远在后台运行的线程,通过这种方式,我可以随时随地附加到它而不必打扰下级。
我想到的唯一解决方案是:
1-)休息syscall
2-)用gdb分配一些内存来注入代码
3-)将syscall
替换为指向已分配内存的jmp
指令
4 - )pushad
并执行"以某种方式"创建线程
5-)将jmp
替换为syscall
返回
6 - )popad
和jmp
返回syscall
所在位置
但这太过于苛刻了,我仍然不知道"不知何故"部分。有没有更优雅的方式来做到这一点?也许gdb有一些工具,我错过了它。如果没有,我怎么能以某种方式做到""一部分?
答案 0 :(得分:1)
是的,确实如此。我发现了一种优雅的方式,你不必做这样的hacky东西。你可以注入一个这样的线程:
1-)编写一个用任何可编译语言创建线程的代码
2-)编译它以便传递.so
文件(-g
选项,gdb将需要调试符号)
3-)使用linux系统调用dlopen将其加载到下级:call dlopen(".so path",int)
4-)调用你通过执行call funcname()
注入的.so文件中实现的任何函数,gdb将在你按Tab
时自动选择它(这就是你需要调试符号的原因)