我正在使用Go语言操作Windows进程,首先通过使用ReadProcessMemory
读取其他进程的内存。
然而,对于大多数地址,我得到了Error: Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
的错误。也许我的参数列表是错误的,但我找不到原因。
有人能指出我在这里做错了什么吗?
package main
import (
"fmt"
)
import (
windows "golang.org/x/sys/windows"
)
func main() {
handle, _ := windows.OpenProcess(0x0010, false, 6100) // 0x0010 PROCESS_VM_READ, PID 6100
procReadProcessMemory := windows.MustLoadDLL("kernel32.dll").MustFindProc("ReadProcessMemory")
var data uint = 0
var length uint = 0
for i := 0; i < 0xffffffff; i += 2 {
fmt.Printf("0x%x\n", i)
// BOOL ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
ret, _, e := procReadProcessMemory.Call(uintptr(handle), uintptr(i), uintptr(data), 2, uintptr(length)) // read 2 bytes
if (ret == 0) {
fmt.Println(" Error:", e)
} else {
fmt.Println(" Length:", length)
fmt.Println(" Data:", data)
}
}
windows.CloseHandle(handle)
}
a := &data[2]
不是data
的有效偏移量,因为它的长度只有 2。除此之外,回答很棒,+1。 - thwdint32
的指针(鉴于LPDWORD
类型)——它看起来是一个输出参数,用于表示实际读入缓冲区的字节数。 - James Henstridge