| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 硬件断点还能这么玩? -> 正文阅读 |
|
[嵌入式]硬件断点还能这么玩? |
上一篇文章我们介绍了inlinehook(修改代码的hook方式),接下来准备介绍硬件断点+veh hook(无需修改代码的hook方式)。作为铺垫,本文先介绍硬件断点。 获取本文的实战代码、参考资料,请关注后,在聊天框回复:硬件断点。 硬件断点介绍 硬件断点与软件断点类似,都是一种代码调试的手段,可以让代码中断在需要的地方,方便调试。 软件断点是调试器在断点位置插入 int 3汇编指令实现的。硬件断点顾名思义是依赖硬件cpu,主要是靠dr0~dr7 ,8个调试寄存器实现的。 硬件断点比软件断点的功能更强,除了函数断点外,还可以数据断点,可以指定当数据被读或写时中断。 硬件断点的本质就是在指定内存下断点,内存可以位于代码段(函数断点)也可以是数据段(数据断点)。可以设置事件有执行、写入、读写时中断。 调试器使用硬件断点实现数据断点功能(例如gdb的watch命令)
一些游戏外挂也会使用硬件断点来实现hook效果,介绍完硬件断点以后讲。 调试寄存器 硬件断点是cpu提供的功能,主要是与cpu上的dr0~dr7这8个调试寄存器打交道。下面参考intel手册详细介绍一下。 intel-325462-sdm-vol-1-2abcd-3abcd.pdf ,page 3415 dr0,dr1,dr2,dr3(Debug Address Registers) dr0~dr3是调试地址寄存器,储存4个硬件断点的内存地址。硬件限制所以最多只有四个硬件断点。 dr4,dr5(保留,暂时没用) 目前没有用,不说了。 dr6(Debug Status Register) 调试状态寄存器,dr6按位使用,我们主要关注B0~B3位。触发硬件断点后,会将对应序号位设置为1。 dr7(Debug Control Register) 可以按位设置硬件断点的属性,包括:开关位、条件位、长度位。 开关位 dr7的开关位控制dr0~dr3号硬件断点是否启用。 条件位 dr7的条件位控制dr0~dr3如何被触发。00 执行时触发。01写入时触发,11读写时触发。 长度位 dr0~dr3指定的内存地址,dr7的长度位控制内存长度。 如果dr7的条件位设置为00执行,则对应的长度位必须是00。 代码实战 设置调试寄存器 windows提供了API,可以设置和获取寄存器。
CONTEXT是一个结构体,里面包含所有寄存器。因为每个cpu有一套寄存器,所以API里需要传线程句柄,设置哪个线程的寄存器。 dr7辅助类 dr7寄存器都是位操作,不方便设置也不方便看。写个辅助类。按位操作的都可以这样来弄,不用来回位移了。
我们封装的函数 我们封装一个设置硬件断点的函数,利用前面的dr7辅助类。 参数有:线程句柄、硬件断点序号(0~3)、内存地址、事件类型(执行、写、读写)、内存长度。
代码逻辑不复杂,借助dr7辅助类,设置对应的控制位。 下面做一些测试 vs的数据断点 测试一下,vs中设置数据断点后,调试寄存器的值是怎样的? 测试代码:
在第3行代码下普通断点停住,再对 n下数据断点。 然后看看调试寄存器的值 借助dr7辅助类看看dr7情况。 控制位L0设置为0b1,条件位RW0设置为0b01(写事件),长度位为0b11(0x3,4字节)。 硬件断点执行事件 我们继续测试一下,执行事件的硬件断点。
执行func时触发异常,我们没有设置veh处理,就被调试器捕捉到 硬件断点写事件 接下来试试写事件,测试代码如下:
n=1时触发断点 硬件断点读写事件 继续试试读写事件,为啥不能设置只读事件?
读事件时中断 写事件时中断 硬件断点写事件1Byte 接下来试试,长度控制位。先设置写事件、1字节。再设置写事件、4字节。
不贴图了,在执行第5、9、10行时发生了中断。第6行没有中断,因为只设置了1字节。 硬件断点、调试寄存器介绍完了,下次就介绍硬件断点hook。 最后,求关注、点赞、转发~ 东北码农,全网同名,求关~ |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:44:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |