Files
go_sysutils/internal/mem/funcs.go
2025-12-06 19:19:53 -05:00

82 lines
1.7 KiB
Go

package mem
import (
"encoding/binary"
"unsafe"
"golang.org/x/sys/unix"
)
func getStdRIP(r *unix.PtraceRegs) (rip uint64) {
return
}
func getRIP(r *unix.PtraceRegs) uint64 {
// amd64
if binary.Size(unix.PtraceRegs{}) == 216 {
return r.Rip
}
// arm64
type regsArm64 struct{ Regs [18]uint64 }
return (*regsArm64)(unsafe.Pointer(r)).Regs[16] // PC
}
func setRIP(r *unix.PtraceRegs, v uint64) *unix.PtraceRegs {
if binary.Size(unix.PtraceRegs{}) == 216 {
r.Rip = v
} else {
type regsArm64 struct{ Regs [18]uint64 }
(*regsArm64)(unsafe.Pointer(r)).Regs[16] = v
}
return r
}
func getRSP(r *unix.PtraceRegs) uint64 {
if binary.Size(unix.PtraceRegs{}) == 216 {
return r.Rsp
}
type regsArm64 struct{ Regs [18]uint64 }
return (*regsArm64)(unsafe.Pointer(r)).Regs[17] // SP
}
func setRSP(r *unix.PtraceRegs, v uint64) *unix.PtraceRegs {
if binary.Size(unix.PtraceRegs{}) == 216 {
r.Rsp = v
} else {
type regsArm64 struct{ Regs [18]uint64 }
(*regsArm64)(unsafe.Pointer(r)).Regs[17] = v
}
return r
}
func setArg0(r *unix.PtraceRegs, v uint64) *unix.PtraceRegs {
if binary.Size(unix.PtraceRegs{}) == 216 {
r.Rdi = v
} else {
type regsArm64 struct{ Regs [18]uint64 }
(*regsArm64)(unsafe.Pointer(r)).Regs[0] = v // X0
}
return r
}
func setArg1(r *unix.PtraceRegs, v uint64) *unix.PtraceRegs {
if binary.Size(unix.PtraceRegs{}) == 216 {
r.Rsi = v
} else {
type regsArm64 struct{ Regs [18]uint64 }
(*regsArm64)(unsafe.Pointer(r)).Regs[1] = v // X1
}
return r
}
func setArg2(r *unix.PtraceRegs, v uint64) *unix.PtraceRegs {
if binary.Size(unix.PtraceRegs{}) == 216 {
r.Rdx = v
} else {
type regsArm64 struct{ Regs [18]uint64 }
(*regsArm64)(unsafe.Pointer(r)).Regs[2] = v // X2
}
return r
}