写入C#中的指针地址

时间:2015-02-02 06:15:13

标签: c# pointers

通常情况下,我可以使用以下方法写入进程:

WriteProcessMemory((int)processHandle, 0x01C0FE40, buffer, buffer.Length, ref bytesWritten);

但现在我的地址看起来像"BlackOps.exe"+0208173C,它也应该有18的偏移量。我怎样才能写出它指向的地址?这甚至是指针吗?

编辑:目标是将浮点数写入目标地址。上面的指针指向游戏时间尺度变量,用户可以使用该程序进行更改。

感谢您的帮助!

1 个答案:

答案 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()(如果需要)以进行错误检查。