82 lines
1.7 KiB
Go
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
|
|
}
|