1. 程式人生 > >跟著鬼哥學android java hook(二)

跟著鬼哥學android java hook(二)

  第一篇文章讀完之後,大家在熟悉了cydiahook框架了,然後我們就開始下一步的學習。

本篇文章,主要是修改正常軟體中方法的返回值,大家可以根據這個思路去延伸擴充套件,不要侷限於此文一個思路。

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 的類和方法。

然後就是看怎麼操作那個hookgetMoney的方法了:


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