Android Hook 一 Hook CloseGuard

2023-05-16

一、抛出问题

在上一篇 dalvik.system.CloseGuard 介绍了CloseGuard的原理和作用,并在文中提到

APP端可以利用Hook REPORTER 在来实现客制化的上报提示信息

本章通过代码来学一下怎样Hook这个REPORTER来定制上报信息功能。

二、案例分析

直接上代码:

package com.peterzhang.androidhookdemo;

import android.database.CursorWindow;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private volatile static Object sOriginalReporter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("HookCloseGuard");
    }

    private void testAllocate(){
        CursorWindow cursorWindow = new CursorWindow("test");
    }

    public void allocate(View view){
        testAllocate();
    }

    public void hook(View view){
        tryHook();
    }

    private boolean tryHook() {
        try {
            Class<?> closeGuardCls = Class.forName("dalvik.system.CloseGuard");
            Class<?> closeGuardReporterCls = Class.forName("dalvik.system.CloseGuard$Reporter");
            Field fieldREPORTER = closeGuardCls.getDeclaredField("REPORTER");
            Field fieldENABLED = closeGuardCls.getDeclaredField("ENABLED");
            fieldREPORTER.setAccessible(true);
            fieldENABLED.setAccessible(true);
            sOriginalReporter = fieldREPORTER.get(null);
            fieldENABLED.set(null, true);
            ClassLoader classLoader = closeGuardReporterCls.getClassLoader();
            if (classLoader == null) {
                return false;
            }
            fieldREPORTER.set(null, Proxy.newProxyInstance(classLoader,
                    new Class<?>[]{closeGuardReporterCls},
                    new IOCloseLeakDetector(sOriginalReporter)));
            fieldREPORTER.setAccessible(false);
            return true;
        } catch (Throwable e) {
            Log.e(TAG, "tryHook exp=%s", e);
        }

        return false;
    }

    class IOCloseLeakDetector implements InvocationHandler {
        private final Object originalReporter;
        public IOCloseLeakDetector(Object originalReporter) {
            this.originalReporter = originalReporter;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (method.getName().equals("report")) {
                Log.d(TAG,"invoke hook method");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"invoke hook method",Toast.LENGTH_LONG).show();
                    }
                });
                return null;
            }
            return method.invoke(originalReporter, args);
        }
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG,"onDestroy");
        super.onDestroy();
    }
}

说明:

  1. 界面上两个按钮,分别是hook和allocate。hook的作用是通过反射修改App运行环境中CloseGuard实例中的REPORTER对象,allocate是在方法体中创建一个局部变量,类型是CursorWindow,为什么用CursorWindow,因为它的源码接入了CloseGuard机制。
  2. 分别点击hook和allocate,然后点返回按键
  3. 等一会会发生gc,触发CloseCuard中的warnIfOpen方法,warnIfOpen方法中又会调用REPORTER的report方法,由于我们预先hook了REPORTER,因此这里会走到IOCloseLeakDetector的invoke方法,这里是通过动态代理实现了一个REPORTER的代理对象。
  4. 弹出Toast提示

四、总结

通过案例学习到了:

  1. 如何通过Hook来定制REPORTER实现自己的上报逻辑
  2. 进一步了解CloseGuard的使用机制

最后附上工程代码

五、参考

Tencent Matrix

dalvik.system.CloseGuard

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Hook 一 Hook CloseGuard 的相关文章

随机推荐

  • BTRFS文件系统安装ArchLinux

    layout post title BTRFS文件系统安装ArchLinux date 2017 10 02 categories Linux 主要为以下步骤 xff1a 1 下载ArchLinux安装镜像并 制作U盘启动工具 2 开机进入
  • JSP文件上传

    JSP文件上传 网上的方法几乎都是使用的org apache commons fileupload的jar包 xff0c 需要手动下载导入commons fileupload jar和commons io jar 其实tomcat自带的or
  • ORPALIS PDF Reducer Pro(免费pdf压缩器工具)官方正式版V4.0.1 | pdf免费压缩软下载 | 怎样将pdf压缩得很小?

    ORPALIS PDF Reducer Pro 是一款优秀实用的离线单机版pdf免费压缩软件 xff0c 也就是大家说的免费pdf压缩器工具 xff0c 内置多种超高压缩比的PDF压缩算法和创新的页面布局分析以及自动颜色检测机制 xff0c
  • ubuntu系统文件夹作用

    opt 文件夹 用户级的程序目录 xff0c 可以理解为D Software xff0c opt有可选的意思 xff0c 这里可以用于放置第三方大型软件 xff08 或游戏 xff09 xff0c 当你不需要时 xff0c 直接rm rf掉
  • rhel7安装GUI

    check the rank of starting system systenmctl get default not found startx 查看光盘是否挂载 df 挂载 yum mount dev sr0 mnt mount dev
  • org-mode Properties-and-Columns翻译

    https orgmode org manual Properties and Columns html Properties and Columns 文章目录 属性属性语法特殊属性属性查询属性继承 Column View 列视图定义列列定
  • python利用ffmpeg进行rtmp推流直播

    思路 xff1a opencv读取视频 gt 将视频分割为帧 gt 将每一帧进行需求加工后 gt 将此帧写入pipe管道 gt 利用ffmpeg进行推流直播 pipe管道 xff1a 啥是pipe管道 xff1f 粗略的理解就是一个放共享文
  • 电脑环境PCL配置及VS2019环境配置

    VS2019配置pcl 1 12 0 前言 对于 3D 点云处理来说 xff0c PCL 完全是一个的模块化的现代 C 43 43 模板库 其基于以下第三方库 xff1a Boost Eigen FLANN VTK CUDA OpenNI
  • java算法--兔子繁殖问题

    java算法 兔子繁殖问题 题目 xff1a 古典问题 xff1a 有一对兔子 xff0c 从出生后第 3 个月起每个月都生一对兔子 xff0c 小兔子长到第四 个月后每个月又生一对兔子 xff0c 假如兔子都不死 xff0c 问每个月的兔
  • Linux配置Wifi模块

    linux终端无线网卡连接wifi xff1a 扫描可用连接wifi nmcli dev wifi 添加一个wifi的连接 nmcli dev wifi con 无线网络名称 password 无线网络密码 name 任意连接名称 xff0
  • Paho MQTT 嵌入式c客户端研究笔记

    最近做物联网设备 xff0c 需求长连接推送功能 当前物联网有一个标准协议是MQTT xff0c 对应有很多开源服务端 xff0c 如何快速接入这个服务呢 有两种接入方案 xff1a 1 自己clone 代码修改维护 2 找第三方服务 xf
  • Paho MQTT 嵌入式c客户端研究笔记 (二)

    paho mqtt embedded c master MQTTPacket samples xff0c 这个目录里面封装了发布消息 订阅消息的示例 运行pub0sub1 xff0c 这个示例里面会去订阅主题消息 发布主题消息 并且订阅和发
  • Android App 架构设计

    简介 本文是对谷歌原生文档的翻译 xff0c 仅供学习参照 原文链接 此文档写给希望学习最优编程实践和架构以开发健壮 高质量APP的开发者 开发者常遇到的问题 传统的桌面程序大多数使用场景是有一个启动入口 xff0c 作为一个独立进程运行
  • Linux Ubuntu 18.04 换源

    在安装好Ubuntu后 xff0c 你会发现软件下载安装速度非常慢 xff0c 甚至会出错 xff0c 因为Ubuntu官方的源在国内访问的速度非常慢 xff0c 但是我们可以更改系统的源为国内的一些源来提高速度 xff08 国内各大网站的
  • gradle学习二 利用javassist api修改class字节码

    一 前言 Javassist Java Programming Assistant makes Java bytecode manipulation simple It is a class library for editing byte
  • AirPlay Android接收端学习一 协议

    一 AirPlay 接收端描述 AirPlay是苹果的私有协议 xff0c 苹果官方未开放api和sdk xff0c 目前相对权威的一份非官方协议文档 这篇文档详细描述了aiplay 服务发现 图片 音视频 镜像投屏的相关协议 xff0c
  • android手机 加速度传感器 获取x,y,z轴上的加速度

    package com zhp andorid import android app Activity import android content Context import android hardware Sensor import
  • 声纹识别调研

    1 基础概念 声纹 Voiceprint xff0c 是用电声学仪器显示的携带言语信息的声波频谱 现代科学研究表明 xff0c 声纹不仅具有特定性 xff0c 而且有相对稳定性的特点 成年以后 xff0c 人的声音可保持长期相对稳定不变 实
  • Gradle学习三 :AS自定义Gradle插件

    一 定义插件 1 File New Module Android Library 取名plugin1 2 删除plugin1目录下所有文件 xff0c 只保留build gradle 编写build gradle 代码如下 xff1a ap
  • Android Hook 一 Hook CloseGuard

    一 抛出问题 在上一篇 dalvik system CloseGuard 介绍了CloseGuard的原理和作用 xff0c 并在文中提到 APP端可以利用Hook REPORTER 在来实现客制化的上报提示信息 本章通过代码来学一下怎样H