summaryrefslogtreecommitdiff
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
parentf1d915931ca1e0f5fb4007c9cab59fd460a25c6c (diff)
can dynamically load progs and tracepoints
-rw-r--r--internal/tracepoints/syscalls.go58
-rw-r--r--main.go2
2 files changed, 57 insertions, 3 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
}
diff --git a/main.go b/main.go
index 1d1a99c..0f8342a 100644
--- a/main.go
+++ b/main.go
@@ -64,7 +64,7 @@ func main() {
os.Exit(-1)
}
- if err := tracepoints.AttachSyscalls(bpfModule, "enter_openat", "exit_openat"); err != nil {
+ if err := tracepoints.AttachSyscalls(bpfModule); err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(-1)
}