亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang根據進程句柄和偏移量計算另一個進程內存地址

Golang根據進程句柄和偏移量計算另一個進程內存地址

Go
莫回無 2022-11-28 10:16:41
我需要從具有給定進程名稱/ID、指針和偏移量的另一個進程的內存中讀取值并將其實時輸出給用戶,我已經發現了另一個問題并成功實現了從進程內存的給定地址讀取和轉換浮點值的邏輯, 但由于每次我重新加入游戲時地址都在變化,所以我需要計算它。我使用作弊引擎找到了指針和進程偏移量:根據我對閱讀理論的理解,需要使用以下算法計算最終地址:使用常量偏移量 (+02518790) 計算基地址 (1DC45993300)獲取此地址并向其添加指針值對從底部 (5E0) 到頂部 (2E4) 的每個指針值重復 2 步這是您可以用來檢索數據的最終地址我對第 2、3 和 4 步沒有問題:我可以對十六進制數求和并在地址處讀取進程內存,但我不知道如何使用偏移量來計算首地址,如何在 Go 中執行此操作?我正在嘗試在 Windows 10 上執行此操作更新:我嘗試了這個問題的代碼,但它返回了不正確的基地址。我得到 7ff611530000 而作弊引擎中的實際基地址是 1A009A6AB70更新 2:可能很難理解我要做什么,所以我添加了另一張圖片。我需要找到如何進行這個“加”操作以及如何在紅色方塊中找到地址(綠色可以計算,紫色是常量)
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

為了找到另一個進程的地址和讀取值,您必須根據進程的偏移量和基地址來計算它。作弊引擎在指針編輯器中顯示讀取地址值操作為 [hex + hex] -> address。因此,每次您看到 [address + offset] -> next address 時,這意味著將地址和偏移量相加為十六進制 (16) 并讀取進程內存中該地址的值。檢索到的值是下一個地址,您應該使用它來獲取下一個地址。重復此操作直到到達最后一個偏移量,然后只需將地址和偏移量相加而不讀取值。結果地址是存儲值的位置。

如何找到基地址?雖然它在 Cheat Engine 中似乎是常量(如果你輸入 0 而不是 02518790,每次重啟進程時你都會得到相同的地址),它只是一個虛擬地址,不要使用它。相反,使用 winapi 使用 EnumProcessModules 遍歷指定進程的所有模塊。您可以通過按窗口標題在正在運行的應用程序中搜索來查找 PID。將模塊的文件名與 GetModuleFilenameExW 進行比較。當您找到具有固定文件名的模塊(在您的情況下為“UE4Game-Win64-Shipping.exe”)時,使用 GetModuleInformation 檢索 LpBaseOfDll。不是 EntryPoint,它不是基地址。

現在您有了 LpBaseOfDll,向其添加常量偏移量 (02518790) 并在結果地址處讀取值。這是您應該用來運行循環和添加偏移量的起始地址。所以圖像上標記的“加操作”是 LpBaseOfDll 和偏移量的總和。事實上,Cheat Engine 只接受沒有偏移量的可執行文件名稱,嘗試將“kernel32.dll”放入地址字段:)

要與虛擬內存交互,您必須使用 windows 原生 api (kernel32.dll)。與任何其他語言一樣,Go 有一個 winapi 的包裝器。您可以在經典硬編碼“golang.org/x/sys/windows”、現代和實驗性“github.com/Andoryuuta/kiwi”之間進行選擇,但我建議您使用“github.com/0xrawsec/golang-win32/win32” /內核32”。

下面的代碼演示了如何獲取基地址。我發布了帶有完整代碼的GitHub gist,可以按名稱查找進程 ID 并讀取 float32 值。

package main


import (

    "fmt"

    "path/filepath"


    "github.com/0xrawsec/golang-win32/win32"

    kernel32 "github.com/0xrawsec/golang-win32/win32/kernel32"

    windows "golang.org/x/sys/windows"

)


func memoryReadInit(pid uint32) (int64, bool) {

    win32handle, _ := kernel32.OpenProcess(0x0010 | windows.PROCESS_VM_READ | windows.PROCESS_QUERY_INFORMATION, win32.BOOL(0), win32.DWORD(pid))

    moduleHandles, _ := kernel32.EnumProcessModules(win32handle)

    for _, moduleHandle := range moduleHandles {

        s, _ := kernel32.GetModuleFilenameExW(win32handle, moduleHandle)

        targetModuleFilename := "UE4Game-Win64-Shipping.exe"

        if(filepath.Base(s) == targetModuleFilename) {

            info, _ := kernel32.GetModuleInformation(win32handle, moduleHandle)

            return int64(info.LpBaseOfDll), true

        }

    }

    return 0, false

}


func main() {

    var pid uint32 = 0x38E4 // put PID here, you can find it in Cheat Engine process list

    baseAddress, _ := memoryReadInit(pid)

    fmt.Println("Base address is", baseAddress)

}


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 305 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號