1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package main
- import (
- "fmt"
- "os"
- "os/exec"
- "syscall"
- sec "github.com/seccomp/libseccomp-golang"
- )
- func main() {
- var regs syscall.PtraceRegs
- fmt.Printf("Run %v\n", os.Args[1:])
-
-
- cmd := exec.Command(os.Args[1], os.Args[2:]...)
- cmd.Stderr = os.Stderr
- cmd.Stdin = os.Stdin
- cmd.Stdout = os.Stdout
- cmd.SysProcAttr = &syscall.SysProcAttr{
- Ptrace: true,
- }
- cmd.Start()
- err := cmd.Wait()
- if err != nil {
- fmt.Printf("Wait returned: %v\n", err)
- }
- pid := cmd.Process.Pid
- exit := true
- for {
- if exit {
- err = syscall.PtraceGetRegs(pid, ®s)
- if err != nil {
- break
- }
-
- name := getSyscallName(regs.Orig_rax)
- fmt.Printf("%s: %d(%x,%x,%x)\n", name, regs.Rax, regs.Rdi, regs.Rsi, regs.Rdx)
- }
- err = syscall.PtraceSyscall(pid, 0)
- if err != nil {
- panic(err)
- }
- _, err = syscall.Wait4(pid, nil, 0, nil)
- if err != nil {
- panic(err)
- }
- exit = !exit
- }
- }
- func getSyscallName(syscallID uint64) string {
- name, _ := sec.ScmpSyscall(syscallID).GetName()
- return name
- }
|