我正在尝试读取进程(游戏)中的float
。
查看作弊引擎,我可以找到所需的地址,但是它位于wow64cpu.dll + 4720
,偏移量为34。
因此,我尝试在此过程中找到wow64cpu.dll的基地址,但这是我很困惑的地方。
我不知道现在如何使用此地址,因为我的所有尝试似乎都遥遥无期。
Process[] processes = Process.GetProcessesByName("Napoleon");
Process process = processes[0];
ProcessModuleCollection modules = process.Modules;
ProcessModule dllBaseAdress = null;
foreach (ProcessModule i in modules)
{
if (i.ModuleName == "wow64cpu.dll")
{
dllBaseAdress = i;
break;
}
}
IntPtr dllPtr = dllBaseAdress.BaseAddress;
int pointer = dllPtr.ToInt32() + 0x4720;
int offset = 34;
IntPtr hProc = OpenProcess(ProcessAccessFlags.All, false, process.Id);
int bytesRead;
byte[] buffer = new byte[4];
ReadProcessMemory(hProc, new IntPtr(pointer + offset), buffer, 4, out bytesRead);
float lightColourScale = BitConverter.ToSingle(buffer, 0);
我的问题是,使用DLL的基地址或在其他地方可能出错,我不确定如何使用它来查找我的地址?
我也在x64中编译了该程序,否则它将找不到wow64cpu.dll。
谢谢
您的偏移量必须添加到在wow64cpu.dll + 4720
位置读取的指针上,因此,如果您的地址正确,则浮点数的位置将位于[wow64cpu.dll + 4720] + 30
。
您的代码为
// Set the addresses to read
var pointer = dllPtr.ToInt32() + 0x4720;
var offset = 34;
// Initialize the buffers
var buffer = new byte[4];
// Find the pointer
ReadProcessMemory(hProc, new IntPtr(pointer), buffer, 4, out bytesRead);
pointer = BitConverter.ToInt32(buffer, 0);
// Add the offset to the value previously found
ReadProcessMemory(hProc, new IntPtr(pointer + offset), buffer, 4, out bytesRead);
var lightColourScale = BitConverter.ToSingle(buffer, 0);
但是,手动调用所有这些功能确实很痛苦。我强烈建议您使用注入库,为您包装所有这些调用。
MemorySharp库适合您(我是作者)。您可以编写以下代码。
using (var memory = new MemorySharp(ApplicationFinder.FromProcessName("Napoleon").First()))
{
var myValue = memory.Read<float>(memory["wow64cpu.dll"].Read<IntPtr>(4720) + 34, false);
}
Cheat Engine以十六进制形式给出其值。您在使用它们之前是否将它们转换为dec?
另外,另一个问题与您的问题相似:Find address using pointer and offset C#
从偏移的角度看,这听起来很棒。但是,如果我尝试从作弊引擎中查找静态偏移的值,该怎么办。例如,我知道使用VAMemory可以仅使用
查找字符串。var playername = VAM.ReadByteArray((IntPtr)0x10971500,0x15);
0x10971500是Cheat Engine的静态偏移量,0x15是读取的字节。如何与MemorySharp一起使用?