commit this WIP stuff to a feature branch
This commit is contained in:
81
internal/mem/funcs.go
Normal file
81
internal/mem/funcs.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user