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;
}
我已经确定,布尔是问题,因为一切似乎很好地工作在这是程序出现失败的最后一步。 正如你可能告诉我,我真的不知道我在做什么(证据不起作用),但任何帮助将有所帮助,考虑到这一点,如果可能的话,请尝试以半简单的方式保留答案。
我相信我所提供的一切,但如果您需要任何更多信息请咨询:)
答
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方法有效)。
如何在内存中构造“布尔”值取决于使用的平台和/或编程语言。通常它们被存储为整数0或1,但它们的大小可能不同,可能是1,2或4个字节(甚至可以看到8)。确保你的尺寸合适。 –
'BitConverter'是一个用于序列化的辅助类,不是一种魔术方法,可以为您提供目标需要的字节。 “布尔”不是一个明确定义的类型,你需要知道在特定游戏中如何表示真值和假值(这取决于编译器,平台,“低级”攻击......)。 'BitConverter.GetBytes(bool)'给你一个零或一个字节的单个字节,它几乎不会成为你想要的。 – Luaan