天天看點

跟着鬼哥學android java hook(三)

    按照上文的約定,我們繼續第三篇文章,找一個遊戲來測試此架構和插件的穩定性。

一個解謎逃脫類的遊戲,挺好玩的,我還是未破解情況下玩通上一個版本了,新版本其實也出來兩三個月了,過了那個新鮮勁頭,就直接破解得了。

    遊戲正常的破解方面,讀者自己去搞吧,一般是看完我以前發過的所有文章,這個遊戲是很簡單搞定的,在這裡,我們不用暴力破解的方式來搞,假設遊戲裡面加入了很多防護,如檔案md5驗證,dex修改,簽名驗證,防回編譯之類的,那麼隻能反編譯而回編譯不了或者回編譯的包不能運作,是以我們需要在不修改遊戲原包情況下來操作遊戲的破解了。

    是以我們先靜态分析一下遊戲,然後找到關鍵類:

過程這裡不再重複,讀者自己去分析一下,hook是基于對方法的操作,如果都找不對關鍵的call,那麼一切都是無用的。

跟着鬼哥學android java hook(三)

通過這個類,已經很明顯的定義了一個Money的Model,用于所有跟Money相關資源的定義。

這裡我們對此getMoney()方法來進行hook。

上面截圖大家可以看到,我是先采用的暴力破解,直接修改金币數量為99999,如果這個軟體有防護,那我們就開始編寫插件。

軟體使用的基本架構,參照前兩篇文章即可,我們隻需要用第二篇文章提到的工程,簡單修改一些代碼即可使用。

1.我們需要hook的類

2.我們需要hook的方法

3.hook方法後的操作

按照我們歸納的這三點:

首先是修改這裡,将需要hook的類換成遊戲中這個類:

MS.hookClassLoad("com.gipnetix.escapeaction.scenes.money.MoneyModel", new MS.ClassLoadHook()

然後就是hook的方法:(無參,後面用null)

log=arg0.getMethod("getMoney", null);

接着就是hook後這個方法的操作:

//調用原getMoney方法,将原方法的傳回值放到aa中

float aa=(Float) old.invoke(arg0, arg1);

//修改aa為777777,即原方法傳回值已經修改掉了

aa=777777;

System.out.println("金币已經修改為777777");

//傳回aa

return aa;

Float類型的方法,傳回值必然也是float,是以上面我們已經修改資料傳回為77777,然後就是安裝此插件,重新開機手機激活插件。

運作遊戲,檢視log日志:

跟着鬼哥學android java hook(三)
跟着鬼哥學android java hook(三)

    好了,通過上面兩個圖,證明我們的修改是有效的。

總結一下:

    本文主要進行修改的是無參數方法的hook,修改方法的傳回值,然後達到破解的效果,不過一般方法來說,還是有參數的為多,那麼下一篇,我們就開始分析一個有參數的方法的hook代碼的編寫。

編碼基礎不好的同學,請注意自主學習,網上很多資料的,多翻翻多看看,有付出才會有進步。

繼續閱讀