0

我想将当前程序的虚拟内存内容打印0x100000x50000 (我的系统上包含系统调用蹦床的区域)

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是唯一的方法吗?

4

2 回答 2

2

您可以将该地址转换为字节切片,然后可以将其传递给任何Write方法。

要将地址转换0x10000为长度为 的字节片0x30000,您可以使用

mem := (*[1 << 30]byte)(unsafe.Pointer(uintptr(0x10000)))[:0x30000:0x30000]

如果大小始终是静态的,您只需将数组设置为适当的大小即可开始

mem := (*[0x30000]byte)(unsafe.Pointer(uintptr(0x10000)))[:]
于 2017-02-13T17:42:04.393 回答
1

您面临的直接问题是您应该将 0x10000 直接转换为 uintptr,而不是通过 unsafe.Pointer。我不知道修复它是否会解决您的其余问题。

于 2017-02-13T17:14:30.710 回答