全程都是搬来的砖 感谢网上技术的无私分享: 鬼哥 Hook的两个小插曲:http://blog.youkuaiyun.com/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 方法会被执行。 |
(一)函数原型:
void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);
参数描述:
参数 | 描述 |
| 加载的目标类,为classLoaded传下来的类参数 |
| 通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测). |
|
|
(二)函数原型:
void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);
参数描述:
参数 | 描述 |
| 加载的目标类,为classLoaded传下来的类参数 |
| 通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测). |
| An instance of |
关于移动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