通常情况下,我可以用这个方法写到一个进程。
WriteProcessMemory((int)processHandle, 0x01C0FE40, buffer, buffer.Length, ref bytesWritten);
但现在我的地址是这样的 "BlackOps.exe"+0208173C
的偏移量,也应该是 18
. 我怎么能写到它所指向的地址?这就算是一个指针吗?
EDIT:目标是向目标地址写入一个浮点数。上面的指针指向游戏的时标变量,用户使用程序可以改变它。
谢谢大家的帮助!
内置的Process和ProcessModule类可以给你模块的基本地址,然后你只需要加上相对偏移量,用一个叫FindDMAAddy()的多级指针函数去引用它,这个函数使用ReadProcessMemory。 这样就可以得到去引用每个指针并添加相应偏移量后的地址。
然后你只需对结果使用WriteProcessMemory()。
public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
var buffer = new byte[IntPtr.Size];
foreach (int i in offsets)
{
ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out var read);
ptr = (IntPtr.Size == 4)
? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i)
: ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
}
return ptr;
}
Process proc = Process.GetProcessesByName("BlackOps")[0];
IntPtr modBaseAddr = proc.MainModule.BaseAddress;
float newTimeScale = 1.0;
IntPtr timeScaleAddr = FindDMAAddy(proc.Handle, modBaseAddr + 0x208173c, new int[] { 0x18 });
WriteProcessMemory(hProc, timeScaleAddr, newTimeScale, 4, out _);
确保你以管理员身份运行,使用pinvoke获得对本地WinAPI函数的访问权,并检查返回值,如果需要,还可以使用Marshal.GetLastWin32Error()进行错误检查。