利用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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值