1 回答

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)
}
- 1 回答
- 0 關注
- 305 瀏覽
添加回答
舉報