INT 3 中断调试处理流程
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
INT 3 中断调试处理流程
一、调试器如何下INT 3 断点
1)首先,调试器使用 ReadProcessMemory,读取断点内存地址的字节。
2)之后,调试器再使用 WriteProcessMemory,将指定的内存地址指令写为0xCC。
3)之后,当程序执行到这里,遇到CC指令,会从IDT表中查03号段描述符,其会定向到Trap03函数。
4)经过一系列操作(下面会介绍),此时调试器就会接收到INT 3中断,程序暂停,用户可以用来进行一些处理。
5)恢复时,将1)读取的字节再重新写入到CC处,这样就可以保证程序的正常执行。
二、INT 3 异常指令如何派发到调试器
我们在 一、3) 中,其会经过 Trap03,因此INT3异常信息肯定是在这里发送的。
我们前面学过异常等派发,其检测到存在三环调试器时会发送到三环调试器,因此其派发也就是在这时进行的。
派发流程大体如下:
三、上面产生的两个疑问:
1)在 _kiDispatchException 中存在 dec eip,为什么调试器还需要修复 eip
注意:这个是Context.eip--,而三环与零环走的是 TrapFrame 结构。因此即使在这里 Context.eip--,调试器接收调试信息是关于TrapFrame的。
如果调试器没有处理,则异常处理回重新回到三环,调用SEH异常处理结构,这时Context.eip就起作用了。
因此,调试器手动修复 INT 3 断点时,必须将eip--,回到程序执行前。
2)为什么INT 3异常时不会走内核调试器
我们假设这种情况,利用windbg调试虚拟机,在此基础上再虚拟机中开启OD调试程序,这时你会发现,是OD接收异常,Windbg不会接收异常。
具体情况可以查看KiDispatchException函数,其调用内核调试器的代码如下
if ((KiDebugRoutine != NULL) &&
((PsGetCurrentProcess()->DebugPort == NULL &&
!KdIgnoreUmExceptions) ||
(KdIsThisAKdTrap(ExceptionRecord, &ContextFrame, UserMode)))) {
//
// Now dispatch the fault to the kernel debugger.
// if ((((KiDebugRoutine) (TrapFrame,
ExceptionFrame,
ExceptionRecord,
&ContextFrame,
PreviousMode,
FALSE)) != FALSE)) { goto Handled1;
}
}
可以查看 _KdIsThisAdktrap函数,当存在三环调试器时,对于INT 3 异常不会走内核调试器。
四、异常处理的整体流程
INT 3 中断调试处理流程的更多相关文章
- 实验十五_安装新的int 9中断例程
安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开, 如果松开,就显示满屏幕的“A”:其他的键照常处理. 提示:按下一个键时产生的扫描码称为通码,松开一个键产生的扫描 ...
- x86汇编利用int 16h中断实现伪多线程输入
x86汇编利用int 16h中断实现伪多线程输入 我们都知道,如果想让一个程序,同时又干这个,又干那个,最好的办法就是多线程.这个在高级语言里面已经用烂了. 但是,DOS是只有单线程的.我如果想让程序 ...
- int 0x13中断的參数传递
int 0x13中断向量所指向的中断服务程序实质上就是磁盘服务程序. 用途:将指定扇区的代码载入到内存的指定位置. 因此,在使用int 0x13中断时要将參数传递给服务程序: 比如:将指定扇区和载入的 ...
- 安装新的int 9中断例程2
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 安装新的int 9中断例程
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 汇编试验十五:安装新的int 9中断例程
安装新的int 9中断例程(按'A'键后显示满屏幕的'A') int 9 是外中断,同样,程序编写还是和其他中断例程类似,安装(复制),调用: 不同点是在于,他要从端口读取数据60h, Source ...
- 汇编实验15:安装新的int 9中断例程
汇编实验15:安装新的int 9中断例程 任务 安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,一旦松开后,就显示满屏幕的“A”,其他键照常处理. 预备知识概要 这次实 ...
- 一个简单的Eclipse调试Debug流程(四)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出
用VC6在64位Windows7下调试的时候,如果中断(Shift+F5)调试,程序无法退出. 问题描述: 当点击F5开始一个项目的调试时,程序在设置的断点处停止,这时按下Shift+F5后,vc6可 ...
随机推荐
- 面试题:为什么客户端最后还要等待2MSL
面试题: 为什么客户端最后还要等待2MSL MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值. 保证客户端发送的最后一个ACK报文能够到达服务器, ...
- 人工智能技术导论——使用PROLOG逻辑语言解决爱因斯坦斑马文件
一.背景 在上一篇博客https://www.cnblogs.com/wkfvawl/p/12056951.html上,我简单介绍了一下Prolog的一些基本语法,这篇博客主要通过老师课上讲过的一个问 ...
- iOS开发之微信第三方登录
参考链接:https://blog.csdn.net/lichuandev/article/details/79878730 参考链接:https://www.jianshu.com/p/59e2ac ...
- Android 警告对话框 AlertDialog
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...
- Android 线性布局 LinearLayout
垂直布局 vertical <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- Java中往zip压缩包追加文件
有个需求,从某个接口下载的一个zip压缩包,往里面添加一个说明文件.搜索了一下,没有找到往zip直接添加文件的方法,最终解决方法是先解压.再压缩. 具体过程如下: 1.一个zip文件的压缩和解压工具类 ...
- Sqlite—修改语句(Update)
SQLite 的 UPDATE 语句用于修改表中已有的记录.可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新. 基本语法:UPDATE table_name S ...
- Linux是如何启动的?
参考资料: An introduction to the Linux boot and startup processes 这篇随笔,可以理解为是对这篇英文文章的翻译与个人理解.笔记的整合. 扩展阅读 ...
- PyQt5内嵌浏览器
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from P ...
- keras 添加L2正则 和 dropout层
在某一层添加L2正则: from keras import regularizer model.add(layers.Dense(..., kernel_regularizer = regulariz ...