Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Hook框架xposed的簡單demo

Hook框架xposed的簡單demo

編輯:關於Android編程

簡介:Xposed框架是一款可以在不修改APK的情況下影響程序運行的框架服務,通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的虛擬機的劫持。
Github地址:https://github.com/rovo89/Xposed

首先我們Hook無參數的函數


1.建立一個空工程,編寫獲取序列號的簡單例子

1.獲取手機狀態需要設置權限

2.編寫布局文件




3. 編寫主 Activity 類中的 onCreate 函數

package com.cockroach.hook_object;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv1 = (TextView) findViewById(R.id.tv1);
        TextView tv2 = (TextView) findViewById(R.id.tv2);
        TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        tv1.setText("imei:" + tm.getDeviceId());
        tv2.setText("imsi:" + tm.getSubscriberId());
    }
}

4. 完成安裝,運行效果如下:

這裡寫圖片描述

這就是我們的等會要hook的apk程序,下面編寫xposed插件

2.建立一個無 activity 的工程, 編寫 Xposed 插件

1. 設置清單文件

在 application 標簽中增加模塊說明信息



    
    
    
    
    
    

2. 導入 xposed 庫文件

將 xposed 庫文件 XposedBridgeApi-XX.jar, 放入 app/lib 文件夾下
這裡寫圖片描述

這裡寫圖片描述

需要注意的是: 修改 Scope 為 Provided

這裡寫圖片描述

這裡寫圖片描述

3. 創建一個類, Main, 實現 xposed 中的接口 IXposedHookLoadPackage 並重寫方法handleLoadPackage

package com.cockroach.xposedhookdemo;

import android.telephony.TelephonyManager;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**
 * Created by 18459 on 2016/6/27.
 */
public class Main implements IXposedHookLoadPackage{
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if(!loadPackageParam.packageName.equals("com.cockroach.hook_object"))
            return;
        XposedBridge.log("Loaded app: " + loadPackageParam.packageName);

        // 找到對應的方法,進行替換
        // 參數 1:類名
        // 參數 2: 方法名
        // 參數 3:實現監聽,重寫方法
        // replaceHookedMethod 替換方法
        // beforeHookedMethod 方法前執行
        // afterHookedMethod 方法後執行
        XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                return "Hook 成功了 哈哈!!!";
            }
        });
    }
}

4. 聲明主入口類路徑

需要在 main 文件夾下建立 assets 文件夾中新建一個 xposed_init 的文件,並在其中聲明主入口類
這裡寫圖片描述

到這裡這個hook無參函數的簡單demo插件就完成了,

然後我們hook有參數的函數


1.建立一個空工程,編寫一個登陸界面,用自定義的一個方法

布局文件中添加


MainActivity中添加

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void my_onClick(View view) {
        EditText editText = (EditText) findViewById(R.id.et1);
        EditText editText1 = (EditText) findViewById(R.id.et2);
        String string = editText.getText().toString();
        String string1 = editText1.getText().toString();
        if(CheckRegister(string,string1)){
            Toast.makeText(MainActivity.this,"登陸成功",Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(MainActivity.this,"登陸失敗",Toast.LENGTH_SHORT).show();
        }
    }

    private boolean CheckRegister(String string, String string1) {
        return string.equals(string1);
    }
}

效果,兩個輸入框輸入相同時 提示登陸成功,不同時 提示登陸失敗

到這裡測試app完成

2.接下來我們HOOK CheckRegister方法,達到不管輸入什麼,都提示登陸成功

這裡配置和前面無參插件編寫一樣,只需修改MainActivity

package com.cockroach.xposedhookdemo;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**
 * Created by 18459 on 2016/6/27.
 */
public class Main implements IXposedHookLoadPackage{
    //被HOOK的程序的包名和類名
    String packName = "com.cockroach.myapplication";
    String className = "com.cockroach.myapplication.MainActivity";

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if(!loadPackageParam.packageName.equals(packName))
            return;
        XposedBridge.log("Loaded app: " + loadPackageParam.packageName);

        // replaceHookedMethod 替換方法
        // beforeHookedMethod 方法前執行
        // afterHookedMethod 方法後執行
        // 處理是的情況
        // 找到對應類的方法,進行hook,hook的方式有兩種
        XposedHelpers.findAndHookMethod(className,     // 類名
                loadPackageParam.classLoader, // 類加載器
                "CheckRegister", // 方法名
                String.class,   // 參數1
                String.class,   // 參數2
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        Log.d("xposedplugin", (String) param.args[0]);
                        Log.d("xposedplugin", (String) param.args[1]);
                        //將兩個參數改為相等
                        param.args[0] = "123";
                        param.args[1] = "123";
                        //這樣設置函數的返回值
                        param.setResult(true);
                    }

                    @Override
                    //這個hook方法之後有啥用還不知道
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);

                        Log.d("xposedplugin", (String) param.args[0]);
                        Log.d("xposedplugin", (String) param.args[1]);

                    }
                });
    }
}

到這裡hook有參函數的插件完成了


測試app有了, 插件app有了,我們如何去使用?

上面我們寫了共寫了兩個測試app和兩個插件app,我們用第一對app,來做測試

1.在root後的手機上安裝xposed框架app,然後進入app,選擇 框架->安裝更新,此時會重啟,

2.將測試apk和插件apk都安裝到手機上, 當插件apk安裝到手機上時,框架xposed app會檢測到插件,

3.進入框架app,選擇 模塊,選中我們寫的插件,然後重啟手機

開機後我們運行測試app,看到已經hook成功了

hook之後運行測試app
這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved