日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Android Hook 框架 Cydia_substrate 详解

發布時間:2023/12/15 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android Hook 框架 Cydia_substrate 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄(?)[-]

使用方法
短信監控實例

1、Cydia_Substrate 框架簡介

Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。而Xposed只支持 HOOK app_process中的java函數,因此Cydia Substrate是一款強大而實用的HOOK工具。
其實cydia_substrate 與xposed 的hook原理是一樣的,二者都可以作為Java Hook的框架,看使用習慣了。下面簡單介紹一下cydia_substrate 的使用方法。

官網地址: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

使用方法

下面以官網的一個實例來說明cydia substrate的使用方法。該實例是實現將多個接口組件顏色修改為紫羅蘭色。

需要安裝:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk

步驟一:創建一個空的Android工程。由于創建的工程將以插件的形式被加載,所以不需要activity。將SDK中的substrate-api.jar復制到project/libs文件夾中。

步驟二:配置Manifest文件

(1)需要指定權限:cydia.permission.SUBSTRATE

(2)添加meta標簽,name為cydia.permission.SUBSTRATE,value為下一步中創建的類名.Main

[java] view plaincopyprint?

<manifestxmlns:android="http://schemas.android.com/apk/res/android">
<application>
<meta-dataandroid:name="com.saurik.substrate.main"android:value=".Main"/>
</application>
<uses-permissionandroid:name="cydia.permission.SUBSTRATE"/>
</manifest>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
    <application> 
        <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/> 
    </application> 
    <uses-permission android:name="cydia.permission.SUBSTRATE"/> 
</manifest> 

步驟三:創建一個類,類名為Main。類中包含一個static方法initialize,當插件被加載的時候,該方法中的代碼就會運行,完成一些必要的初始化工作。

[java] view plaincopyprint?

importcom.saurik.substrate.MS;

publicclassMain{
staticvoidinitialize(){
//...codetorunwhenextensionisloaded
}
}

    import com.saurik.substrate.MS; 
    
    public class Main { 
        static void initialize() {  
            // ... code to run when extension is loaded 
        } 
    } 

步驟四:為了實現HOOK,達到修改目標類中的代碼的目的,我們需要得到目標類的一個實例,如示例中的resources。

[java] view plaincopyprint?

publicclassMain{
staticvoidinitialize(){
MS.hookClassLoad("android.content.res.Resources",newMS.ClassLoadHook(){
publicvoidclassLoaded(Class<?>resources){
//...codetomodifytheclasswhenloaded
}
});
}
}

    public class Main { 
        static void initialize() { 
            MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() { 
                public void classLoaded(Class<?> resources) { 
                    // ... code to modify the class when loaded 
                } 
            }); 
        } 
    }

步驟五:通過MS.MethodHook實例實現原代碼的修改。

為了調用原來代碼中的方法,我們需要創建一個MS.MethodPointer類的實例,它可以在任何時候運行原來的代碼。

在這里我們通過對原代碼中resources對象原始代碼的調用和修改,將所有綠色修改成了紫羅蘭色。

[java] view plaincopyprint?

publicvoidclassLoaded(Class<?>resources){
MethodgetColor;
try{
getColor=resources.getMethod("getColor",Integer.TYPE);
}catch(NoSuchMethodExceptione){
getColor=null;
}

if(getColor!=null){
finalMS.MethodPointerold=newMS.MethodPointer();

MS.hookMethod(resources,getColor,newMS.MethodHook(){
publicObjectinvoked(Objectresources,Object...args)
throwsThrowable
{
intcolor=(Integer)old.invoke(resources,args);
returncolor&~0x0000ff00|0x00ff0000;
}
},old);
}
}

    public void classLoaded(Class<?> resources) { 
        Method getColor;  
        try { 
                getColor = resources.getMethod("getColor", Integer.TYPE); 
            } catch (NoSuchMethodException e) { 
                getColor = null; 
            } 
          
            if (getColor != null) { 
                final MS.MethodPointer old = new MS.MethodPointer(); 
          
                MS.hookMethod(resources, getColor, new MS.MethodHook() { 
                    public Object invoked(Object resources, Object... args) 
                        throws Throwable 
                    { 
                        int color = (Integer) old.invoke(resources, args); 
                        return color & ~0x0000ff00 | 0x00ff0000; 
                    } 
                }, old); 
            } 
        }  

安裝運行,重啟系統后發現很多字體顏色都變了。

示例中MS.hookMethod的代碼可以改成:

[java] view plaincopyprint?

MS.hookMethod(resources,getColor,newMS.MethodAlteration<Resources,Integer>(){
publicIntegerinvoked(Resourcesresources,Object...args)
throwsThrowable
{
intcolor=invoke(resources,args);
returncolor&~0x0000ff00|0x00ffee00;
}
});

    MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() { 
        public Integer invoked(Resources resources, Object... args) 
                throws Throwable 
                { 
            int color = invoke(resources, args); 
            return color & ~0x0000ff00 | 0x00ffee00; 
                } 
    });

2、短信監控實例

在下面的例子中我們實現了短信監聽功能,將短信發送人、接收人以及短信內容打印出來:

[java] view plaincopyprint?

<spanstyle="font-size:12px;">importjava.lang.reflect.Method;
importandroid.app.PendingIntent;
importandroid.util.Log;
importcom.saurik.substrate.MS;
publicclassMain{
staticvoidinitialize(){
MS.hookClassLoad("android.telephony.SmsManager",newMS.ClassLoadHook(){
@Override
publicvoidclassLoaded(Class<?>SmsManager){
//codetomodifytheclasswhenloaded
MethodsendTextMessage;
try{
sendTextMessage=SmsManager.getMethod("sendTextMessage",
newClass[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
}catch(NoSuchMethodExceptione){
sendTextMessage=null;
}
MS.hookMethod(SmsManager,sendTextMessage,newMS.MethodAlteration(){
publicObjectinvoked(Object_this,Object..._args)throwsThrowable{
Log.i("SMSHOOK","SEND_SMS");
Log.i("SMSHOOK","destination:"+_args[0]);
Log.i("SMSHOOK","source:"+_args[1]);
Log.i("SMSHOOK","text:"+_args[2]);
returninvoke(_this,_args);
}
});
}
});
}
}</span>

<span>import java.lang.reflect.Method; 
import android.app.PendingIntent; 
import android.util.Log; 
import com.saurik.substrate.MS; 
public class Main {
    static void initialize() {   
        MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() { 
            @Override 
            public void classLoaded(Class<?> SmsManager) { 
                //code to modify the class when loaded 
                Method sendTextMessage; 
                try { 
                    sendTextMessage = SmsManager.getMethod("sendTextMessage", 
                            new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class}); 
                } catch (NoSuchMethodException e) { 
                    sendTextMessage = null; 
                } 
                MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() { 
                    public Object invoked(Object _this,Object... _args) throws Throwable{ 
                        Log.i("SMSHOOK","SEND_SMS"); 
                        Log.i("SMSHOOK","destination:"+_args[0]); 
                        Log.i("SMSHOOK","source:"+_args[1]); 
                        Log.i("SMSHOOK","text:"+_args[2]); 
                        return invoke(_this, _args); 
                    } 
                }); 
            } 
        }); 
    } 
}</span>

運行步驟

ROOT過的手機一部,沒有ROOT的,請自行搜索方法。
Eclipse 上安裝 Android Substrate SDK,參考:http://www.cydiasubstrate.com/id/73e45fe5-4525-4de7-ac14-6016652cc1b8/
手機端去下載安裝 Cydia Substratehttp://www.cydiasubstrate.com/download/com.saurik.substrate.apk
按照章節1上面的例程,編譯本代碼后安裝到手機
手機上運行Substrate,界面上點擊“Link Substrate Files”,再點擊 “Restart System(Soft)”(這些都是Hook 步驟)
最后再編寫一個Test.apk, 調用hook 后的class,檢驗hook 結果。

總結

以上是生活随笔為你收集整理的Android Hook 框架 Cydia_substrate 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。