2020年8月6日 星期四

AssaultCube - 修改無限子彈

AssaultCube是一款第一人稱射擊遊戲(First-person shooter),它可以選擇單機跟AI(Artificial intelligence)對戰,也可以連到網路與其他玩家對戰。此篇的主要目的為如何透過Cheat Engine來分析記憶體資訊,進而找出遞減子彈的程式碼,我們可以將此程式碼修改成NOP(無任何意義的指令),這樣就能完成無限子彈的效果,雖然難度不高,但是也是能增加遊戲分析的經驗。

一、找出子彈數量的記憶體位址

子彈數量在遊戲介面的下方,可以直接地看出總共有20發子彈的數量。



在Cheat Engine掃描記憶體數值為20,Scan Type為Exact Value,Value Type為4 Bytes,都設置好後,再按下First Scan。



緊接著,在遊戲中射擊一發子彈,子彈數量會變成19,然後再Cheat Engine掃描19的數值,再按Next Scan,就會繼續過濾記憶體位址,我們在UI(User Interface)左邊,可以看到只剩下2個記憶體位址的數值為19。



我們在這2個記憶體位址按滑鼠左鍵2下,然後我們可以在介面下方看到此記憶體位址,這邊可以讓我們編輯記憶體位址的數值。



接下來我們在0x0240A470記憶體位址的Active按左鍵一下,然後它會顯示一個紅色的X,代表此數值被鎖定,因此在遊戲裡面,我們射擊一發子彈,會發現遊戲中的子彈不會被減少,這樣我們就確信0x0240A470記憶體位址,就是儲存子彈數量的記憶體位址,而不是0x0BA27964記憶體位址,它只不過是在運算中放置到此記憶體位址又沒有被覆蓋到其他的數值而已。



在確認記憶體位址是否為子彈的數量,我們也可以通過修改記憶體數值來驗證它,在0x0240A470的Value欄位按左鍵2下,會跳出Change Value的視窗,我們將數值修改成100。



我們可以看到遊戲的子彈數量,已被改成100了。



二、找出修改子彈的程式碼

在0x0240A470記憶體位址按下右鍵,選擇Find out what writes to this address,我們可以觀察此記憶體有哪些程式碼去寫入它。



此視窗是讓我們觀察記憶體被寫入的情況,在還沒有進入遊戲射擊子彈,是不會有寫入資訊。



切換到遊戲,並且射擊一發子彈,然後會出現此記憶體寫入的資訊,我們可以將0x4637E9的位址記錄起來。



三、修改子彈數量遞減程式碼

Cheat Engine的任務已經完成,我們先將它關閉,然後換x64dbg,我們在0x4637E9下中斷點,再讓遊戲射擊一發子彈,它就會停在中斷點,從程式碼我們知道它會遞減esi的記憶體位址的數值,此esi的記憶體位址為0x240A470,它所存取的數值為0x62,也是我們的子彈數量。我們已經知道它會通過這邊的程式碼來減少我們的子彈數量,因此只要將程式碼修改成NOP就能子彈無限。





NOP指令的作用是不做任何事情,因此也不會修改我們子彈的數量,這樣不管怎樣射擊子彈,都不會遞減子彈數量,也達到子彈無限的效果。



切換到遊戲畫面,我們可以任意射擊子彈,子彈的數量都不會被改變了。