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

我正在编写一个枚举进程基地址的函数。这是通过一些 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)

}


杨__羊羊
浏览 141回答 2
2回答

智慧大石

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

富国沪深

我想通了这个问题。我与错误的人互动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)}我希望这可以帮助别人,我花了很多时间在这个功能上。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go