【正文】
在TUT上面顯示的數(shù)字是100,于是我在CE中直接輸入100然后FIRST SCAN,這一步得到了83個地址(這個并不重要,也許你的情況不是83,也許更多,也許更少)。四,然后,我點TUT左下的寫著“Change Value”的按鈕,現(xiàn)在TUT上的變成723,于是我在CE中輸入723然后NEXT SCAN,現(xiàn)在就只得到一個地址了,地址是00BD50BC。五,接下來的一步就是把這個地址加到CE下邊的地址列表中,雙擊左邊的這個地址就自動加到下面的地址列表了。六,根據(jù)TUT的要求,要我們用CE的Find out what writes to this address,于是我在下邊的地址列表中對著這個地址點右鍵,在彈出菜單上點擊Find out what writes to this address。接著會出來一個讓你確認的對話框,點YES,接著CE的主窗口右邊會多出一個新的窗口,窗口標題是Created processes,它下面的列表框中有一個項目,內(nèi)容是FFEA10D7,這個就是TUT這個進程的進程號或者叫PID,雙擊它或者選擇它后點下面的Select。這樣CE的主窗口前面又會多一個新的窗口,標題是The following opcodes changed the selected address,現(xiàn)在可以把Created processes窗口關掉了。七,回到TUT,現(xiàn)在仍然是點它左下的Change Value。因為我們現(xiàn)在只想改變它的值,還不想讓那個數(shù)值的地址也改變,所以只點左邊的這個按鈕。馬上你就能看到在CE前面的那個The following opcodes...那個窗口里出現(xiàn)一條指令,在我這里它顯示的是004560cf 89 10 mov [eax], edx。如果是在對游戲進行實際的跟蹤而不是在完成這個教程,有時可能這個列表會有三四條指令。事實上這個就是CE告訴我們,它找到了是這條指令改變了那個地址上的數(shù)值。不過這還不夠,所以還要繼續(xù)。八,現(xiàn)在我們先按The following opcodes這個窗口右下角的STOP,先停止CE對TUT的跟蹤,然后如TUT所說,雙擊這條找到的指令,或者單擊它然后點右邊的MORE INFORMATION。在出來的EXTRA INFO這個窗口,上面說的那條指令顯示為紅色,在這里我再大概說一下這條指令的意思,它是把edx這個寄存器里面的數(shù)值,放到一個內(nèi)存地址里,是哪個內(nèi)存地址呢?這個內(nèi)存地址就保存在eax。記得吧?加了方括號的寄存器就不是指數(shù)值,而是指一個內(nèi)存地址,因此這一步不是把edx的值放到eax這個寄存器里面,而是把edx的數(shù)值放到保存在eax中的那個地址。因此,我們要看看剛才程序執(zhí)行到這一條指令時,eax的數(shù)值是多少。在extra info這個對方框下半部,我們可以看到EAX=00BD50BC,因此我們知道EAX的值。九,現(xiàn)在我們按The following opcodes這個窗口下邊的Close按鈕,先把它關掉,這樣才能回到CE的主窗口。而EXTRA INFO可以留著?,F(xiàn)在根據(jù)TUT的要求,我們要來做一次十六進制的掃描,點擊CE主窗口的NEW SCAN,然后把輸入數(shù)值的前面那個HEX的選項打上勾,表示我們要輸入的是十六進制數(shù),再把在EXTRA INFO中看到的數(shù)字,也就是00BD50BC這個十六進制數(shù)輸入,然后按FIRST SCAN進行掃描,馬上一個唯一的結果就出來了,在我這里搜索到的結果是00BD4E64。十,現(xiàn)在我們來按TUT的要求,以指針的方面把這個結果手工加到地址列表中,并且鎖定它。在CE主窗口的右中部有個按鈕“add address manually”,點它之后會出現(xiàn)一個添加地址的對話框。在OK這個按鈕的上方有個Pointer的選項,因為我們是要以指針方式添加這個地址,所以這個選項要打勾。打勾之后,上面原來填地址的地方就變成問號不讓你輸入了,現(xiàn)在是要在下面的輸入框中輸入地址和偏移量了。地址就是上面第九步掃描得到的結果,即00BD4E64,而因為指令中方括號中只有一個EAX,而沒有算式,所以偏移量是0,我們不用改動。同時我們也可以注意到,當我們輸入完00BD4E64之后,上面剛才不讓輸入地址的地方再在就變成00BD50BC,也就是現(xiàn)在數(shù)值所在的地址,說明我們這個指針確實是指向正確的位置的了?,F(xiàn)在點確定,新添加上的地址就會出現(xiàn)在地址列表上,并且顯示為P00BD50BC,表示這是一個指針,它當前指向的內(nèi)存地址是00BD50BC。現(xiàn)在來試試TUT下邊另一個按鈕,就是改變數(shù)值同時改變內(nèi)存地址的那個“Change pointer”按鈕,看看地址變了我們的指針是否還會正確指向它新的地址。確實我們按這個按鈕之后,地址列表上的地址P后面的內(nèi)容變了,就是說現(xiàn)在TUT把這個數(shù)值放到新的地址了,不過地址表上那個數(shù)值仍然和TUT上顯示的數(shù)值一樣。經(jīng)過這一步的測試我們也可以更好地增加對DMA和指針方面的認識?,F(xiàn)在只要按TUT的要求把這個地址前面的FROZEN打上勾,再把它的數(shù)值改為5000,然后點TUT上的Change pointer按鈕,NEXT就出現(xiàn)了。其實我想大家在這一步卡住 的原因,一方面是可能對DMA和指針這方面的內(nèi)容還不夠了解,另一方面是沒認真看TUT上的文字,我相信大家按照我上面說的步驟做一遍應該就覺得不會那么困難了。由于TUT中找到的指令比較簡單,沒有偏移量,因此我在這里再補充一點關于偏移量方面的內(nèi)容。假設剛才我們上面找到的指令是mov [eax+3C], edx,并且假設EXTRA INFO窗口上的數(shù)值和上面說的一樣的話,那么,我們要掃描的就是eax+3C,也即方括號中的數(shù)值了。上面例子中eax的值是00BD50BC,那么eax+3C=00BD50BC+3C=00BD50F8,在第九步要掃描的就是這個00BD50F8了,而在最后手工添加地址到地址列表的時候,地址要填00BD50BC,偏移量要填3C。還有,在這個例子中,我們可以把TUT中那個數(shù)值看成是游戲中的HP的值,那么,上面的00BD50BC就是在某一時刻HP所在的內(nèi)存地址,這個地址是會改變的(例如我們點了Change pointer按鈕時它就會變化),而00BD4E64這個地址就是這個HP的指針,不管地址怎么變化,但變化后的新地址都保存在00BD4E64這個指針位置上。所以我們只要找到指針,不管內(nèi)存地址怎么變,我們都能找到數(shù)值。從這個例子也可以讓大家更好的了解指針到底是怎么一回事。