[Xposed模块] Xposed Hook实用方法详谈

查看 193|回复 9
作者:wystudio   
缘起
正如各位坛友所见,目前论坛中已经有许多Xposed模块编写教程,但都是基础教程或针对于某一应用。仍需根据所Hook的应用来实际调整。
本文将列举并谈及一些常用Hook方法(适用于大部分应用),以方便新人的学习。
PS:本文为基础进阶教程,需要有一定的Xposed Hook,Java基础。若您为新手建议先观看一下教程:
@正己 :
七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写
八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook
实用方法列表
1.获取指定的Activity对象(Android世界的大门)
①介绍:
众所周知,Android中的四大组件为:
  • Activity
  • Service
  • Content Provider
  • Broadcast Provider

    Activity处于第一个可见其十分重要
    而在Java中有了Activity对象,便可对Activity进行各种操作,如:打开另一个Activity,关闭当前Activity,获取Activity中的布局等。
    同时Activity继承于Context,所以有了Activity方法也可以使用Context的方法。并且一些需要传入Context作为参数的方法也可以传入Activity对象,比如 new各种View和new一个Toast等。
    总之得到了Activity对象,就犹如打开了Android世界的大门,世界之大任你遨游!
    ②步骤:
    (1)首先要确定获取哪一个Activity对象。
    这一步可以使用MT管理器中的Activity记录捕捉或直接打开清单文件查找。这里不再过多赘述。记下这个Activity类的包名路径,这里以 com.example.app.MainActivity 为例

    (2)找到这个Activity的 onCreate 方法的实现方法名。
    如果被Hook的应用没有被混淆,那名称就为 onCreate 。如果被混淆了,那就把应用拖入jsdx或用MT管理器等工具,去这个Activity的smail代码中找到名称。并记下这个名称。
    这里假设没有被混淆,方法名为 onCreate:

    (3)Hook这个方法即可
    现在我们得到了指定Activity的类名和 onCreate 实现方法名。
    最后我们只需要Hook此类中的 onCreate 实现方法即可拿到Activity对象,具体代码如下:
    Activity mainActivity;
    XposedHelpers.findAndHookMethod("com.example.app.mainActivity", lpparam.classLoader, "onCreate",
            new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    mainActivity = (Activity) param.thisObject; //mainActivity就是最终得到的Activity对象
                }
                            });
    最后的 mainActivity 就是我们获取到的Activity对象
    现在你可以像编写一个APP一样,去使用它做各种事情
    2.获取Activity的根布局
    ①介绍:
    前一个方法介绍了如何获取Activity对象,现在有了对象,就可以进行各种操作,这里说说获取布局
    ②步骤:
    (1)拿到Activity对象
    通过方法1拿到Activity对象
    (2)通过findViewById拿到布局

    有些新手可能会问为什么 Activity 中有 setContentView(int id) 这个方法却没有 getContentView 这个方法呢?
    这个我真没办法回答,但是我能告诉你怎么去通过Activity对象拿到根布局

    其实通过Activity对象来获取根布局的方法有很多种,比如:

  • getRootView()
    但是通常拿不到id,这是为什么呢?这是因为拿到的getRootView 是在ContentView外的DecorView。

    在《Android群英传》中说到:Android的Window对象由PhoneWindow实现, DecorView将显示内容呈现在PhoneWindow上,所有的View监听由 WindowManagerService接收,通过Activity对象回调onClickListener; DecorView包含TitleView 和ContentView。
    这就是为什么 requestWindowFeature(Window.FEATURE_NO_TITLE)要放在setContent之前。
    ---来自Android群英传

  • getWindow().getDecorView().getRootView()
    此方法高版本安卓获取不到



  • 这些方法要么高版本获取不到,要么耗时巨大。下面作者介绍的这个方法则将完美避开这些问题。
    具体代码如下:
    //通过方法1拿到mainActivity
    ViewGroup rootLayout = (ViewGroup)mainActivity.findViewById(android.R.id.content);
    这个rootLayout就是根布局,为ViewGroup类型。
    有了根布局就可以对Activity中的组件进行操作,例如:
    //获取根布局下的第一个View
    View view = rootLayout.getChildAt(0);
    //删除根布局下的第一个View
    rootLayout.removeViewAt(0);
    //向根布局中添加View
    TextView textView = new TextView(mainActivity);
    textView.setText("我是新添加的TextView");
    rootLayout.addView(textView);
    //......
    ③情景模拟:
    当我们在Hook某个应用时,发现mainActivity中有一个广告一直阻挡我们的视线,十分苦恼。但又不想去分析广告代码,怎么才能去除呢?
    其实我们可以通过Hook得到这个广告所在页面的根布局,然后通过布局助手等软件,找到这个广告组件的id,然后进行去除。如果没有id,那么就只有分析布局结构,然后拿到这个广告组件的对象进行去除。
    这里我们假设拿不到这个id。
    通过布局结构分析发现这个广告组件布局结构如下:
  • 根布局
  • RelativeLayout
  • ADView (广告组件)
  • xxx
  • LinearLayout
  • xxx


    (1)先通过根布局拿到RelativeLayout
    根据布局结构分析,RelativeLayout为根布局下第一个组件
    使用 getChildAt(int id) 方法获取RelativeLayout:
    //通过方法2拿到根布局 rootLayout
    RelativeLayout relativeLayout = (RelativeLayout) rootLayout.getChildAt(0);
    (2)再通过RelativeLayout删除广告组件
    根据布局结构分析,广告组件为 RelativeLayout 下的第一个组件,使用 removeViewAt(int id) 方法删除广告组件:
    relativeLayout.removeViewAt(0);
    至此,这个广告组件已经被我们成功去除!
    3.未完待续。。。
    写在最后
    本文为作者学习Xposed Hook时,发现的一些实用,常用方法记录以及一些思路记录,供大家学习!
    本文已同步发至作者博客:立即查看(没有联系方式)

    布局, 方法

  • klxn0-0   

    onCreat 应为onCreate吧
    wystudio
    OP
      


    klxn0-0 发表于 2023-7-1 17:38
    onCreat 应为onCreate吧

    对,我的问题
    OliverHarrison   

    谢谢分享!!!!
    fnckyon2014   

    6,刚好最近在学习
    小k666   

    内容可以再完善些哦,先提前一威望,期待后续教程内容
    wystudio
    OP
      

    每个版本更新,混淆后类名都不一样,有没有好的自适应方法
    wystudio
    OP
      


    正己 发表于 2023-7-1 21:21
    内容可以再完善些哦,先提前一威望,期待后续教程内容

    好的,谢谢版主
    wertop   


    小k666 发表于 2023-7-1 21:23
    每个版本更新,混淆后类名都不一样,有没有好的自适应方法

    其实还可以通过Hook系统中的API来拿到Actibity对象,但是不好判断获取的对象为哪一个Activity的。
    等我看看,把这个方法也加上
    klxn0-0   

    谢谢分享。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部