Android hook--示例

这篇博客介绍了Android中的hook技术,主要探讨了如何hook View的点击事件、长按事件以及AlarmManager和ActivityManagerService(AMS)。通过代理对象替换原始对象,可以在不改变原有逻辑的基础上添加自定义逻辑。还提到了hook startActivity方法可以用来启动未在清单文件注册的Activity,但要注意API版本兼容性和不同厂商的ROM差异。
摘要由CSDN通过智能技术生成

2018-08-06


Hook过程:

  1. 寻找 Hook 点,原则是静态变量或者单例对象,尽量 Hook public 的对象和方法。
    Hook的选择点:静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。
  2. 选择合适的代理方式,如果是接口可以用动态代理。
  3. 偷梁换柱——用代理对象替换原始对象。
    注意Android 的 API 版本比较多,方法和类可能不一样,所以要做好 API 的兼容工作。还有不要hook太底层的东西,各个厂商的rom代码不一样
hookView的点击事件

先来个简单点的,View的点击事件。

hookOnLongClick

顺着View的setOnClickListener方法找到了getListenerInfo方法,进而找到了ListenerInfo类,而view的click,longClick,ScrollChange的监听事件都存放在这里面。

    private void hookOnLongCLickListener(View view) {
   
        try {
   
            //拿到mListenerInfo ,可以通过getListenerInfo方法
            Class<?> clazzView = Class.forName("android.view.View");
            Method getListenerInfoMethod = clazzView.getDeclaredMethod("getListenerInfo");
            getListenerInfoMethod.setAccessible(true);
            Object listenerInfo = getListenerInfoMethod.invoke(view);

            //拿到 mOnLongClickListener字段,这里的ListenerInfo是View的内部类,需要用$符号链接。
            Class<?> clazz = Class.forName("android.view.View$ListenerInfo");
            Field field = clazz.getDeclaredField("mOnLongClickListener");
            field.setAccessible(true);
            //拿到原来的mOnLongClickListener字段的值
            View.OnLongClickListener raw =(View.OnLongClickListener) field.get(listenerInfo);
            //替换成我们自己的
            field.set(listenerInfo, new HookOnLongClickListener(raw));

        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }

    class HookOnLongClickListener implements View.OnLongClickListener{
   
        private View.OnLongClickListener raw;
        public HookOnLongClickListener(View.OnLongClickListener raw){
   
            this.raw = raw;
        }
        @Override
        public boolean onLongClick(View v) {
   
            Log.e("HookUtil","HookOnLongClickListener");
            Toast.makeText(MainActivity.this,"替换之后",Toast.LENGTH_SHORT).show();
            if(raw!=null){
   
                //调用原来的onLongClick,保持原有逻
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值