上篇說到我們已經通過代碼首次掃描,得到所有值=1000的內存地址,並將它們存入了集合中。
附上鏈接:http://www.cnblogs.com/lene-y/p/7107526.html。
Demo界面:

首次掃描結果:

然后我們再從這32個結果中找到我們真正需要的那個變量地址。
- 點擊修改Button改變變量value的數值:

此時變量value=789,我們通過再次讀取32個結果地址中的數據來進一步篩選,進行二次搜索:
/// <summary> /// 繼續搜索 /// </summary> /// <param name="Value">在這里填入改變后的數值</param> public void ContinueSearch(int Value = 789) { int ReadSize = -1; byte[] FindArray = new byte[4]; //臨時地址字典 key=內存地址 value=存放數值 Dictionary<int,int> TempAddressList = new Dictionary<int,int>(); foreach (int Address in AddressList) { //因為知道是整數型,所以4字節確定了 if (ReadProcessMemory(hProcess, (IntPtr)Address, FindArray, 4, out ReadSize)) //如果讀取的字節數無誤 if (ReadSize == 4) { //處理數據[對比分析] if (CompareData(FindArray, Address, Value)) { TempAddressList.Add(Address, Value); } } } }
取出值=789的地址:
/// <summary> /// 再次對比第一次搜索結果的地址中存放的值與輸入值是否一致 /// </summary> /// <param name="DataArray">讀取到的字節數組</param> /// <param name="Address">地址</param> /// <param name="Value">游戲中的實際數值</param> /// <returns>是否一致</returns> public bool CompareData(byte[] DataArray, int Address, int Value) { int num = BitConverter.ToInt32(DataArray, 0); if (num == Value) { return true; } else { return false; } }
調試輸出下結果:

可以看到4字節{21,3,0,0}一個整形為789,地址:41632768。
十六進制表示0x27B4400:

現在只有一個地址符合,那么這個0x27B4400極有可能是我們所尋找的地址,一般情況下建議照着上面再修改一次,確保0x27B4400的值的確跟隨變化了,我這里就不再重復演示了。
好了,得到地址不是我們的最終目的,最終目的是修改該地址的數值:
/// <summary> /// 將自定義數值寫入內存 /// </summary> /// <param name="Address">內存地址</param> /// <param name="Value">自定義數值</param> /// <returns>是否寫入成功</returns> public bool WriteValue2Address(int Address,int Value) { int WriteSize = -1; byte[] WriteArray = BitConverter.GetBytes(Value); if (WriteProcessMemory(hProcess, (IntPtr)Address, WriteArray, 4, out WriteSize)) { //如果和實際寫入字節數一樣提示成功 if (WriteSize == 4) { Console.WriteLine("血量寫入成功!"); return true; } else { return false; } } else { return false; } }
來看下效果:

這是原來的界面:

點擊刷新后:

以上,最基礎的一套修改流程就結束了。
PS:轉載請附帶原文路徑:http://www.cnblogs.com/lene-y/p/7118515.html 。
