游戲外掛原理解析與制作 - [內存數值修改類 篇三]


  上篇說到我們已經通過代碼首次掃描,得到所有值=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 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM