---------------------------------行前說明--------------------------------------
記憶體位址 |
00460C20 |
0097000C |
00971760 |
009734BC |
0097299C |
值 |
0x00970000 |
0x0097174C |
0x009734BC |
0x00972984 |
2574 |
記憶體位址 |
4PA |
3PA |
2PA |
1PA |
想改的值的Address |
值 |
4PV |
3PV |
2PV |
1PV |
想改的值 |
我來說明一下指針的運作模式,如果從最高級指針來看,4PA的4PV必須指向3PA;3PA 的3PV必須指向2PA;2PA 的2PV必須指向1PA;1PA 的1PV必須指向想改的值的Address。
若以數學式來表示4PV=3PA,3PV =2PA;2PV =1PA;1PA =想改的值的Address。
從本例中可以發現4PV≠3PV;00970000≠0097000C,因此4PV要加上0c才會等於3PA;00970000+0c=0097000C,所以我們來看下圖,4PA是00460C20,而00460C20的value是00970000但是我們是要指向0097000C,所以在offset偏移量的地方輸入0c,接下來要指向00971760,但是0097000C的value是0097174C,所以要在offset輸入14,接下來要指向009734BC,因為00971760的value剛好是009734BC,所以offset不用輸入(輸入0),接下來要指向0097299C,但是009734BC2的value是00972984,所以offset要輸入18,按下ok後指針就會從最高級的指針(第四級指針)指向最後想改的值的位址。
--------------------以函數來解釋---------------
有四個函數A(address)=value、B(address)=value、C(address)=value、D(address)=value,指針的關係就像是A(B(C(D(4PA))))=想改的值的位址,上述是沒有加上offset偏移量,如果以tutorial中的第七關 Multilevel pointers為例子,公式要修正加上offset偏移量,A(B(C(D(4PA)+0c)+14))+18=想改的值的位址,要我寫算式嗎?那我就雞婆一下寫算式
A(B(C(D(00460C20)+0c)+14))+18
=A(B(C( 00970000 +0c)+14))+18
=A(B(C( 0097000c )+14))+18
=A(B( 0097174C+14 ))+18
=A(B( 00971760 ))+18
=A( 009734BC )+18
=00972984+18
=097299C
--------------------函數解釋完畢---------------
在本例中的四個組合程式碼
>>00459862 - mov [ebx+18],edi //ebx=00972984,edi=00000D8B 將edi的值寫入[ebx+18]=我們想改的值的位址
>>0045981e - mov edx,[eax] //eax=009734BC,edx=00972984 將eax暫存器裡面儲存的位址的值寫入edx暫存器
>>004597e0 - mov edx,[eax+14] //eax=0097174C,edx=009734BC 將eax暫存器裡面儲存的位址加上偏移量14後的位址的值寫入edx暫存器
>>004597a0 - mov edx,[eax+0c] //eax=00970000,edx=0097174C 將eax暫存器裡面儲存的位址加上偏移量0c後的位址的值寫入edx暫存器
註:4PA(4 pointer address)代表第四級指針的位址,4PV(4 pointer value)第四級指針的值,以此類推
---------------------------------行前說明完畢----------------------------------
由此開始↓
-------------------------後記---------------------------------
其實本篇有一個小插曲,就是我一開始迷迷糊糊地寫錯某些地方,但是我後來已經把上面的教學改成正確無誤的了,所以請放心,下面是一段歷史,此歷史是關於"我寫錯後發一篇文訂正",看不懂沒關係,只要知道重點,該重點就是"所謂的基址Base address一定是綠色的address,也就是最上級的指針找到時一定用綠色顯示的。"
其實在前面的行前說明,和後面找上級指針的方法都沒有錯誤,錯就錯在最上級指針的位址,在錯誤版中有一張這樣的圖,圖中是最後找到上級指針的位址,但是圖中說"哇!找到8個"這個對,"要選哪一個呢?"這個以沒錯,"通常選第一個就對了"就是這句話錯了,為甚麼錯呢?有兩點第一點最上級指針的位址也就是所謂的基址Base address一定是綠色的address。第二點通常選第一個是沒錯但是這次踢到鐵板了,選第一個反而錯。或許您會想說錯就錯,如果錯還可以用的話那就假裝一下基址是0015ddf6應該可以吧,因為address=0015ddf6的value=00970000,把這個當成基址最後也可以指到想改的值的address,但是這樣就錯了,因為cheat engine不能夠創建指針,所以當我們用錯誤的基址指向想改的值的位址時,這樣的指針對想改的值是不會有作用的,唯有正確的基址指向想改的值的位址,才會對想改的值產生作用。順便說一下,在一開始程式設計時,可以設計同時有兩個指針指向同一個位址,也就是說一個數值是可有兩個上級指針的,但是在tutorial中它設計該數值只有一個指針。
那麼哪一個才是真正正確的基址呢?答案是第四個address=00460C20的這一個,為甚麼知道是第四個呢?其實是多找幾次就會了,不過下面這一次實在是太衰了一次找到8個,有時候找的時候只會找到一個就是address=00460C20的這一個,而且基址一定是固定的,所以說大家找到的基址都會一樣,所以您自己在找tutorial step 8 multilevel pointers 多重址針時,最後找到的基址一定會跟我一樣是address=00460C20的這一個
下圖是我再找一次基址這次很幸運只有找到一個,所以說還是要再三強調基址一定是固定的不管找幾次或者是用別台電腦來找,最後找到的都一定是一樣的基址,換句話說如果您找到不一樣的基址那就是您找錯了
-------------------------後記完畢------------------------------