记录Xposed常用的使用方法

一、hook方法

在方法调用前HOOK (beforeHookedMethod)

//下方参数依次是 (包名, classLoader,方法名,参数1的class,参数2的class等等)
XposedHelpers.findAndHookMethod("com.app.da.ff",loadPackageParam.classLoader,"LIZ",String.class,new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                    XposedBridge.log("before hook-------");
                    //当前实例对象
                    param.thisObject
                    //参数1
                    String arg1 = (String) param.args[0];
                    //参数2
                    String arg2 = (String) param.args[1];
                    //修改参数1
                    param.args[0] = 1;

                    //设置方法返回值
                    param.setResult("修改后的返回值");
                }
            });

在方法调用后HOOK (afterHookedMethod)

//下方参数依次是 (包名, classLoader,方法名,参数1的class,参数2的class等等)
XposedHelpers.findAndHookMethod("com.app.da.ff",loadPackageParam.classLoader,"LIZ",String.class,new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                    XposedBridge.log("before hook-------");
                    //当前实例对象
                    param.thisObject
                    //参数1
                    String arg1 = (String) param.args[0];
                    //参数2
                    String arg2 = (String) param.args[1];
                    //修改参数1
                    param.args[0] = 1;
                    //因为在方法调用后hook的所以此时可以拿到返回值
                    param.getResult();
              
                    //获取实力对象上面的属性V0的值(int类型)
                    Field fd = param.thisObject.getClass().getDeclaredField("V0");
                    fd.setAccessible(true);
                    //强转int类型
                    int V0 = (int) fd.get(param.thisObject);

                    //多层对象属性获取
                    //获取实力对象上的对象类型的属性, 也就是this.c.c的情况
                    Field fd = param.thisObject.getClass().getDeclaredField("c");
                    fd.setAccessible(true);
                    Object ccObject = (Object) fd.get(param.thisObject);
                    Field ccfd = ccObject.getClass().getDeclaredField("c");
                    ccfd.setAccessible(true);
                    int successNum = (int) ccfd.get(ccObject);
                }
            });

查找应用内class

//hook方法或者调用方法的时候会用到
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);

实力对象方法主动调用

//调用实例对象上面的方法,可以和param.thisObject结合使用,
Map<String, String> __map = (Map<String, String>) XposedHelpers.callMethod(param.thisObject, "LIZ", url, _map);

类静态方法主动调用

Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
(Map<String, String>) XposedHelpers.callStaticMethod(clazz, "LIZ", url, _map);

获取一个类已经实例化的对象

这个我没测试过

Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
#获取到了一个数组 随便取一个用
Object[] enumConstants = clazz.getEnumConstants();

主动实例化一个对象

Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
Object classObj = XposedHelpers.newInstance(clazz,arg1,arg2);

修改类静态属性

//设置ms.bd.o.p1$a的静态属性name值为张三
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
XposedHelpers.findField(clazz, "name").set(null, "张三");

修改实例对象上属性

Class D2Class = param.thisObject.getClass();
Field name = D2Class.getDeclaredField("name");
name.setAccessible(true);
name.set(param.thisObject, "张三");

获取 applicationContext

try {
    Class<?> ContextClass = XposedHelpers.findClass("android.content.ContextWrapper", loadPackageParam.classLoader);

    XposedHelpers.findAndHookMethod(ContextClass, "getApplicationContext", new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        if (applicationContext != null) {
                            return;
                        }
                        //全局保存 为了方便后面使用
                        applicationContext = (Context) param.getResult();
                        XposedBridge.log("得到上下文");
                    }
    });
} catch (Throwable t) {
    XposedBridge.log("获取上下文出错");
}

hook onCreateView实现按钮主动点击

XposedHelpers.findAndHookMethod("com.find.diff.a",loadPackageParam.classLoader,"onCreateView", LayoutInflater.class,ViewGroup.class, Bundle.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
                    XposedBridge.log("hook-onCreateView-------------------------------");
                    comFindDiffA = param.thisObject;
                    //hook返回值 保存起来后面用
                    inflate = (View) param.getResult();
                }
});

需要运行在UI线程的方法 runOnUiThread

//comFindDiffA为 param.thisObject 可提前全局保存下来
Object activityObj =(Object) XposedHelpers.callMethod(comFindDiffA, "getActivity");
if(activityObj!=null){
    XposedBridge.log("--------------------------------activityObj有值");
    XposedHelpers.callMethod(activityObj, "runOnUiThread",new Runnable() {
        public void run() {
            //applicationContext 也是全局保存的
            Resources res = applicationContext.getResources();
            //找到id的game_over_next的id编号
            int idNum = res.getIdentifier("game_over_next", "id", 
            applicationContext.getPackageName());
            // inflate 是hook onCreateView得来的
            ViewGroup vg = (ViewGroup) inflate.findViewById(idNum);
            XposedBridge.log("--------------------------------runOnUiThread click");
            //主动点击触发
            vg.performClick();
        }
     });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 116,512评论 1 235
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 50,365评论 1 198
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 71,433评论 0 163
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 35,090评论 0 126
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 41,883评论 1 204
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 34,719评论 1 124
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 26,696评论 2 204
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 25,858评论 0 117
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 24,816评论 5 169
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 28,871评论 0 177
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 26,131评论 1 166
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 27,360评论 1 173
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 21,734评论 0 24
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 24,319评论 2 162
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 28,107评论 3 171
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 23,081评论 0 4
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 23,217评论 0 112
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 29,303评论 2 185
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 29,728评论 2 186

推荐阅读更多精彩内容