2017-02-13 34 views
0

我想打印當前程序的虛擬內存內容從0x100000x50000(在我的系統上包含系統調用蹦牀的區域)如何fmt.Println()內存不是由go程序分配的?

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

+0

我在golang認識。我知道這可以被認爲是越界讀取,但這是需要知道是否啓用了特定的系統調用。 – user2284570

回答

2

您可以將該地址轉換爲一個字節片段,然後將其傳遞給任何Write方法。

要地址0x10000轉換爲字節的片與0x30000的長度,你可以使用

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

如果大小始終是靜態的,你可以在陣列只設置到適當大小,開始

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

該部分是什麼?[1 << 30]字節是指什麼? – user2284570

+0

@ user2284570:這是一個數組類型,大小爲'1 << 30' – JimB

+0

有沒有辦法在沒有syscall包的情況下打印這種數組? – user2284570

1

您面臨的直接問題是您應該直接將0x10000轉換爲uintptr而不是通過unsafe.Pointer。我不知道解決這個問題是否能夠解決您的其他問題。

+0

謝謝,有沒有辦法用'fmt.Printf()'或'syscall.Write()'而不是直接使用'syscall.Syscall'? – user2284570

+0

它看起來像JimB的答案涵蓋了它。 – andybalholm