Xposed+Sekiro实现的案例分析

2,954 阅读1分钟

先看这里

Sekiro项目地址

Xposed+Sekiro应用案例

android:versionName="2.0.3"

package="com.ss.android.ugc.aweme.lite"

使用Android Studio开发Xposed插件

Gradle中需要添加的配置

dependencies {
    compileOnly 'de.robv.android.xposed:api:82'
    compileOnly 'de.robv.android.xposed:api:82:sources'
    implementation 'com.virjar:sekiro-api:1.0.1'
}

服务注入代码

package com.example.demo.hook;


import android.os.Bundle;

import com.example.demo.handler.DouYinUserSearchHandler;
import com.virjar.sekiro.api.SekiroClient;

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.LoadPackageParam;

public class HookMain implements IXposedHookLoadPackage {
    public static LoadPackageParam loadPackageParam = null;

    @Override
    public void handleLoadPackage(final LoadPackageParam loadPackageParam) throws Throwable {
        if (loadPackageParam.packageName.equals("com.ss.android.ugc.aweme.lite")) {
            HookMain.loadPackageParam = loadPackageParam;
            try {
                // 在com.ss.android.ugc.aweme.splash.SplashActivity -> onCreate 注入服务
                XposedHelpers.findAndHookMethod(
                        "com.ss.android.ugc.aweme.splash.SplashActivity", //Hook最先启动的类
                        loadPackageParam.classLoader,
                        "onCreate", //SplashActivity类中的方法
                        Bundle.class,
                        new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);

                        //注册信息发送到服务端
                        final SekiroClient sekiroClient = SekiroClient.start(
                                "sekiro.virjar.com", //自建服务后修改serverHost
                                "97531", //每台设备配置不同的值
                                "97531" //每台设备配置不同的值
                        );
                        //一台设备中可以注册多个action(api), 每个action代表不同的服务
                        sekiroClient.registerHandler("dy_search", new DouYinUserSearchHandler());

                        XposedBridge.log("=========== sekiro服务启动成功 ===========");
                    }
                });
            } catch (Exception e) {
                XposedBridge.log("=========== Sekiro服务启动失败 ===========");
            }
        }
    }
}

接口代码

package com.example.demo.handler;

import com.example.demo.hook.HookMain;
import com.google.gson.Gson;
import com.virjar.sekiro.api.SekiroRequest;
import com.virjar.sekiro.api.SekiroRequestHandler;
import com.virjar.sekiro.api.SekiroResponse;

import de.robv.android.xposed.XposedHelpers;

public class DouYinUserSearchHandler implements SekiroRequestHandler {


    @Override
    public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
        Gson gson = new Gson();
        
        //SearchApi类下的静态方法a所需要的三个参数
        String query = sekiroRequest.getString("query");
        String start = sekiroRequest.getString("start", "0");
        String count = sekiroRequest.getString("count", "10");

        long param2 = Long.parseLong(start);
        int param3 = Integer.parseInt(count);

        if (query == null || query.equals("")) {
            sekiroResponse.send("请传入必需参数:query");
        }

        Class<?> SearchApi = XposedHelpers.findClass("com.ss.android.ugc.aweme.discover.api.SearchApi", HookMain.loadPackageParam.classLoader);
        // 调用SearchApi类下的静态方法a,以及a方法所需的3个参数
        Object object = XposedHelpers.callStaticMethod(SearchApi, "a", query, param2, param3);
        sekiroResponse.send(gson.toJson(object));
    }
}

最后

启动服务

安装模块并在xposed中勾选,重启设备,然后打开插件与dy极速版即可实现调用。

查看设备是否注册成功

sekiro.virjar.com/groupList

远程调用

sekiro.virjar.com/invoke?grou…