84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
package proc
|
|
|
|
import "fmt"
|
|
import "bytes"
|
|
import sys "golang.org/x/sys/unix"
|
|
|
|
type Regs struct {
|
|
regs *sys.PtraceRegs
|
|
}
|
|
|
|
func (r *Regs) String() string {
|
|
var buf bytes.Buffer
|
|
var regs = []struct {
|
|
k string
|
|
v uint64
|
|
}{
|
|
{"Rip", r.regs.Rip},
|
|
{"Rsp", r.regs.Rsp},
|
|
{"Rax", r.regs.Rax},
|
|
{"Rbx", r.regs.Rbx},
|
|
{"Rcx", r.regs.Rcx},
|
|
{"Rdx", r.regs.Rdx},
|
|
{"Rdi", r.regs.Rdi},
|
|
{"Rsi", r.regs.Rsi},
|
|
{"Rbp", r.regs.Rbp},
|
|
{"R8", r.regs.R8},
|
|
{"R9", r.regs.R9},
|
|
{"R10", r.regs.R10},
|
|
{"R11", r.regs.R11},
|
|
{"R12", r.regs.R12},
|
|
{"R13", r.regs.R13},
|
|
{"R14", r.regs.R14},
|
|
{"R15", r.regs.R15},
|
|
{"Orig_rax", r.regs.Orig_rax},
|
|
{"Cs", r.regs.Cs},
|
|
{"Eflags", r.regs.Eflags},
|
|
{"Ss", r.regs.Ss},
|
|
{"Fs_base", r.regs.Fs_base},
|
|
{"Gs_base", r.regs.Gs_base},
|
|
{"Ds", r.regs.Ds},
|
|
{"Es", r.regs.Es},
|
|
{"Fs", r.regs.Fs},
|
|
{"Gs", r.regs.Gs},
|
|
}
|
|
for _, reg := range regs {
|
|
fmt.Fprintf(&buf, "%s = 0x%x\n", reg.k, reg.v)
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
func (r *Regs) PC() uint64 {
|
|
return r.regs.PC()
|
|
}
|
|
|
|
func (r *Regs) SP() uint64 {
|
|
return r.regs.Rsp
|
|
}
|
|
|
|
func (r *Regs) CX() uint64 {
|
|
return r.regs.Rcx
|
|
}
|
|
|
|
func (r *Regs) TLS() uint64 {
|
|
return r.regs.Fs_base
|
|
}
|
|
|
|
func (r *Regs) SetPC(thread *Thread, pc uint64) (err error) {
|
|
r.regs.SetPC(pc)
|
|
thread.dbp.execPtraceFunc(func() { err = sys.PtraceSetRegs(thread.Id, r.regs) })
|
|
return
|
|
}
|
|
|
|
func registers(thread *Thread) (Registers, error) {
|
|
var (
|
|
regs sys.PtraceRegs
|
|
err error
|
|
)
|
|
thread.dbp.execPtraceFunc(func() { err = sys.PtraceGetRegs(thread.Id, ®s) })
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Regs{®s}, nil
|
|
}
|