全程都是搬來的磚 感謝網上技術的無私分享: 鬼哥 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 方法會被執行。 |
(一)函數原型:
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