通常情况下,我可以使用以下方法写入进程:
WriteProcessMemory((int)processHandle, 0x01C0FE40, buffer, buffer.Length, ref bytesWritten);
但现在我的地址看起来像"BlackOps.exe"+0208173C
,它也应该有18
的偏移量。我怎样才能写出它指向的地址?这甚至是指针吗?
编辑:目标是将浮点数写入目标地址。上面的指针指向游戏时间尺度变量,用户可以使用该程序进行更改。
感谢您的帮助!
答案 0 :(得分:0)
内置的Process和ProcessModule类可以为您提供模块的基址,然后您只需添加相对偏移量,即可使用称为ReadDMAAddy()的多级指针函数(使用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()(如果需要)以进行错误检查。