android API HOOK

API层面的hook是android hook技术中比较入门的一种,根据hook点选择的不同,能实现很多强大的功能,比如hook掉框架层的某些系统类达到不可思议的效果。

hook主要技术点:

1.寻找合适的hook点。

这一点其实是最难的,我们要根据需求,分析系统源码寻找到合适的hook点。一般hook点都是找单例,静态变量,这样hook起来简单,方便一些。

2.代理。

代理的作用是改变原始方法。

3.反射。

用发射技术截取到原始类,替换为我们修改后的代理类。


简单来说,hook就是通过反射,将原始方法(类)替换为我们增强后的代理方法(类),这样就达到了我们“不可告人”的操作。


下面举个例子,hook框架层比较复杂,比如hook剪切板改变复制的内容啊,拦截startActivity改变跳转页面这种,我们来弄个简单的,hook 控件的点击事件。


第一步,寻找hook点:

android 中所有的控件都继承自View类,点击事件的监听器也都在View的ListenerInfo中的mOnClickListener,那么我们的hook点就找到了,View中ListenerInfo的mOnClickListener。


第二步,实现我们的代理类:

public class ClickListenerProxy implements View.OnClickListener{

    View.OnClickListener onClickListener;

    public ClickListenerProxy(View.OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }

    @Override
    public void onClick(View v) {
        LogUtil.i("hi,before onClick "+v.getId());
        onClickListener.onClick(v);
        LogUtil.i("hi,after onClick "+v.getId());
    }
}

这个代理类实现的功能是在点击事件执行前后各输出了一条日志。


第三步,使用反射替换成我们的代理点击类:

public static void hookClickListener(View view){
        try {
            Class<?> aClass = Class.forName("android.view.View");
            Method getListenerInfo = aClass.getDeclaredMethod("getListenerInfo");
            getListenerInfo.setAccessible(true);
            Object listenerInfo = getListenerInfo.invoke(view);

            Class bClass = Class.forName("android.view.View$ListenerInfo");
            Field fieldOnClickListener = bClass.getDeclaredField("mOnClickListener");
            fieldOnClickListener.setAccessible(true);
            View.OnClickListener onClickListener = (View.OnClickListener) fieldOnClickListener.get(listenerInfo);
            fieldOnClickListener.set(listenerInfo,new ClickListenerProxy(onClickListener));
        } catch (Exception e) {
            LogUtil.i(e);
        }
    }

第六行拿到了ListenerInfo对象,第十一行拿到原始的OnClickListener,第十二行完成原始类与代理的替换。


运行下看结果:


看完是不是觉得其实很简单呢?0.0




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值