mirror of
https://github.com/criyle/go-sandbox.git
synced 2025-09-26 23:19:11 +08:00
42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package ptracer
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// ptrace constants
|
|
const (
|
|
NT_PRSTATUS = 1
|
|
NT_ARM_SYSTEM_CALL = 0x404
|
|
|
|
PTRACE_SET_SYSCALL = 23
|
|
)
|
|
|
|
func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {
|
|
_, _, e1 := syscall.Syscall6(syscall.SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)
|
|
if e1 != 0 {
|
|
err = e1
|
|
}
|
|
return
|
|
}
|
|
|
|
func ptraceGetRegSet(pid int, regs *syscall.PtraceRegs) error {
|
|
iov := getIovec((*byte)(unsafe.Pointer(regs)), int(unsafe.Sizeof(*regs)))
|
|
return ptrace(syscall.PTRACE_GETREGSET, pid, NT_PRSTATUS, uintptr(unsafe.Pointer(&iov)))
|
|
}
|
|
|
|
func ptraceSetRegSet(pid int, regs *syscall.PtraceRegs) error {
|
|
iov := getIovec((*byte)(unsafe.Pointer(regs)), int(unsafe.Sizeof(*regs)))
|
|
return ptrace(syscall.PTRACE_SETREGSET, pid, NT_PRSTATUS, uintptr(unsafe.Pointer(&iov)))
|
|
}
|
|
|
|
func ptraceArm64SetSyscall(pid int, syscallNo int) error {
|
|
iov := getIovec((*byte)(unsafe.Pointer(&syscallNo)), int(unsafe.Sizeof(syscallNo)))
|
|
return ptrace(syscall.PTRACE_SETREGSET, pid, NT_ARM_SYSTEM_CALL, uintptr(unsafe.Pointer(&iov)))
|
|
}
|
|
|
|
func ptraceArmSetSyscall(pid int, syscallNo int) error {
|
|
return ptrace(PTRACE_SET_SYSCALL, pid, 0, uintptr(syscallNo))
|
|
}
|