我需要从具有给定进程名/id、指针和偏移量的另一个进程的内存中读取值,并将其实时输出给用户,我已经找到了另一个问题并成功地实现了从进程内存的给定地址读取和转换浮点值的逻辑,但是由于每次重新加入游戏时地址都在变化,所以我需要计算它。我使用欺骗引擎找到了指针和进程偏移量:
根据我所理解的阅读理论,需要使用以下算法来计算最终地址:
我对步骤2、3和4没有问题:我可以在地址处使用和十六进制数和读取进程存储器,但是我不知道如何使用偏移量来计算第一个地址,如何在Go中做到这一点?我想在Windows 10上做这个
更新:-我尝试了从这个问题代码,但它返回不正确的基址。我得到7ff611530000,而作弊引擎中的实际基址是1A009A6AB70
更新2:可能很难理解我想做什么,所以我添加了另一张图片。我需要找到如何使这个“加法”操作和如何找到红方格的地址(绿色可以计算,紫色是常数)。
发布于 2022-06-19 07:13:16
为了查找另一个进程的地址和读取值,必须根据进程的偏移量和基地址计算它。在指针编辑器中,作弊引擎将读取地址值操作显示为十六进制+十六进制->地址。因此,每次您看到地址+偏移量->下一个地址,它意味着和地址和偏移量为十六进制(16),并在这个地址的读取值在进程内存。检索到的值是下一个地址,您应该使用该地址获取以下地址。重复此操作,直到到达最后一个偏移量为止,然后只需要和地址和偏移量,而不需要读取值。结果地址是值存储的位置。
如何找到基本地址?虽然它在欺骗引擎中似乎是常量(如果您输入0而不是02518790,每次重新启动进程时都会得到相同的地址),但它只是一个虚拟地址,不要使用它。相反,使用winapi使用EnumProcessModules迭代指定进程的所有模块。通过按窗口标题在运行的应用程序中搜索,可以找到PID。将模块的文件名与GetModuleFilenameExW进行比较。当您找到具有常量文件名的模块(在您的示例中为“UE4ame-Win64-Shipping.exe”)时,请使用GetModuleInformation检索LpBaseOfDll。不是EntryPoint,它不是基址。
现在您已经拥有了LpBaseOfDll,向其添加常量偏移量(02518790)并在结果地址处读取值。这是您应该用来运行循环和添加偏移量的起始地址。因此,图像上标注的“加法运算”是LpBaseOfDll和偏移量之和。实际上,欺骗引擎只接受没有偏移量的可执行名称,尝试将"kernel32.dll“放入address字段:)
要与虚拟内存交互,必须使用windows本机api (kernel32.dll)。与任何其他语言一样,Go有一个用于winapi的包装器。您可以在经典硬编码的"golang.org/x/sys/windows“、现代的和实验性的"github.com/Andoryuuta/kiwi”之间进行选择,但我建议您使用"github.com/0xrawsec/golang-win32/win32/kernel32".。
下面的代码演示了如何获取基本地址。我用完整的代码发布了GitHub要点,它可以根据名称查找进程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)
}
https://stackoverflow.com/questions/71716646
复制相似问题