Closed SeeFlowerX closed 1 year ago
设想五:
uprobe + 信号,命中断点的时候发送SIGSTOP信号,然后用户可以通过dd等手段去获取数据
或者提前载入一个动态库,注册特定信号处理函数,在这个地方处理
最新版已经实现了命中hook点时发送信号,示例如下:
./stackplz -n icu.nullptr.nativetest -w strstr[str,str] --kill SIGSTOP
./stackplz -n com.starbucks.cn --syscall exit --kill SIGSTOP --stack
当前基于ebpf的数据传递是有上限的,单次数据提交无法超过32K,即使缓冲区可以设置到64M甚至128M
需要设计一种方案提高数据大小上限。
设想一:
多次传递数据,例如单次4K*1024次
设想二:
uprobe + shellcode,可以在命中hook点的时候写入shellcode,shellcode做完操作之后,再跳转回到之前下的hook点
不同于一般的inlinehook,uprobe相当于是单个指令就能实现中断,那么我们可以把shellcode就直接放在hook点后面,执行完成之后跳转回来,再还原指令
例如A是uprobe下的点,在命中A的时候,将A-B之间改为shellcode,shellcode最终会间接跳转回到A,这个时候我们再把原本的指令还原回去;这样没有必要去开辟新的内存空间,当然只适合一些简短的shellcode,基于这个思路也能实现对寄存器的修改(应该
设想三:
基于ebpf的硬件断点,参考bpftrace,但是初步看起来应该只能支持计数,最多加一个获取寄存器信息,要读数据似乎不可行
设想四:
提示用户在定位到关键点后,使用内核模块去获取数据(或者用CE之类的),这个也是基于硬件断点的
https://github.com/junknet/kernel-debugger