C# 内存编辑布尔值
C# Memory Editing Booleans
我目前正在玩一些我玩的游戏,看看我能做什么,我有一个修改过的内存编辑 class 来满足我的需要,但是我无法编辑或读取导致我出现问题的布尔值。 class 帮助我通过钩子修改外部进程的值。
写入 bool 值是我最想做的,这是我尝试过的,但我不知道它有什么问题
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)
returns 一个大小为 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 bytes/float,其他语言和系统使用 1,因此您可能需要适当调整代码(例如,如果其他进程使用 4 字节布尔值,则您的 ReadBool 方法有效) .
我目前正在玩一些我玩的游戏,看看我能做什么,我有一个修改过的内存编辑 class 来满足我的需要,但是我无法编辑或读取导致我出现问题的布尔值。 class 帮助我通过钩子修改外部进程的值。
写入 bool 值是我最想做的,这是我尝试过的,但我不知道它有什么问题
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)
returns 一个大小为 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 bytes/float,其他语言和系统使用 1,因此您可能需要适当调整代码(例如,如果其他进程使用 4 字节布尔值,则您的 ReadBool 方法有效) .