登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-14 08:00:36 219浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《调用 EnumProcessModules 时出现“意外的故障地址”》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我正在编写一个枚举进程基地址的函数。这是通过一些 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 的交互不正确。这是一个工作函数:

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
    moduleHandles := make([]uintptr, 1024)
    var needed int32
    const handleSize = unsafe.Sizeof(moduleHandles[0])

    ret, _, _ = procEnumProcessModules.Call(uintptr(handle), uintptr(unsafe.Pointer(&moduleHandles[0])), handleSize*uintptr(len(moduleHandles)), 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),即使您只是想确定所需条目数。

今天关于《调用 EnumProcessModules 时出现“意外的故障地址”》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>