Я нахожусь на x86_64, и я хочу получить путь для открытого вызова, используя связанный регистр - это дает SIGSEGV на печать
syscall.PtraceGetRegs(pid, ®s)
ptr := uintptr(regs.Rdi)
path := (*[]byte)(unsafe.Pointer(ptr))
//path := C.GoString((*C.char)(unsafe.Pointer(ptr)))
fmt.Printf("<path> %v\n", *path)
http://man7.org/linux/man-pages/man2/syscall.2.html перечисляет RDI в качестве регистра,Я пробовал другие, но все ошибки seg.
Значения регистров:
syscall.PtraceRegs{R15:0x0, R14:0x0, R13:0x1, R12:0x7fe899dbe0a8,
Rbp:0xffffffffffffffff, Rbx:0x55fb7ac6ca21, R11:0x287, R10:0x0,
R9:0x0, R8:0x0, Rax:0x3, Rcx:0x7fe899bb1cdd, Rdx:0x80000,
Rsi:0x7fe899bb6428, Rdi:0xffffff9c, Orig_rax:0x101,
Rip:0x7fe899bb1cdd, Cs:0x33, Eflags:0x287, Rsp:0x7ffc421ad9d8,
Ss:0x2b, Fs_base:0x0, Gs_base:0x0, Ds:0x0, Es:0x0, Fs:0x0, Gs:0x0}
На основании некоторого кода, который я нашел
https://github.com/orivej/fptrace/search?q=readString&unscoped_q=readString
Iзатем попробовал это - но ничего не возвращается и циклы for навсегда
fmt.Printf("<data> %s\n", readString(pid,regs.Rdi))
func readString(pid int, addr uint64) string {
var chunk [64]byte
var buf []byte
for {
n, err := syscall.PtracePeekData(pid, uintptr(addr), chunk[:])
if err != syscall.EIO {
fmt.Print(err)
}
end := bytes.IndexByte(chunk[:n], 0)
if end != -1 {
buf = append(buf, chunk[:end]...)
return string(buf)
}
buf = append(buf, chunk[:n]...)
addr += uint64(n)
}
}
Я клонирую https://github.com/orivej/fptrace и посмотрю, сработает ли это, и выясню, что мне нужно делать.