首页
论坛
专栏
课程

[原创] 使用sekiro获取微视数据

2019-10-13 14:13 2608

[原创] 使用sekiro获取微视数据

2019-10-13 14:13
2608
前几天我发了一个通过代码注入的方式调用app API的框架Sekiro https://bbs.pediy.com/thread-254923.htm,不过没有提供真实的可以app数据获取demo。
所以现在找一个app,在sekiro和xposed的基础上,实现微视的全局搜索接口的调用。


首先,配置xposed依赖和sekiro依赖

    compileOnly 'de.robv.android.xposed:api:82'
    implementation 'com.virjar:sekiro-api:1.0.0'
由于项目依赖netty,对于netty项目有一个文件冲突,特殊配置一下
android {    
    packagingOptions {
        exclude 'META-INF/INDEX.LIST'
        exclude 'META-INF/io.netty.versions.properties'
    }

    lintOptions {
        abortOnError false
    }
}

通过逆向分析,可以得到search搜索请求代码如下:
        long a3 = com.tencent.weseevideo.common.utils.ar.a();
        //  这里产生了一个请求id,autoIncrement
        if (!android.text.TextUtils.isEmpty(str) && !android.text.TextUtils.isEmpty(trim)) {
            this.l.b(str, trim);
        }
        com.tencent.oscar.base.service.TinListService.a()
                .a(
                        new com.tencent.oscar.module.discovery.ui.adapter.i(a3, trim, 0, 0, "")
                        , com.tencent.oscar.base.service.TinListService.ERefreshPolicy.EnumGetNetworkOnly
                        , GLOBAL_SEARCH_ALL
                );

我们用sekiro的方式,模拟这个逻辑,并且和sekiro上游结合

首先创建sekiroClient对象:

final SekiroClient sekiroClient = SekiroClient.start("sekiro.virjar.com", UUID.randomUUID().toString(), "weishi-demo");

然后注册一个名为globalSearchAll的handler

sekiroClient.registerHandler("globalSearchAll", new SekiroRequestHandler() {

            @AutoBind
            private int searchType = 0;

            @AutoBind
            private int dataType = 0;

            @Override
            public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {

                String key = sekiroRequest.getString("key");

                String attachInfo = sekiroRequest.getString("attachInfo");
                if (attachInfo == null) {
                    attachInfo = "";
                }
            }
        });

然后通过反射模拟请求发送逻辑
                //请求id long a3 = com.tencent.weseevideo.common.utils.ar.a();
                Class<?> arClass = XposedHelpers.findClass("com.tencent.weseevideo.common.utils.ar", lpparam.classLoader);
                long a3 = (long) XposedHelpers.callStaticMethod(arClass, "a");

                //reqeust bean
                Class<?> seachBeanClass = XposedHelpers.findClass("com.tencent.oscar.module.discovery.ui.adapter.i", lpparam.classLoader);

                Object requestBean = XposedHelpers.newInstance(seachBeanClass, a3, key, searchType, dataType, attachInfo);

                //请求和响应绑定关系
                Store.requestTaskMap.put(requestBean, sekiroResponse);

                //请求发出去
                Class<?> tinListServiceClass = XposedHelpers.findClass("com.tencent.oscar.base.service.TinListService", lpparam.classLoader);
                Object tinListService = XposedHelpers.callStaticMethod(tinListServiceClass, "a");


                Class<?> ERefreshPolicyEnumClass = XposedHelpers.findClass("com.tencent.oscar.base.service.TinListService$ERefreshPolicy", lpparam.classLoader);
                Object EnumGetNetworkOnly = XposedHelpers.callStaticMethod(ERefreshPolicyEnumClass, "valueOf", "EnumGetNetworkOnly");

                XposedHelpers.callMethod(tinListService, "a", requestBean, EnumGetNetworkOnly, "GlobalSearchActivity_global_search_all");

再然后,由于请求是异步的,我可通过hook的方式,在数据返回的时候拦截数据:
         //数据响应的时候,拦截请求
        //com.tencent.oscar.utils.network.j#a(com.tencent.oscar.utils.network.d, com.tencent.oscar.utils.network.e)
        XposedHelpers.findAndHookMethod("com.tencent.oscar.utils.network.j", lpparam.classLoader,
                "a", "com.tencent.oscar.utils.network.d", "com.tencent.oscar.utils.network.e", new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        SekiroResponse sekiroResponse = Store.requestTaskMap.remove(param.args[0]);
                        if (sekiroResponse == null) {
                            return;
                        }

                        Object jceStructObj = XposedHelpers.callMethod(param.args[1], "d");
                        Object responseData = ForceFiledViewer.toView(jceStructObj);
                        sekiroResponse.success(responseData);
                        param.setResult(true);
                    }
                });


然后安装插件,使代码生效,之后通过sekiro服务器调用:
http://sekiro.virjar.com/invoke?group=weishi-demo&action=globalSearchAll&key=小姐姐



目前看起来自动bean注入和异步http存在一些问题,我再调试看看


[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-10-13 14:20 被virjar编辑 ,原因:
最新回复 (10)
frankyxu 2019-10-13 14:54
2
0
大佬厉害了,望尘莫及啊
最后于 2019-10-13 14:55 被frankyxu编辑 ,原因: 错字
Editor 2019-10-13 16:27
3
0
感谢分享!
gtict 2019-10-14 16:54
4
0
大佬厉害了,望尘莫及啊
我不服 2019-10-16 09:12
5
0
刚接触逆向,最近在研究 frida 拦截要发送的数据包 然后放到另一个服务端管理发送.感觉和你这个有点想。
菜年richor 2019-10-17 17:27
6
0
好强啊这个,不用逆向就可以调用接口
菜年richor 2019-11-5 15:48
7
0
大佬,用你的demo安装在模拟器上提示“该模块未指定需要的Xposed版本”,该怎么处理?
virjar 1 2019-11-5 16:45
8
0
菜年richor 大佬,用你的demo安装在模拟器上提示“该模块未指定需要的Xposed版本”,该怎么处理?
https://github.com/virjar/sekiro-demo/blob/master/crack-weishi/src/main/AndroidManifest.xml#L21 

加一行

<meta-data
            android:name="xposedminversion"
            android:value="54" />
菜年richor 2019-11-5 17:16
9
0
virjar https://github.com/virjar/sekiro-demo/blob/master/crack-weishi/src/main/AndroidManifest.xml#L21 ...
谢谢大佬,我去试试
mb_nazusqig 3天前
10
0
大佬你好,有个问题,困扰了我很多天了,我用这个框架,一直报找不到类的异常错误,但这些类是实际存在的,我用frida 能hook到,不知道为什么,我的操作逻辑是直接找到类和方法,通过接口拿到参数传入参,直接调用返回数据,并未做拦截,为此我做了一些改动,1.我在xml配置了for_app_retal入口,还是不行。2.我猜测是你用的xposed 和我的xposed 不一样导致的


virjar 1 2天前
11
0
mb_nazusqig 大佬你好,有个问题,困扰了我很多天了,我用这个框架,一直报找不到类的异常错误,但这些类是实际存在的,我用frida 能hook到,不知道为什么,我的操作逻辑是直接找到类和方法,通过接口拿到参数传入参, ...
1&2,for_app_retal 是我自己的框架的一个特殊配置。我用的xposed确实不是开源的xposed

“一直报找不到类的异常错误”,请提供相关上下文环境。相关报错日志,环境详情。你所提供的信息你觉得你作为问题分析者的话,能够从你的描述中得到什么参考呢?
游客
登录 | 注册 方可回帖
返回