C#Memory Editing Booleans

时间:2017-07-27 10:29:21

标签: c# memory process editing

我目前正在玩一些我玩的游戏来看看我能做什么,我有一个修改过的内存编辑类来满足我的需要但是我无法编辑或读取导致的布尔值我的问题。该类帮助我通过钩子修改外部进程的值。

写一个bool值是我最想做的事情,这就是我的尝试但TBH我不知道它有什么问题

public bool WriteBool(int Address, bool Value)
{
    byte[] bArray = BitConverter.GetBytes(Value);
    bool flag = Process_MemoryReaderWriter.WriteProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 2, 0);
    return flag;

}

我还需要阅读一些布尔值,这是我尝试过的;

public bool ReadBool(int Address)
{
    IntPtr intPtr = IntPtr.Zero;
    byte[] bArray = new byte[4];
    IntPtr intPtr1 = intPtr;
    Process_MemoryReaderWriter.ReadProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 2, out intPtr1);
    int rBInt = BitConverter.ToInt32(bArray, 0);
    int num = rBInt;
    bool boolValue = num != 0;
    return boolValue;
}

我已经确定布尔值是问题,因为其他一切似乎工作得很好,这是程序似乎失败的最后一步。 你可能会告诉我,我真的不知道我在做什么(证据不起作用),但任何帮助都会有所帮助,如果可能,请考虑以半简单的方式保持答案。< / p>

我相信我提供了一切,但如果您需要更多信息,请询问:)

1 个答案:

答案 0 :(得分:0)

BitConverter.GetBytes(bool)返回一个大小为1的字节数组,而看起来像WriteProcessMemory和ReadProcessMemory期望大小为2的字节数组(每个的第四个参数)。将这些更改为1应解决该问题。此外,BitConverter还有一个ToBoolean方法,因此对于阅读,您可以执行以下操作:

public bool ReadBool(int Address)
{
    IntPtr intPtr = IntPtr.Zero;
    byte[] bArray = new byte[1];
    Process_MemoryReaderWriter.ReadProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 1, out intPtr);
    return BitConverter.ToBoolean(bArray, 0);
}

您也知道,其他系统如何处理布尔值的定义并不明确,但您应该安全地假设至少0 == false。字节大小可能是您的主要问题 - 某些语言和系统使用4个字节/浮点数,其他1个,因此您可能需要根据需要调整代码(例如,如果其他进程使用4个字节的bool,则ReadBool方法有效)。 / p>