在C#中写入一个指针地址

问题描述 投票:0回答:1

通常情况下,我可以用这个方法写到一个进程。

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

但现在我的地址是这样的 "BlackOps.exe"+0208173C 的偏移量,也应该是 18. 我怎么能写到它所指向的地址?这就算是一个指针吗?

EDIT:目标是向目标地址写入一个浮点数。上面的指针指向游戏的时标变量,用户使用程序可以改变它。

谢谢大家的帮助!

c# pointers
1个回答
0
投票

内置的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()进行错误检查。

© www.soinside.com 2019 - 2024. All rights reserved.