如何 fmt.Println() 没有被 go 程序分配的内存?
How to fmt.Println() memory not allocated by the go program?
我想打印当前程序的虚拟内存内容,从 0x10000
到 0x50000
(我系统上包含系统调用蹦床的区域).
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
是唯一的方法吗?
您面临的直接问题是您应该将 0x10000 直接转换为 uintptr,而不是通过 unsafe.Pointer。我不知道解决这个问题是否能解决您剩下的问题。
您可以将该地址转换为一段字节,然后可以将其传递给任何 Write
方法。
要将地址 0x10000
转换为长度为 0x30000
的字节片,您可以使用
mem := (*[1 << 30]byte)(unsafe.Pointer(uintptr(0x10000)))[:0x30000:0x30000]
如果大小始终是静态的,您只需将数组设置为合适的大小即可开始
mem := (*[0x30000]byte)(unsafe.Pointer(uintptr(0x10000)))[:]
我想打印当前程序的虚拟内存内容,从 0x10000
到 0x50000
(我系统上包含系统调用蹦床的区域).
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
是唯一的方法吗?
您面临的直接问题是您应该将 0x10000 直接转换为 uintptr,而不是通过 unsafe.Pointer。我不知道解决这个问题是否能解决您剩下的问题。
您可以将该地址转换为一段字节,然后可以将其传递给任何 Write
方法。
要将地址 0x10000
转换为长度为 0x30000
的字节片,您可以使用
mem := (*[1 << 30]byte)(unsafe.Pointer(uintptr(0x10000)))[:0x30000:0x30000]
如果大小始终是静态的,您只需将数组设置为合适的大小即可开始
mem := (*[0x30000]byte)(unsafe.Pointer(uintptr(0x10000)))[:]