Cydia Substrate hook框架初探

 

Cydia Substrate是一個基於Hook的代碼修改框架,其能夠在AndroidiOS平臺使用,並實現修改系統默認代碼。這裏學習了下Cydia Substrate  hook框架在安卓平臺的使用。java

1、原理介紹android

固然Xposed也能實現了對應的功能,但二者實現的技術手段有些不同,因爲Xposed開源,也有很多相關文章分析了實現方式,其主要原理是替換了/system/bin/app_process這個程序,在機子啓動時加載自身的XposedBridge.jar完成對虛擬機的劫持。而Cydiasubstratet並不開源但根據比對二者"installer",我猜想Cydiasubstrate應該是採用注入的方式完成hook的:Cydia Substrate是一個代碼修改平臺。它能夠修改任何主進程的代碼,不論是用Java仍是C/C++native代碼)編寫的。git

Xposed只支持HOOK app_process中的java函數,所以Cydia Substrate是一款強大而實用的HOOK工具。github

官網地址:http://www.cydiasubstrate.com/api

Demo地址:https://github.com/zencodex/cydia-android-hook微信

官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1app

SDK下載地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip框架

2、Substrate幾個重要API介紹函數

MS.hookClassLoad 工具

函數原型:void hookClassLoad(String name, MS.ClassLoadHook hook);

該方法實如今指定的類被加載的時候發出通知。由於一個類能夠在任什麼時候候被加載,因此Substrate提供了一個方法用來檢測用戶感興趣的類什麼時候被加載。

     

  

參數

  

  

描述

  

name

包名+類名,使用java.符號

hook

MS.ClassLoadHook的一個實例,當這個類被加載的時候,它的 classLoaded 方法會被執行。

 

MS.hookMethod 

API容許開發者提供一個回調函數替換原來的方法,這個回調函數是一個實現了MS.MethodHook接口的對象,是一個典型的匿名內部類。它包含一個invoked函數。

函數原型:

void hookMethod(Class _class,Member member, MS.MethodHook hook, MS.MethodPointer old);

void hookMethod(Class _class,Member member,MS.MethodAlteration alteration);

參數描述

(一)

參數

描述

_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.

建議開發者使用第二種方式,這種方式使用起來簡單而且不多出錯,不須要一個單獨的MS.MethodPointer類實例。

3、使用方法

下面以官網的一個實例來講明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標籤,namecydia.permission.SUBSTRATEvalue爲下一步中建立的類名.Main

<manifest<span=""> xmlns:android="http://schemas.android.com/apk/res/android"> </manifest<>

    <application> 

        <meta-data<span=""> android:name="com.saurik.substrate.main" </meta-data<>

            android:value=".Main"/> 

     

    <uses-permission android:name="cydia.permission.SUBSTRATE"/> 

 

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

1.  import com.saurik.substrate.MS; 

  

public class Main { 

    static void initialize() {  

        // ... code to run when extension is loaded 

    } 

步驟三:爲了實現HOOK,達到修改目標類中的代碼的目的,咱們須要獲得目標類的一個實例,如示例中的resources

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對象原始代碼的調用和修改,將全部綠色修改爲了紫羅蘭色。

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); 

    } 

 

安裝運行,重啓系統後發現不少字體顏色都變了。以下圖所示:



 

 

 

 

 

 

 

 

 

 


本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索