2017-07-27 35 views
0

我目前在一些遊戲中玩弄內存,看看我能做什麼,我有一個修改後的內存編輯類來滿足我的需求,但是我無法編輯或讀取布爾值這是造成我問題的值。該類可以幫助我通過鉤子修改外部進程的值。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

回答

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 ==至少是錯誤的。字節大小可能是您的主要問題 - 某些語言和系統使用4字節/浮點數,其他語言和系統1因此您可能需要適當調整代碼(例如,如果其他進程使用4字節布爾值,則您的ReadBool方法有效)。