为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨__羊羊 2023-07-04 16:47:34
我正在编写一个枚举进程基地址的函数。这是通过一些 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)}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

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



查看完整回答
反对 回复 2023-07-04
?
富国沪深

TA贡献1790条经验 获得超9个赞

我想通了这个问题。我与错误的人互动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)

}

我希望这可以帮助别人,我花了很多时间在这个功能上。


查看完整回答
反对 回复 2023-07-04
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信