下面教材開始教大家如何處理動態記憶體。
何謂動態記憶體?
當一個遊戲運行後,我們找出了他的血量所在的記憶體位址,
在關掉遊戲後再重開遊戲,再次取出來的血量記憶體位址,與之前的那次不同。
我們稱這種血量在記憶體中的位址會變化的稱為動態記憶體,即為非固定的意思。
注意,有些記憶體位址在本機上可能重運行進程時不變,到了別的機子上時卻會變,
這塈瓻媊酗j家裝雙作業系統進行測試,或做個虛擬系統進行測試動態記憶體也可以.
如何處理動態記憶體?
第一種,找出基址與偏移量.通過該 基址+偏移量 得到要讀寫資料的記憶體位址
第二種,固定動態記憶體,完全的使用修改彙編指今,使該動態記憶體固定到某處記憶體位址去。
這種屬於高級技術,需要精通彙編調試的技術
目前市面上的網路遊戲,或多或少是有動態記憶體的,製作出售外掛明令屬於違法的,
本站雖做為外掛技術交流的網站,但也不能隨便的拿某個遊戲進行講解.
所以,本站的教材對應的例子與測試程式都是用易語言編的,我們假設這些用來測試用的例副程式有動態記憶體這個特性,
然後讓我們一起來學習應該如何去做,如何去處理。
下面一起做個例子,學習一下如何用CE進行查找記憶體,並再查找到這個記憶體的基址.
用CE對本節例子堛煽試程式進行文本查找.
運行例子,然後用CE打開這個例子的進程,查找文本類型資料
這個內容,能找到三個記憶體位址, 這三個位址,有一個是綠色的,說明這個記憶體位址是在EXE或某個DLL模組檔中的.
把這三個位址加入到下方,雙擊這個綠色的 1013c304 位址,
可以看到該記憶體位址是存在於 krnln.fne+13C304 處,
這堛 krnln.fne 是DLL模組檔, 13C304 是偏移量 .因為DLL在進程運行時被裝載的位址不一定都是固定的,
所以對於這類的記憶體,我們需要先取得該DLL的記憶體位址,再加上這個偏移量,就能對它進行記憶體讀 寫操作了,
例 取模組控制碼("krnln.fne")+0x13c04 即是.
在找到的這三個記憶體位址後,我們需要進行測試,哪個位址是可用的.這奡ㄔ雂@下,
一般綠色的記憶體位址往往都是固定的靜態位址.為了驗證 krnln.fne+13C304 記憶體位址是否可以使用,我修改了他的值,
結果發現測試程式媗膆靰漱憟誘漁e並沒有發生變化,說明該記憶體位址無用.
雙擊資料值,進行修改,OD後發現測試程式中的顯示內容沒有被改變,
說明該記憶體位址無用
現在還有兩個記憶體位址 009970C8 與 00997208 .這兩個位址都不是綠色的,說明這兩個記憶體位址都是動態的,
即程式運行時,通過向系統申請來的記憶體保存的資料,
因為申請記憶體時的位址一般都是由系統隨機分配的,所以就是動態的了.
用上面的方法,把這兩個位址中的資料都進行修改看看,改哪個位址時,測試程式中的內容也會跟著變化?
此時就能說明這個記憶體位址是可用的.結果發現,這兩個地址都無法修改,一改了之後馬上又變回來了.
難道可用的記憶體位址沒有搜出來?看來得重新搜了,把記憶體掃描選項媬麍 全部 ,
避免出現漏網之魚,結果搜出來了四個記憶體位址的結果.
0014D1C0 是可用的記憶體位址,修改他的值,測試程式奡N會馬上反應出來
修改該處記憶體中的資料,程式中立即被更新.
顯然這個記憶體位址是可用的,但前面也提到過,搜出來的位址若不是綠色的,
就不是靜態記憶體.顯示我們不能直接使用這個記憶體位址了,
因為這個軟體到了別的機子上運行時,可能就會變成別的位址了.
現在我們要找到這個記憶體位址的上級位址,也稱父級位址.父級位址中保存著這個記憶體位址值.
搜出了三個父級地址,要命的是這三個全是黑色的,也都是動態的.
把這三個新找出來的父級位址,保存到下面,然後再次搜這三個父級地址的更上面的父級地址.
新的三個父級位址,只有 009A0D50 這一個可用,
因為只有這個位址能搜到更上層的父級位址
搜 009A0D50 得到了好多個新的父級位址,並且這些新的位址還全是綠色的,根據綠色是靜態位址的概念.
這次所搜出來的那麼多的位址,也可以稱為基址.基址就是不變了的位址,
可以通過這個基址從而得到其他某些資料的可用記憶體位址,然後再讀寫那些記憶體資料.
那麼多個基址,一般我們只要選用最上面的那個綠色的地址即可. 把這個位址雙擊添加到下面..
然後我們要進行手動添加位址了.瞭解一下如何使用基址來得到我們需要的記憶體資料 .
添加用基址來讀取記憶體資料的方式.
找到的基址,也知道了偏移量,下面就可以編讀寫該記憶體資料的代碼了.
根據分析出來的基址與兩個0的偏移量讀文本記憶體的代碼.
寫記憶體文本值的代碼.
這堛滌穨}與偏移,基本上照抄CE上分析的結果就是.
需要注意的是對於像文本型這種長度會變化的資料時,
讀取與寫入都要注意長度,不能超長,會導致讀寫失敗.
對於像這種通過基址再得到真實的記憶體位址情況時,
我們可以直接修改基址堜珓O存的那個可用的記憶體位址為另外一個記憶體位址,
這樣遊戲程式就會傻傻的去讀別處我們指定的資料了.
通過這種方式可以達到擴大一些原本資料記憶體長度有限制的突破. |