在路徑規劃前,我們需要知道附近的所有障礙物,這樣才不會被障礙物卡住,因此這篇會介紹如何分析遊戲中的障礙物資訊。
一、碰撞偵測
在人物移動時,遊戲會判斷人物是否有碰撞到障礙物,如果有的話,人物會被障礙物卡住,因此我們可以在人物移動時,去尋找相關碰撞偵測的函式。
call 0x55B3790是碰撞偵測的函式,其中r9存放人物的坐標,r8存放人物移動後的坐標,執行後,回傳值如果不是0,代表有碰撞到障礙物。
繼續往下更進一步分析call [r10+308]是主要判斷人物與障礙物的碰撞比對,如果有碰撞到,回傳值是0,然後我們可以透過rsi知道障礙物的相關資訊。
在call [r10+308]之前程式碼有獲取[rsi+0x118],它是障礙物的中心頂點坐標。
二、推算障礙物的全部頂點坐標資訊
不過我們需要知道障礙物的全部頂點坐標,才能比對此坐標是否有碰撞到障礙物,因此我們還要藉由之前找到的障礙物資訊的物件rsi來分析出障礙物的所有頂點坐標。
透過記憶體分析,我們找到[rdi+29C]有存取到rax,此時rax的數值會跟rsi一樣,這樣我們就能知道這裡其實有在列舉障礙物的相關訊息。
接下來回到前一個函式,我們可以觀察到rcx是障礙物所有頂點坐標的物件。
在記憶體觀察rcx,其中0x76ED36E0是存放障礙物的所有頂點坐標,0xA是頂點坐標的數量。
從記憶體觀察0x76ED36E0,我們可以看到除了障礙物的中心頂點坐標,也包含其他的頂點坐標,由於頂點坐標數量是0xA,礙於截圖截不了全部,我只列出前面7個頂點坐標。
三、驗證是否為障礙物
在分析的過程中,我們需要驗證是否為障礙物的相關程式碼,因此會修該相關的程式碼,例如遊戲在繪製障礙物時,我們指定一個障礙物不讓它繪製出來,如果從畫面沒有顯示此障礙物,代表我們分析是正確的。
原來的攤車已消失不見,只剩下部分的零件,因此通過驗證的行為使我們在一開始的假設是正確的。