2021年1月31日 星期日

Android Unity - Method injection

在之前的篇章已有討論Android Unity的程式碼修改和Code injection(程式碼注入),不過都稍有不足之處,一般來說程式碼修改只能做到在程式碼的長度不變的前提下,然後加以修改它,使其達到其它的運作,但如果要修改的程式碼大於當前的程式碼,就不能完成此項運作,另外Code injection雖然能補足程式碼修改的缺點,但是要編寫大量的程式碼也會非常的麻煩,因此我們來實作Method injection就能完美的補足這些問題,因為我們可以直接編寫Unity的Method,然後直接將它注入到要Hack的Unity,並且再透過Code injection來調用注入的Method。


一、找出要注入程式碼的區塊

我們還是沿用之前的遊戲,並且可以比較這三種方法的優缺點。

此款遊戲是射擊當前怪物,只要在螢幕出現的怪物都擊殺完成,就能到下一關卡,每個玩家會有3發子彈(Left),如果射完3發子彈,怪物還沒被完全消滅,遊戲就回被終止,並重新遊戲,其中Shoot是記錄當前射了幾發子彈。



了解遊戲運行方式後,我們需要找到Shoot和Left的相關程式碼,並修改它,這樣就可以無限輸出子彈,怎樣都不會終止遊戲。

接下來我們要知道Unity遊戲的主程式是放置在哪個檔案裡 ? 我們可以從assets\bin\Data\Managed資料夾裡面找到Assembly-CSharp.dll,它就是Unity遊戲主程式。



在Unity遊戲程式碼裡,我們找到射擊相關的程式碼, --this.shotTime和++this.shooted,只要將Method注入到它的之前或之後,就能完成任務了。



二、Method injection

我們在Method injection的時候,是將整個Class都注入進去,因此不要跟Hack的Unity衝突Class的名稱。此Method會需要傳入一個參數,這個參數是object型態,因為我們需要修改GameManager的shotTime和shooted的成員資料,所以我們會傳入GameManager物件給HackSooting,這樣就能完成修改成員的資料。



當然還沒完成整個流程,由於我們目前只將Class和Method注入到Unity,那麼還需要讓它調用HackSooting,所以還需要利用Code injection,因此我們在shotTime和shooted的程式碼之後注入Cheat.HackSooting,與此同時這樣就能完成實作Method injection。



三、運行結果

實作Method injection和Code injection完成後,重新封裝apk檔案,並且安裝到手機裡面,這樣我們不管怎麼射擊都能讓遊戲持續運行。