游戏外挂原理解析与制作 - [内存数值修改类 篇三]

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

 

posted @ 2017-07-05 20:52  leneing  阅读(5115)  评论(0编辑  收藏  举报