gpt4 book ai didi

go - 调用 EnumProcessModules 时出现“意外故障地址”

转载 作者:数据小太阳 更新时间:2023-10-29 03:08:23 29 4
gpt4 key购买 nike

我正在编写一个枚举进程基地址的函数。这是通过几个 Windows API 调用完成的,但是,我相信是我对 EnumProcessModules 的调用造成了错误。

还应注意,并非每个进程都会出现此错误。

我已经尝试将一些 uint32 更改为 uint64,反之亦然,以及创建 moduleHandles 数组的不同方法,但我无法使任何工作正常进行。

这只是我正在创建的用于检索和扫描另一个进程内存的应用程序中的一个函数。

这是我的函数的源代码:

func getBaseAddress(handle uintptr) int64 {
// GetProcessImageFileNameA
var imageFileName [200]byte
var fileSize uint32 = 200
var fileName string

ret, _, _ := procGetProcessImageFileNameA.Call(handle, uintptr(unsafe.Pointer(&imageFileName)), uintptr(fileSize))

for _, char := range imageFileName {
if char == 0 {
break
}

fileName += string(char)
}

fileName = fileName[24:]

// EnumProcessModules
var n uint32
var needed uint64

ret, _, _ = procEnumProcessModules.Call(handle, 0, uintptr(n), uintptr(unsafe.Pointer(&needed)))

moduleHandles := make([]syscall.Handle, int(needed))

if ret == 1 && needed > 0 {
ret, _, _ = procEnumProcessModules.Call(handle, uintptr(unsafe.Pointer(&moduleHandles)), uintptr(needed), uintptr(unsafe.Pointer(&needed)))
}

// GetModuleFileNameExA
var finalModuleHandle uintptr

for _, moduleHandle := range moduleHandles {
if moduleHandle > 0 {
var moduleFileName [200]byte
var moduleSize uint32 = 200
var moduleName string

ret, _, _ = procGetModuleFileNameExA.Call(handle, uintptr(moduleHandle), uintptr(unsafe.Pointer(&moduleFileName)), uintptr(moduleSize))

if ret != 0 {
for _, char := range moduleFileName {
if char == 0 {
break
}

moduleName += string(char)
}

moduleName = moduleName[3:]

if moduleName == fileName {
finalModuleHandle = uintptr(moduleHandle)
break
}
}
}
}

return int64(finalModuleHandle)
}

最佳答案

EnumProcessModules 的第二个参数不能是空指针 (0),即使您只是想确定所需的条目数也是如此。

关于go - 调用 EnumProcessModules 时出现“意外故障地址”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57068772/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com