利用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 方法會被執行。 |
(一)函數原型:
void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);參數描述:
| 參數 | 描述 |
| _class | 加載的目標類,為classLoaded傳下來的類參數 |
| member | 通過反射得到的需要hook的方法(或構造函數). 注意:不能HOOK字段?(在編譯的時候會進行檢測). |
| hook | MS.MethodHook的一個實例,其包含的invoked方法會被調用,用以代替member中的代碼 |
(二)函數原型:
| ?? 參數 ?? | ?? 描述 ?? |
| _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中,以下兩種方法是確定支付結果回調碼的關鍵:
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() {@Overridepublic 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 blockhookpay=null;System.out.println("沒有找到需要hook的方法");?? ?} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} //如果找到就進行hookif(hookpay!=null){? ?final MS.MethodPointer old1 = new MS.MethodPointer();MS.hookMethod(arg0, hookpay, new MS.MethodHook() {@Overridepublic Object invoked(Object arg0, Object... arg1)throws Throwable {// TODO Auto-generated method stub//設置返回碼為成功的返回碼:1001int 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() {@Overridepublic void classLoaded(Class<?> arg0) {// TODO Auto-generated method stubMethod hookimsi = null ;try { //獲取IMSI的方法:getSubscriberIdhookimsi=arg0.getMethod("getSubscriberId", null);} catch (SecurityException e) {// TODO Auto-generated catch blockhookimsi=null; e.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} if(hookimsi!=null){ final MS.MethodPointer old1 = new MS.MethodPointer();MS.hookMethod(arg0, hookimsi, new MS.MethodHook() {@Overridepublic Object invoked(Object arg0, Object... arg1)throws Throwable {// TODO Auto-generated method stubString imsi=(String) old1.invoke(arg0, arg1); imsi="460001234567890";return imsi; }}, old1); } } }); 以上代碼都完美通過測試,小米2S..相關下載
鏈接: http://pan.baidu.com/s/1bneYV99 密碼: ntkv
總結
以上是生活随笔為你收集整理的利用Cydia Substrate Hook移动MM支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 采用sFlow工具实现流量监控--实验
- 下一篇: ie浏览器html状态栏隐藏,我的IE浏