# Linux Kernel Module Cheat

#### 17.13.3. Kprobes

kprobes is an instrumentation mechanism that injects arbitrary code at a given address in a trap instruction, much like GDB. Oh, the good old kernel. :-)

    ./build-linux --config 'CONFIG_KPROBES=y'

Then on guest:

    insmod kprobe_example.ko
    sleep 4 & sleep 4 &'

Outcome: dmesg outputs on every fork:

    <_do_fork> pre_handler: p->addr = 0x00000000e1360063, ip = ffffffff810531d1, flags = 0x246
    <_do_fork> post_handler: p->addr = 0x00000000e1360063, flags = 0x246
    <_do_fork> pre_handler: p->addr = 0x00000000e1360063, ip = ffffffff810531d1, flags = 0x246
    <_do_fork> post_handler: p->addr = 0x00000000e1360063, flags = 0x246

Source: kernel_modules/kprobe_example.c

TODO: it does not work if I try to immediately launch `sleep`, why?

    insmod kprobe_example.ko
    sleep 4 & sleep 4 &

I don’t think your code can refer to the surrounding kernel code however: the only visible thing is the value of the registers.

You can then hack it up to read the stack and read argument values, but do you really want to?

There is also a kprobes + ftrace based mechanism with `CONFIG_KPROBE_EVENTS=y` which does read the memory for us based on format strings that indicate type…​ https://github.com/torvalds/linux/blob/v4.16/Documentation/trace/kprobetrace.txt Horrendous. Used by: https://github.com/brendangregg/perf-tools/blob/98d42a2a1493d2d1c651a5c396e015d4f082eb20/execsnoop

Bibliography:

- https://github.com/torvalds/linux/blob/v4.16/Documentation/kprobes.txt

- https://github.com/torvalds/linux/blob/v4.17/samples/kprobes/kprobe_example.c