跟著鬼哥學android java hook(二)
阿新 • • 發佈:2019-01-31
第一篇文章讀完之後,大家在熟悉了cydia的hook框架了,然後我們就開始下一步的學習。
本篇文章,主要是修改正常軟體中方法的返回值,大家可以根據這個思路去延伸擴充套件,不要侷限於此文一個思路。
0x1:建立新工程
新建立一個正常安卓工程,具體可以看附件
工程名:TestHook
包名:com.example.testhook
主類:MainActivity.java
編寫一個測試演算法的程式碼:
public int getMoney(){ int aa=10; System.out.println("這裡還是初始化的aa為-->"+aa); return aa; }
程式碼很簡單,模擬一般遊戲的get方法,返回一個int型別的資料,一般用來當作遊戲中的金幣數量。
然後在onCreate中呼叫這個方法:
System.out.println("開始執行了");
int bb=getMoney();
System.out.println("現在是新版本的aa為-->"+bb);
在呼叫方法前後,對資料都有列印,這樣我們就可以很方便的檢視資料是否改變了。
好了,測試工程基本就這樣了,那麼我們安裝看一下log日誌:
一切正常,我們的目標工程完成後,那麼我們就開始編寫hook方面的演算法。
0x2:編寫hook程式碼
省事一點,我們直接使用上篇文章使用的Hook工程,編寫一個新的方法即可。
這裡是定義我們需要 hook 的類和方法。
然後就是看怎麼操作那個hook的getMoney的方法了:
if(log!=null){ final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(arg0, log, new MS.MethodHook() { @Override public Object invoked(Object arg0, Object... arg1) throws Throwable { // TODO Auto-generated method stub System.out.println("i am in---------->"); System.out.println("i am going to fuck ---->"); //呼叫原getMoney方法,將原方法的返回值放到aa中 int aa=(Integer) old.invoke(arg0, arg1); //修改aa為999999,即原方法返回值已經修改掉了 aa=9999999; //返回aa return aa; } },old); }
好了,這樣以後,我們可以開始測試了。
進行安裝此外掛,然後重啟手機。。。
對比上面我們測試工程的列印截圖,這下可以很清楚的看到,我們已經成功修改掉getMoney的返回值為999999。
好了,到現在這兩篇文章,大家看完之後,也就可以大致明白了,我們是可以通過這個來操作遊戲的,尤其是對有各種驗證如簽名或者md5的遊戲,我們在本機這樣修改的話,就可以算是破解掉了,那麼我們下一篇文章就拿一個遊戲開始測試,驗證我們的想法是否可行。
相關工程附件都在下面網盤,可以直接拿來測試。
連結:http://pan.baidu.com/s/1qW2TPYO 密碼:d1ad