1. 程式人生 > >hook系列——Xposed框架入門(一)

hook系列——Xposed框架入門(一)



說到hook技術,顧名思義就能形象解釋了它的作用。


常用的hook技術框架莫過於substrace cydia,frida還有就是這個Xposed了。

先說一下Xposed原理吧

Android 有一個Zygote(受精卵)這個東西,大家應該不陌生,它本質是一個應用層的程式。每個應用程式由它fork()出。其最初的名字是app_process,通過直接呼叫pctrl把名字給改成了”zygote”。程式碼位於frameworks/base/cmds/app_process/app_main.cpp。

Xposed框架是一款可以在不修改APK的情況下影響程式執行(修改系統)的框架服務; 


2.通過替換/system/bin/app_process程式控制zygote程序,使app_process在啟動過程中載入XposedBridge.jar這個jar包,從而完成對Zygote程序及其建立的Dalvik虛擬機器的劫持;

先寫一個簡單的Android 工程,新建工程 activity_main.xml佈局如下,很簡單,一個文字,一個按鈕
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我來改變IMEI"/>
</LinearLayout>
MainActivity程式碼如下:
public class MainActivity extends AppCompatActivity {
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView= (TextView) findViewById(R.id.tv);
        button = (Button) findViewById(R.id.bt);
        textView.setText(MyImei());
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(MyImei());
            }
        });
    }

    public String MyImei() {
        return "真正IMei";
    }
}

想要達到的效果是,文字原本顯示的是 真正IMei 這個幾個字,當外掛運行了,會修改這個方法,點選按鈕,文字字會被修改 接下來,開始寫我們的外掛

1.新建一個Android 工程,匯入jar包,這裡著重提醒,大多數部落格都是錯誤的引入方式,導致會報錯


正確的引入方式:


在app下新建一個資料夾並複製jar到資料夾下,在build.gradle下寫上,Sync now一下即可。


2.在AndroidManifest.xml下的application結點下配置meta-data,如圖:

3.寫一個類去實現  IXposedHookLoadPackage  介面,並重寫handleLoadPackage方法

public class Main implements IXposedHookLoadPackage{
    String className = "com.xptest.myimei.MainActivity";
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        Class clazz = loadPackageParam.classLoader.loadClass(className);
        /**
         * 第一個引數是目標類
         * 第二個引數是目標方法
         * 第三個是回撥,可用這個替換目標方法,還有個帶兩個方法的回撥,before,after那個
         */
        XposedHelpers.findAndHookMethod(clazz, "MyImei", new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                return "Hook Imei";
            }
        });
    }
}


  這個方法是在一個app包被載入的時候執行,執行的特別早,甚至在Application.onCreate()方法之前。可以在這裡設定特定的hook鉤子。引數物件包含app的一些資訊。這裡簡單列印一些資訊。


4.指定模組的執行入口

新建一個asset資原始檔,新建一個文字檔案,並命名xposed_init(必須)


內容寫入口類的全包名


5.安裝一開始編寫應用,開啟是這個樣子


點選按鈕,也不會發生改變


6.開始編譯並安裝外掛

7.安裝完成後,會提示



8.點選開啟,選擇模組,會看到剛才安裝的外掛


9.點選勾選,然後回到框架頁面重啟即可


此時,安裝並開啟我們編寫的應用

一進入頁面就發現文字已經被修改了,點選按鈕也不會出現之前的”真正IMei“字樣,說明我們已經hook成功



本人個人原創,如有雷同,純屬巧合,或者與本人聯絡,做改動。請轉載或者CV組合標明出處,謝謝!(如有疑問或錯誤歡迎指出,本人QQ:752231513)