我想将当前程序的虚拟内存内容从0x10000
打印到0x50000
(系统上包含syscall蹦床的区域)。
package main
import (
"syscall"
"unsafe"
)
func main() {
syscall.Syscall(SYS_WRITE, uintptr(1), uintptr(unsafe.Pointer(0x10000)), uintptr(0x40000))
}
然而,当我试图编译时,我得到了错误:
cannot convert 65536 (type int) to type unsafe.Pointer
在我的例子中,cgo
被禁用(import "C"
在编译时失败)syscall.Syscall(SYS_WRITE
也是唯一的方法吗?
您可以将该地址转换为字节片,然后将其传递给任何Write
方法。
要将地址0x10000
转换为长度为0x30000
的字节片,可以使用
mem := (*[1 << 30]byte)(unsafe.Pointer(uintptr(0x10000)))[:0x30000:0x30000]
如果大小始终是静态的,您可以将数组设置为适当的大小来启动
mem := (*[0x30000]byte)(unsafe.Pointer(uintptr(0x10000)))[:]
您面临的直接问题是应该将0x10000直接转换为uintptr,而不是通过unsafe。指针。我不知道解决这个问题是否能解决你剩下的问题。