Golang系统调用获取系统调用的参数

时间:2018-05-29 12:43:06

标签: linux go ptrace

如果执行./syscallprint ls -l,它将打印ls -l命令调用的系统调用ID。

syscallprint.go

package main

import (
    "fmt"
    "os"
    "os/exec"
    "syscall"
)

func main() {
    var regs syscall.PtraceRegs
    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, &regs)
            if err != nil {
                break
            }
            fmt.Printf("SystemId: (%x)\n", regs.Orig_rax)
            // TODO: print syscall parameters
        }
        err = syscall.PtraceSyscall(pid, 0)
        if err != nil {
            panic(err)
        }
        _, err = syscall.Wait4(pid, nil, 0, nil)
        if err != nil {
            panic(err)
        }
        exit = !exit
    }
}

是否可以通过ls -l获取系统调用的参数?

来自this question似乎有可能。 go-lang有可能吗?

0 个答案:

没有答案