正如各位坛友所见,目前论坛中已经有许多Xposed模块编写教程,但都是基础教程或针对于某一应用。仍需根据所Hook的应用来实际调整。
本文将列举并谈及一些常用Hook方法(适用于大部分应用),以方便新人的学习。
PS:本文为基础进阶教程,需要有一定的Xposed Hook,Java基础。若您为新手建议先观看一下教程:
@正己 :
七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写
八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook
实用方法列表
1.获取指定的Activity对象(Android世界的大门)
①介绍:
众所周知,Android中的四大组件为:
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。
通过布局结构分析发现这个广告组件布局结构如下:
(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时,发现的一些实用,常用方法记录以及一些思路记录,供大家学习!
本文已同步发至作者博客:立即查看(没有联系方式)