上篇说到我们已经通过代码首次扫描,得到所有值=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 。