SeeFlowerX / stackplz

基于eBPF的堆栈追踪工具
Apache License 2.0
927 stars 179 forks source link

[feature request] 读取超大数据 #13

Closed SeeFlowerX closed 1 year ago

SeeFlowerX commented 1 year ago

map create: cannot allocate memory

当前基于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,基于这个思路也能实现对寄存器的修改(应该

image

设想三:

基于ebpf的硬件断点,参考bpftrace,但是初步看起来应该只能支持计数,最多加一个获取寄存器信息,要读数据似乎不可行

设想四:

提示用户在定位到关键点后,使用内核模块去获取数据(或者用CE之类的),这个也是基于硬件断点的

https://github.com/junknet/kernel-debugger

SeeFlowerX commented 1 year ago

设想五:

uprobe + 信号,命中断点的时候发送SIGSTOP信号,然后用户可以通过dd等手段去获取数据

或者提前载入一个动态库,注册特定信号处理函数,在这个地方处理

SeeFlowerX commented 1 year ago

最新版已经实现了命中hook点时发送信号,示例如下:

./stackplz -n icu.nullptr.nativetest -w strstr[str,str] --kill SIGSTOP
./stackplz -n com.starbucks.cn --syscall exit --kill SIGSTOP --stack