利用Cydia Substrate Hook移動MM支付

全程都是搬來的磚 感謝網上技術的無私分享:
鬼哥 Hook的兩個小插曲:http://blog.csdn.net/guiguzi1110/article/details/39023349
還有:
利用Cydia Substrate進行Android HOOK:http://www.cnblogs.com/goodhacker/p/4014617.html

關於Cydia Substrate

Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。而Xposed只支持HOOK app_process中的java函數,因此Cydia Substrate是一款強大而實用的HOOK工具。

官網地址:http://www.cydiasubstrate.com/
Demo地址:https://github.com/zencodex/cydia-android-hook
官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1
SDK下載地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip
Substrate幾個重要API介紹
MS.hookClassLoad

函數原型:void hookClassLoad(String name, MS.ClassLoadHook hook);
該方法實現在指定的類被加載的時候發出通知。因爲一個類可以在任何時候被加載,所以Substrate提供了一個方法用來檢測用戶感興趣的類何時被加載。

 

參數

  
  

描述

  

name

包名+類名,使用java的.符號

hook

MS.ClassLoadHook的一個實例,當這個類被加載的時候,它的 classLoaded 方法會被執行。

該API允許開發者提供一個回調函數替換原來的方法,這個回調函數是一個實現了MS.MethodHook接口的對象,是一個典型的匿名內部類。它包含一個invoked函數。
(一)函數原型:
void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);
參數描述:

參數

描述

_class

加載的目標類,爲classLoaded傳下來的類參數

member

通過反射得到的需要hook的方法(或構造函數). 注意:不能HOOK字段 (在編譯的時候會進行檢測).

hook

MS.MethodHook的一個實例,其包含的invoked方法會被調用,用以代替member中的代碼

(二)函數原型:

void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);
參數描述:

  

參數

  
  

描述

  

_class

加載的目標類,爲classLoaded傳下來的類參數

member

通過反射得到的需要hook的方法(或構造函數). 注意:不能HOOK字段 (在編譯的時候會進行檢測).

alteration

An instance of MS.MethodAlteration whose boxedinvoked method will be called instead of member. This instance will also be filled in using information from   the original implementation, allowing you to use invoke to call the original method implementation.

關於移動MM短代關鍵點

在類Lmm/sms/purchasesdk/PurchaseCode中,以下兩種方法是確定支付結果回調碼的關鍵:

.method public static getStatusCode()I
    .locals 1
    //獲取支付狀態碼
    sget v0, Lmm/sms/purchasesdk/PurchaseCode;->statusCode:I
    return v0
.end method

.method public static setStatusCode(I)V
    .locals 0
    //保存支付狀態碼
    sput p0, Lmm/sms/purchasesdk/PurchaseCode;->statusCode:I
    return-void
.end method
Java的代碼爲:
  public static int getStatusCode()
  {
    return statusCode;
  }

  public static void setStatusCode(int paramInt)
  {
    statusCode = paramInt;
  }
從Java代碼可以看出,getStatusCode()直接返回狀態值,沒有類型,比較簡單,我們就hook這種方法。

開始Hook

libs文件夾下引入substrate-api.jar包。

AndroidManifest.xml文件的配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="com.example.cydiaexample"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:label="@string/app_name">
        <meta-data android:name="com.saurik.substrate.main" android:value=".Main" />
    </application>
    <span><span class="comments"><!--添加Cydia Substrate權限--></span><span></span></span>
    <uses-permission android:name="cydia.permission.SUBSTRATE" />
</manifest>
Main.java的關鍵代碼:

package com.example.cydiaexample;

import java.lang.reflect.Method;
import com.saurik.substrate.MS;
 
public class Main {
    //初始化操作
    static void initialize() {  
         //設置需要hook的類,以便檢測其是否啓動
        MS.hookClassLoad("mm.sms.purchasesdk.PurchaseCode", new MS.ClassLoadHook() {
          
          @Override
          public void classLoaded(Class<?> arg0) {
              // TODO Auto-generated method stub
              
              //定義方法
              Method hookpay = null ;
              
            try {
            
            hookpay=arg0.getMethod("getStatusCode", null);
            
        } catch (SecurityException e) {            
            // TODO Auto-generated catch block
            hookpay=null;
            System.out.println("沒有找到需要hook的方法");    
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
              //如果找到就進行hook
            if(hookpay!=null){   
               
            final MS.MethodPointer old1 = new MS.MethodPointer();
             
            MS.hookMethod(arg0, hookpay, new MS.MethodHook() {

                @Override
                public Object invoked(Object arg0, Object... arg1)
                        throws Throwable {
                    // TODO Auto-generated method stub
                    //設置返回碼爲成功的返回碼:1001
                   int code00=(Integer) old1.invoke(arg0, arg1);
                       
                  code00=1001; 
                      //hook方法返回
                    return code00;   
                  
                }
            }, old1);
            }
            
            
        }
    });
      
  
   }
}
如果要使支付模式支持非移動的運營商,我們也可以hook手機系統的IMSI:

//hook手機通訊相關的類:android.telephony.TelephonyManager
MS.hookClassLoad("android.telephony.TelephonyManager", new MS.ClassLoadHook() {

		@Override
		public void classLoaded(Class<?> arg0) {
			// TODO Auto-generated method stub
			
			Method hookimsi = null ;
			
			try { 
				 //獲取IMSI的方法:getSubscriberId
				hookimsi=arg0.getMethod("getSubscriberId", null);
				  
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				hookimsi=null;  
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  
			 
			if(hookimsi!=null){   
	   			 
				final MS.MethodPointer old1 = new MS.MethodPointer();
				
				MS.hookMethod(arg0, hookimsi, new MS.MethodHook() {

					@Override
					public Object invoked(Object arg0, Object... arg1)
							throws Throwable {
						// TODO Auto-generated method stub
                      
                      String imsi=(String) old1.invoke(arg0, arg1); 
                      
                      imsi="460001234567890";
                       
						return imsi;  
                        
					}
				}, old1); 
				  
			} 
		}	  
});
以上代碼都完美通過測試,小米2S..

相關下載

鏈接: http://pan.baidu.com/s/1bneYV99 密碼: ntkv


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章