summaryrefslogtreecommitdiff
path: root/internal/tracepoints
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-02-09 01:03:22 +0200
committerPaul Buetow <paul@buetow.org>2024-02-09 01:03:22 +0200
commit1da0b3028eeb4c3ea65f3b51b43dee7cf5a09ebc (patch)
tree9d2ae93834d0f6013251c09646cb03ef61cf4413 /internal/tracepoints
parentf1d915931ca1e0f5fb4007c9cab59fd460a25c6c (diff)
can dynamically load progs and tracepoints
Diffstat (limited to 'internal/tracepoints')
-rw-r--r--internal/tracepoints/syscalls.go58
1 files changed, 56 insertions, 2 deletions
diff --git a/internal/tracepoints/syscalls.go b/internal/tracepoints/syscalls.go
index ebc46af..51f4d94 100644
--- a/internal/tracepoints/syscalls.go
+++ b/internal/tracepoints/syscalls.go
@@ -2,20 +2,74 @@ package tracepoints
import (
"fmt"
+ "log"
+ "os"
+ "regexp"
+ "strings"
bpf "github.com/aquasecurity/libbpfgo"
)
-func AttachSyscalls(bpfModule *bpf.Module, names ...string) error {
- for _, name := range names {
+// SEC("tracepoint/syscalls/sys_exit_openat")
+var syscallRe = regexp.MustCompile(`sys_((enter|exit).*)"\)`)
+
+func filterLines(lines []string) ([]string, error) {
+ var syscalls []string
+
+ for _, line := range lines {
+ matches := syscallRe.FindStringSubmatch(line)
+ if len(matches) < 1 {
+ continue
+ }
+ syscalls = append(syscalls, matches[1])
+ }
+
+ return syscalls, nil
+}
+
+func usedSyscalls() ([]string, error) {
+ var syscalls []string
+
+ files, err := os.ReadDir(".")
+ if err != nil {
+ return syscalls, err
+ }
+
+ for _, file := range files {
+ fileName := file.Name()
+ if !strings.HasSuffix(fileName, ".bpf.c") {
+ continue
+ }
+ content, err := os.ReadFile(fileName)
+ if err != nil {
+ return syscalls, err
+ }
+ syscalls_, err := filterLines(strings.Split(string(content), "\n"))
+ if err != nil {
+ return syscalls, err
+ }
+ syscalls = append(syscalls, syscalls_...)
+ }
+
+ return syscalls, nil
+}
+
+func AttachSyscalls(bpfModule *bpf.Module) error {
+ syscalls, err := usedSyscalls()
+ if err != nil {
+ return err
+ }
+ for _, name := range syscalls {
// Attach to tracepoint
prog, err := bpfModule.GetProgram(fmt.Sprintf("handle_%s", name))
if err != nil {
return fmt.Errorf("Failed to get BPF program handle_%s: %v", name, err)
}
+ log.Println("Attached prog handle_" + name)
if _, err = prog.AttachTracepoint("syscalls", fmt.Sprintf("sys_%s", name)); err != nil {
return fmt.Errorf("Failed to attach to sys_%s tracepoint: %v", name, err)
}
+ log.Println("Attached tracepoint sys_" + name)
}
return nil
}