dpl3350 2019-07-17 04:59
浏览 128
已采纳

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

I am writing a function that enumerates the base address of a process. This is done through a few Windows API calls, however, I believe it's my call to EnumProcessModules that is creating the error.

It should also be noted that this error does not occur for every process.

I have already tried changing around some of the uint32 to uint64 and vice versa, and different ways of creating the moduleHandles array, but I can't get anything working.

This is just one function in an application I'm creating to retrieve and scan another process's memory.

This is the source code of my function:

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条回答 默认 最新

  • doutang1992 2019-07-17 05:58
    关注

    I figured out the issue. I was interacting with the EnumProcessModules incorrectly. Here's a working function:

    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)
    }
    

    I hope this can help someone, I spent a lot of time working on this function.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?