什么是游戲基址?
游戲基址是保持恆定的兩部分內存地址的一部分並提供一個基准點,從這里可以計算一個字節數據的位置。基址伴隨着一個加到基上的偏移值來確定信息准確的位置(絕對地址)。
全局基址 一級基址 二級基址 三級基址的關系:
第一步、計算機內存一般分為四級存儲。(印象里好像是四級)。
第二步、在最底下的,往往是游戲的全局基址(決定用戶界面以及一些細節等)和一些響應用戶操作而對應實施的命令。
第三步、該是傳遞基址了。現在網游的基址往往是動態的。這個是因為底層的基址不會直接傳遞給上一級內存。它會加上一個偏移量,然后再傳遞。這個傳遞就是指針了。
第四步、當傳遞到第四層的時候,就會表現在游戲的用戶界面。
在本例中使用的是:間接尋址
指令的地址字段不是操作數的真實地址,而是操作數的有效地址所在的存儲單元的地址。即操作數地址的地址。
"----->"表示"指針指向"
基址(存放的內容是一級基址起始地址)——>一級基址(存放的內容是二級基址的起始地址:假定為a)
[一級基址(a) + 偏移量]------>二級基址(存放的內容是三級基址的起始地址:假定為b);
[二級基址(b)+偏移量]-------->三級基址
三級基址-------->游戲界面
自己制作游戲修改器必須要找到一級基址
注意:對於單機游戲 ,游戲基址是不變的。對網絡游戲, 更新時可能會變。(因此才會有游戲更新后,某外掛不可以使用。其本質可能是基址改變的。)
另外,所謂的游戲的基址存在於虛擬內存中,比如基址為0x006A9EC0。
問題:基址無非就是一塊內存,同時基址又不可以改變,如果計算機中該塊內存被占用了,然后再安裝基址為0x006A9EC0的游戲,此時會不會寫入失敗,造成無法安裝呢?
解析:不會,基址0x006A9EC0是虛擬內存,會經過頁面地址重地位,將虛擬地址轉換成本機的物理地址,即不存在地址沖突問題。即使十個游戲的基址都是0x006A9EC0都不會存在沖突問題。
了解基址后,接下來看看如何尋找游戲基址。
工具:Cheat Engine (內存修改器)或Ollydbg。本實例用CE。。。。
例子:植物大戰僵屍--英文原版
說明:利用陽光值,來一步一步深入尋找游戲基址。因為陽光值可以看到,可以改變。也可以通過金幣等其他方式。
首先,打開游戲和CE工具,將游戲的進程加載進CE工具中。
將當前游戲的陽光值,填入搜索數值中,此時發現出現很多值。
注意:在CE工具中,綠色代表靜態地址,紅色代表上一次操作改變的地址,黑色代表動態地址但上一次操作沒有改變。而要找的基址就是靜態基址。
返回游戲,種植植物或攝取陽光,改變陽光值,再一次輸入到搜索框中,點擊“再次掃描”。此時發現只有一個值。(可能也會很多值,可以進行反復改)
那么問題來了,這個值到底是不是代表陽光的地址呢?
將搜索到值雙擊或點旁邊的紅色箭頭,將值加載到下方的框中,雙擊數值,將會出現下圖,然后進行修改,再觀察游戲的陽光值是否被改變。如何改變了,說明已找對了。(當然,在尋找到多個值的時候也可以進行其中的某些值修改,從而排除一些可能。)
右擊該值,選中“找出是什么訪問了這個地址”或是“找出是什么改寫了這個地址”,注意:如果點擊了“找出是什么改寫了這個地址”,進去是空白的,此時要返回游戲,改變陽光值,才會出其他數值。因此當時游戲處於暫停狀態,沒有數據寫入。
進去后,可能有多個值進行了訪問或只有一個。記住,只找含有 “mov”的指令,同時從上到下找第一個(CE工具會推薦可能性最大的在前面)。
雙擊進去,看到如下的框。mov eax,[esi+00005560],
意思是將[esi+00005560]中代表的值移動到eax中,而十六進制的00005560就是偏移量,記錄。esi的值可以在下方看到,但是下一個目標就是esi從哪里來?由哪個地址+多少偏移量等到的?
好了,離基址更近一步了。將esi的值復制到搜索值中(第一步),注意:記得將Hex打上勾勾,代表以十六進制進行搜索。點擊“新的掃描”。
此時,是不是有點小崩潰?好多值,都是看不懂的。不急,記住:CE工具是好工具,一般將可能性最大的放在前面。可以先將第一個進行改變,試探。(一般都是在前5個)。同理,將前5個放入下方的框中。
然后,一個個依次右擊該值,選中“找出是什么訪問了這個地址”或是“找出是什么改寫了這個地址”。注意:要時不時返回游戲玩一玩,更新下數據。當然,必要時要將游戲返回主菜單(即登陸窗口,但不要退出游戲,否則之前的地址都會改變,要重新弄)
如何判斷是否找到的呢?
一定要找mov指令,同時觀察第一個就可以了。
見下圖。
注意沒,mov eax,[ebp+14] ,其中將ebp+14得到eax,但是eax=00189288,如果eax就是之前找到的esi,那么是不是應該兩者一致的呢?所以,第一個不是要找的。同理進行下一個。
下一個查找。。。。。。。
同樣,點擊第一個mov指令,此時驚不驚喜,意不意外?
mov esi , [edi+00000768],而esi= 16AB6F18,與之前的一樣。對,就是它,偏移量為768,記錄。在下方框中的其他多余值,可以刪除。保留有用的。
查找下一個值。edi= 02179E80。
是不是很激動,找了那么久,終於看到綠色的值了(靜態地址)
同理,將他們加入到下方的框中,進行一個個的排除。
看到了沒?mov ecx,[pvz.exe+ 002A9EC0],pvz.exe是不是進程,不是寄存器,找不下去了。說明002A9EC02就是基址?
那么問題又來了,在第二框看到mov ecx[006A9EC0],但是點擊進去卻是002A9EC02,為什么?(本人不知道,試過很多次還是一樣)
是不是有點難以置信,下面就來驗證一下。。。(無論是否出現上面的情況,這驗證都要進行,可以確保所找的基址准確性)
驗證就是利用所找到的基址,加上之前找到的偏移量,陽光地址=基址+偏移量,那么最終的地址一定是陽光地址,否則基址錯誤。
第一情況:基址: 002A9EC0 偏移量:768 5560
通過手動添加地址,可以看到基址: 002A9EC0根本不存在的,直接廢除。
第二情況:基址: 006A9EC0 偏移量:768 5560
地址是存在,是可用的 。不像上面情況如此。。。
再點擊確定,把它放到下方的框中,然后修改它的值,看看游戲中的陽光值有沒有改變。。。。
看到了木有。。。。
驗證成功了。通過修改其值可以直接改變陽光值。。同時也說明了真正的基址: 006A9EC0,偏移量:768,5560。。。。。。。。。。。
驗證成功了。通過修改其值可以直接改變陽光值。。同時也說明了真正的基址: 006A9EC0,偏移量:768,5560。。。。。。。。。。。
驗證成功了。通過修改其值可以直接改變陽光值。。同時也說明了真正的基址: 006A9EC0,偏移量:768,5560。。。。。。。。。。。
同理,也可以通過金幣,冷卻時間,植物等其他標志去尋找基址。方法一樣。。。
最后,推薦一個視頻,可以看到實操。。。。。。。
推薦視頻:http://www.iqiyi.com/w_19rt636lht.html?fromvsogou=1
轉載:https://www.cnblogs.com/gd-luojialin/p/7789569.html