前三篇的博文結合了C#的Demo對記憶體數據修改一類的掛剖析了原理,利用C#語言調用Windows API,我們其實已經寫出了一個簡單的記憶體掃描工具,但是它存在一些缺陷,比如說只能所搜索單一類型數值(整型),只能搜索確定的數值,比如1000、2000,而不能進行模糊搜索,比如搜索某個值變小了,或者在某 ...
前三篇的博文結合了C#的Demo對記憶體數據修改一類的掛剖析了原理,利用C#語言調用Windows API,我們其實已經寫出了一個簡單的記憶體掃描工具,但是它存在一些缺陷,比如說只能所搜索單一類型數值(整型),只能搜索確定的數值,比如1000、2000,而不能進行模糊搜索,比如搜索某個值變小了,或者在某某區間內變化了等。
我一直認為語言只是一種工具,只要能夠達到修改數值的目的,用什麼語言都可以,甚至可以配合著多種語言和工具來完成一項數值的修改。其實實際中通常都是這樣,因為每種語言有自己的優勢,比如C語言/易語言這類非托管的語言對底層操作的許可權非常之大,特別是易語言,容易上手加上不少人已經封裝了大量的操作底層的模塊,而C#、Java等優勢就表現在應用層的封裝,API的靈活調用。合理的利用語言的優勢在它們擅長的領域,對技術保持開放的心態,不被拘束在語言層面才能對各種游戲進行剖析。
接下來的幾篇文章重點教學[Cheat Engine]這款記憶體修改器,類似的還有OD、金山游俠(這款工具沒有研究的意義,功能單一化、對於指針和彙編的理解幫助頗少),我們自己封裝工具耗費時間的成本實際上是很高的,而且這些工具已經擁有很強大的功能了,我們可以利用這些工具更好的理解原理。
本章先講一下簡單的使用,我們這次就不寫Demo了,直接找一個小游戲進行測試。
這個是三目童子,我小時候在小霸王游戲上玩的。
我們目前看到的信息有:
6格血 0個金幣 2條命
這就是我們肉眼能看到的一些信息,還有人物坐標、裝備道具等是目前無法看到但真實存在的數值。
現在我們打開CE:
下圖是它的主界面:
我這個是比較老的版本了,首先點擊圖標,打開選擇進程的界面。
從圖標或者進程名稱中可以看到,我用綠色框出來的這個進程就是我們三目童子的游戲進程。
這一步的目的很明顯就是獲取該游戲進程的PID和句柄Handle。
我們點擊打開,打開之後可以看到右側控制項已經變為可用狀態了。
接下來我們就來嘗試搜索一下血量(6)這個數值
我們在值中輸入6,點擊首次掃描,在左側顯示如下的列表,可以看到整個記憶體塊中有2801個值為6 的地址。
現在採用上一章節提到的方法,使得6這個值發生變化,我們去撞一下小兵:
可以看到血量變成5格了
此時把值修改成5後,點擊再次掃描:
下圖是搜索結果,沒有找到對應的地址, 可以看到數量是 0
這就尷尬了,其實是因為我們的數值類型選擇的是4位元組,CE打開預設4位元組搜索就是整形數,而以前的游戲機不比現在有那麼高的存儲容量,一般能以位元組存放的變數就定義為BYTE,所以我們重新開始搜索,點擊新的掃描,然後下拉掃描類型為位元組。
此時按下首次掃描,得到以下掃描結果
可以看到 位元組形式存放的變數高達68696個,我們繼續撞一下小兵
好了,這下變成4格血量了,我們把CE需要掃描的值改為4,然後點擊再次掃描
找到4個結果
其中 地址0x2D00044 的值一直在變化,我們可以排除這個地址
那麼在剩下的三個地址中有沒有存放血量的地址呢,我們繼續改變血量
血量變成三個格子了,我們對3再次進行搜索
結果如下圖:
現在就剩下一個地址0x2D00092中存放的位元組值為3,我們來確定下這個地址是否是血量存放的地址,我們點擊該地址
然後點擊箭頭圖標把他添加到待操作的地址列表中
雙擊此記錄的值
我們把值修改為6,我們再來看下游戲中的血量是否跟著變化了,註意界面上的血量可能沒有立刻跟著變化,因為這類游戲只有在血量發生變化的時候才會去讀取顯示它的值,所以我們需要再去撞一下怪。
可以看到血量變成5格了,這說明修改成功了(修改6格血量後,撞一下怪減了一格血量,所以剩5格),我們再來看下CE的界面
沒有問題,數值顯示5,這樣的話我們就跟著CE這款工具完成了一次最基礎數據的修改。大家看其實和我們寫代碼修改用的原理是一樣的,就像破解WIFI密碼一樣,窮舉對比,找到正確的地址或密碼。
下一節講解動態地址指針和偏移的查找。
PS:轉載請附帶原文路徑:http://www.cnblogs.com/lene-y/p/7252446.html ,我已委托“維權騎士”為我的文章進行維權行動。
歡迎關註微信公眾號[游戲外掛原理解析與製作],對本文有不理解的地方或者不同的觀點可以給我留言,互相交流 共同進步。
掃碼關註公眾號