C#内存编辑布尔值

问题描述:

我目前在一些游戏中玩弄内存,看看我能做什么,我有一个修改后的内存编辑类来满足我的需求,但是我无法编辑或读取布尔值这是造成我问题的值。该类可以帮助我通过钩子修改外部进程的值。C#内存编辑布尔值

写一个布尔值就是我想要做的最多,这是我一直尝试,但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; 
} 

我已经确定,布尔是问题,因为一切似乎很好地工作在这是程序出现失败的最后一步。 正如你可能告诉我,我真的不知道我在做什么(证据不起作用),但任何帮助将有所帮助,考虑到这一点,如果可能的话,请尝试以半简单的方式保留答案。

我相信我所提供的一切,但如果您需要任何更多信息请咨询:)

+1

如何在内存中构造“布尔”值取决于使用的平台和/或编程语言。通常它们被存储为整数0或1,但它们的大小可能不同,可能是1,2或4个字节(甚至可以看到8)。确保你的尺寸合适。 –

+1

'BitConverter'是一个用于序列化的辅助类,不是一种魔术方法,可以为您提供目标需要的字节。 “布尔”不是一个明确定义的类型,你需要知道在特定游戏中如何表示真值和假值(这取决于编译器,平台,“低级”攻击......)。 'BitConverter.GetBytes(bool)'给你一个零或一个字节的单个字节,它几乎不会成为你想要的。 – Luaan

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 ==至少是错误的。字节大小可能是您的主要问题 - 某些语言和系统使用4字节/浮点数,其他语言和系统1因此您可能需要适当调整代码(例如,如果其他进程使用4字节布尔值,则您的ReadBool方法有效)。