2020年4月23日 星期四

劍靈(Blade & Soul) 逆向分析研究 - 障礙物分析

在路徑規劃前,我們需要知道附近的所有障礙物,這樣才不會被障礙物卡住,因此這篇會介紹如何分析遊戲中的障礙物資訊。

一、碰撞偵測

在人物移動時,遊戲會判斷人物是否有碰撞到障礙物,如果有的話,人物會被障礙物卡住,因此我們可以在人物移動時,去尋找相關碰撞偵測的函式。



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個頂點坐標。



三、驗證是否為障礙物

在分析的過程中,我們需要驗證是否為障礙物的相關程式碼,因此會修該相關的程式碼,例如遊戲在繪製障礙物時,我們指定一個障礙物不讓它繪製出來,如果從畫面沒有顯示此障礙物,代表我們分析是正確的。

原來的攤車已消失不見,只剩下部分的零件,因此通過驗證的行為使我們在一開始的假設是正確的。