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 }