Android Hook系统 Handler 消息实现
前言
主线程的Handler 主要依赖于 ActivityThread,Android是消息驱动,比如view的刷新,activity的创建等,如果能打印系统层Handler消息日志,就需要对于系统层的Handler 进行Hook
原理
ActivityThread中 mH对象主要负责整个主线程的事件传递,拿到mH传递的消息并打印出来,就可以,Handler的消息处理机制,会先处理Message的Callback 再处理handlerMessage
核心代码
ActivityThread.java
final H mH = new H();class H extends Handler {public static final int BIND_APPLICATION = 110;@UnsupportedAppUsagepublic static final int EXIT_APPLICATION = 111;@UnsupportedAppUsagepublic static final int RECEIVER = 113;...public static final int EXECUTE_TRANSACTION = 159;}
Handler.java
public void dispatchMessage(@NonNull Message msg) {if (msg.callback != null) {handleCallback(msg);} else {if (mCallback != null) {if (mCallback.handleMessage(msg)) {return;}}handleMessage(msg);}}
如果能给系统的Handler 设置上 callback ,那每次系统消息传递 就可以先回调我们的callback
只要我们返回false ,系统正常运行,因为mH是静态的,通过代码反射invoke的就是系统的,
再反射获取 Handler的mCallback对象,设置我们自己的Callback实现类即可
源码
private void hookSystemHandler() throws IllegalAccessException, NoSuchFieldException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");//获取静态ActivityThread对象Object currentActivityThread = activityThreadClass.getDeclaredMethod("currentActivityThread").invoke(null);Field mHField = activityThreadClass.getDeclaredField("mH");mHField.setAccessible(true);//获取mH对象 系统的Object mH = mHField.get(currentActivityThread);Field mCallbackField =Handler.class.getDeclaredField("mCallback");mCallbackField.setAccessible(true);//替换为我们的CallbackmCallbackField.set(mH,new MyHookHandler());}class MyHookHandler implements Handler.Callback {public MyHookHandler() {}@Overridepublic boolean handleMessage(@NonNull Message msg) {//我们的Handler 已经完成了替换//这里对所有系统消息进行拦截Log.d("tag-message",msg.toString());// 要保证系统运行正常 还得让原本handler 继续处理
// originalHandler.handleMessage(msg);return false; //不拦截}}
最终效果
D { when=-1ms what=159 obj=android.app.servertransaction.ClientTransaction@196c92db target=android.app.ActivityThread$H }D { when=-6ms what=159 obj=android.app.servertransaction.ClientTransaction@9bc76abb target=android.app.ActivityThread$H }D { when=-20ms what=159 obj=android.app.servertransaction.ClientTransaction@18771a77 target=android.app.ActivityThread$H }
相关文章:
Android Hook系统 Handler 消息实现
前言 主线程的Handler 主要依赖于 ActivityThread,Android是消息驱动,比如view的刷新,activity的创建等,如果能打印系统层Handler消息日志,就需要对于系统层的Handler 进行Hook 原理 ActivityThread中 mH对象主要负责…...
R语言从入门到精通之【R语言的使用】
系列文章目录 1.R语言从入门到精通之【R语言介绍】 2.R语言从入门到精通之【R语言下载与安装】 3.R语言从入门到精通之【R语言的使用】 文章目录 系列文章目录一、新手上路1.R语句构成2.获取帮助3.工作空间二、包1.包的安装2.实践应用总结一、新手上路 1.R语句构成 R语句由函…...
WPF实战学习笔记29-登录数据绑定,编写登录服务
添加登录绑定字段、命令、方法 修改对象:Mytodo.ViewModels.ViewModels using Mytodo.Service; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.CodeDom.Compiler; using System.Collec…...
c++函数式编程:统计文件字符串,文件流
头文件 #include <iostream> #include <fstream> #include <string> #include <sstream> #include <algorithm> #include <vector>统计方法 int count_lines(const std::string &filename) {std::ifstream in{filename};return std:…...
scp命令----跨服务器传输文件
scp命令 Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。 一、Linux scp 命令 以下是scp命令常用的…...
React Dva项目中模仿网络请求数据方法
我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…...
【云原生】Docker容器命令监控+Prometheus监控平台
目录 1.常用命令监控 docker ps docker top docker stats 2.weave scope 1.下载 2.安装 3.访问查询即可 3.Prometheus监控平台 1.部署数据收集器cadvisor 2.部署Prometheus 3.部署可视化平台Gragana 4.进入后台控制台 1.常用命令监控 docker ps [rootlocalhost ~…...
DBA 职责及日常工作职责
DBA 职责及日常工作职责: 1.安装和升级数据库服务器,以及应用程序工具构建和配置网络环境. 2.熟悉数据库系统的存储结构预测未来的存储需求,制订数据库的存储方案. 3.根据开发人员设计的应用系统需求创建数据库存储结构. 4.根据开发人员设计的应用系统需求创建数据库对象 5…...
如何利用量化接口进行数据分析和计算?
量化交易作为一种利用数据和算法进行投资的方式,数据分析和计算是量化交易的核心。量化接口作为连接量化交易者和交易所的桥梁,提供了获取市场数据和执行交易指令的功能,为量化交易的数据分析和计算提供了基础。 一、数据获取: 市…...
electron-egg 加密报错
electron框架:electron-egg 解决方式 npm uninstall bytenode npm install bytenode1.3.6node:internal/modules/cjs/loader:928 throw err; ^ Error: Cannot find module ‘node:assert/strict’ Require stack: D:\electron-egg-test\new-electron-egg\electr…...
循环队列的基本操作(3种处理方式,2种实现方式)
为区分队空队满有3种处理方式: ①牺牲一个单元 ②增设表示元素个数的数据成员 ③增设tag数据成员 1.front->队头元素,rear->队尾元素下一位置 1.1牺牲一个单元 1.1.1定义 #define MaxSize 50 typedef struct {ElemType data[MaxSize];int fron…...
react的特点
React的特点包括以下几个方面: 组件化:React将用户界面分解成小而独立的组件,每个组件都有自己的状态和属性。通过组合这些组件,可以构建复杂而灵活的用户界面。 虚拟DOM:React使用虚拟DOM(Virtual DOM&am…...
MATLAB实现图像处理:图像识别、去雨、去雾、去噪、去模糊等等(附上20个完整仿真源码)
图像处理是计算机视觉领域的重要研究方向,MATLAB是一种功能强大的数学计算软件,可以用于图像处理和分析。下面是一些简单的MATLAB图像处理代码示例,包括图像增强、边缘检测、形态学处理、特征提取等。 文章目录 1. 图像增强2. 边缘检测3. 形态…...
cmake stm32 模板
文件结构 ├─.vscode ├─build ├─cmake ├─Drivers │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F1xx │ │ │ ├─Include │ │ │ └─Source │ │ │ └─Templates │ │ └─Include │ └─STM32F1xx_HAL_Driver │ ├─Inc │ │ └─Leg…...
STM32 UDS Bootloader开发-上位机篇-CANoe制作(2)
文章目录 前言CANoe增加NodeCAPL脚本获取GUI中的参数刷写过程诊断仪在线接收回调函数发送函数总结前言 在上一篇文章中,介绍了UDS Bootloadaer上位机软件基于CANoe的界面设计。本文继续介绍CAPL脚本的编写以实现刷写过程。 CANoe增加Node 在开始编写CAPL之前,需要在Simula…...
实例026 随机更换主界面背景
实例说明 如果开发的软件用户使用频率非常高,可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快,也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子,效果如图1.26所示。 技术要点 随机更换主界面背景使用了…...
PostgreSQL 简洁、使用、正排索引与倒排索引、空间搜索、用户与角色
PostgreSQL使用 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 9.0 :支持64位windows系统,异步流数据复制、Hot Standby;生产环境主流的版本是PostgreSQL 12 BSD协议 与 GPL协议 …...
querySubObject(“Cells(int,int)“, j,i)->property(“Value“)读不到数据问题
在使用qt读取Excel文件内容的时候,使用下列方式: worksheet->querySubObject("Cells(int,int)", j,i)->property("Value").toString(); 不会报错,但读取不到数据。多次尝试发现应该将property改为dynamicCall 下…...
AutoSAR系列讲解(实践篇)10.2-EcuM的上下电流程
目录 一、上电(StartUp) 二、下电(Shutdown) 三、睡眠(Sleep) 上下电,说白了就是给Ecu上下电后,Ecu的代码执行顺序。这里还讲到了大家可能经常会用到的Sleep流程,主要就是可以归纳为以下这张图,大家 掌握这张图就基本掌握了EcuM的上下电流程了。这张图的具体内容博…...
科研院所用泛微搭建信创办公平台,统一办公,业务融合,安全便捷
国家全面推动重要领域的信创改造工作,要求到2027年底,对综合办公、经营管理、生产运营等系统实现“应替尽替、能替则替”。 科研机构作为智力、知识密集型机构,承载着大量数据、信息资产,数字化程度高,业务系统多样&a…...
踩坑无数!终于捋顺Git基础核心工作流(新手必看)
我刚学Git那会,一直有个超级大的疑惑憋在心里:为什么保存代码非要分 git add 和 git commit 两步? 当时网上教程清一色直接甩命令,我照着敲了无数次,只会机械复制粘贴,完全不懂底层逻辑。自己本地瞎写代码还…...
英文会议翻译 app
一个针对开会读取大家说话的内容,过滤掉中文,只对英文的录音进行翻译,翻译的内容实时显示在屏幕上,除非点击停止,否则一直这样动态听并翻译成中文 显示在屏幕上的app,并直接安装在我手机上,并写一篇公众文章…...
智能体通信的序列化标准探索:JSON、ProtoBuf与自定义格式的效率之争
智能体通信的「快递员之战」:JSON、ProtoBuf与自定义格式的效率深度探索 关键词 智能体通信、序列化/反序列化、JSON、Protocol Buffers、自定义二进制格式、传输效率、编码效率、跨语言兼容 摘要 在人工智能多智能体系统(Multi-Agent System, MAS)、大语言模型(LLM)驱…...
从0到99.3%上下文保真度:一位阿里云M6架构师复盘DeepSeek生产环境12类对话断裂根因与自动修复脚本
更多请点击: https://intelliparadigm.com 第一章:DeepSeek多轮对话优化的演进脉络与核心挑战 DeepSeek系列模型在多轮对话场景中的持续迭代,本质上是围绕上下文建模能力、状态一致性维持与推理效率三者协同演进的过程。早期版本依赖静态窗…...
ALMA评审系统:基于分层规则与LDA的专家精准匹配工程实践
1. 项目概述:当评审专家遇上“千人千面”的提案在科研项目管理,尤其是大型天文观测设施如ALMA(阿塔卡马大型毫米/亚毫米波阵列)的提案评审中,一个核心的工程难题是如何把一份探讨“原行星盘尘埃动力学”的提案…...
Windows进程内存操控终极指南:Xenos DLL注入器深度解析
Windows进程内存操控终极指南:Xenos DLL注入器深度解析 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 在Windows系统开发和安全研究领域,DLL注入技术是实现进程间通信、功能扩展和深度监控的核…...
MD-Editor-V3 编辑器查找替换功能深度解析与实现原理
MD-Editor-V3 编辑器查找替换功能深度解析与实现原理 【免费下载链接】md-editor-v3 Markdown editor for vue3, developed in jsx and typescript, dark theme、beautify content by prettier、render articles directly、paste or clip the picture and upload it... 项目地…...
[Android] VideoCook Glitch视频效果 v3.014.9 高级版
【Android】VideoCook Glitch视频效果 v3.014.9 高级版 链接:https://pan.xunlei.com/s/VOtMpY5BigBVra7bQlA73BLxA1?pwdb65a# VideoCook Glitch视频效果 是一款非常强大的安卓视频编辑工具,它为用户提供了丰富多样的视觉特效、滤镜以及音频编辑功能&am…...
【紧急预警】DeepSeek RAG场景下LLM推理限流失效高发!3类上下文长度引发的burst流量穿透问题及5分钟热修复方案
更多请点击: https://codechina.net 第一章:DeepSeek限流策略配置 DeepSeek模型服务在高并发场景下需通过精细化限流保障系统稳定性与服务质量。限流策略主要基于请求速率(RPS)、并发连接数及单用户配额三重维度进行控制…...
终极指南:如何使用Legacy iOS Kit为旧款iOS设备降级与越狱
终极指南:如何使用Legacy iOS Kit为旧款iOS设备降级与越狱 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
