硬件断点
前言前两篇介绍了软件断点与内存断点,这两种类型的断点都会留下明显的痕迹,也有相应的应对措施,对于软件断点,可以用CRC校验来检测;对于内存断点,可以起一个线程不断刷新PTE的属性,防止其被修改。而本篇要介绍的硬件断点就比较难防了,所以这也是硬件断点值得学习的地方。
硬件断点的原理硬件断点的实现需要借 ...
内存断点
前言前一篇了解了软件断点,本篇来看内存断点。参考软件断点,本篇依旧从3个角度来看,首先是内存断点的本质;其次站在被调试进程的角度来看,也就是内存断点的执行流程;最后是站在调试器进程的角度来看,就是调试器的代码逻辑。下面,进入正文。
内存断点的本质首先来说说内存断点的本质,前一篇学习的软件断点的本质实 ...
软件断点
前言在之前的学习中,已经了解了调试器与被调试对象之间如何建立调试关系,也了解了调试事件的采集与处理的过程,在前一篇则回顾了调试与异常之间的联系,本篇将基于以上知识点展开,进一步了解调试相关的细节。
调试的本质调试的本质,就是在被调试进程中触发异常,并由调试器接管异常的过程。
其中有3种触发异常的 ...
调试与异常
前言通过前几篇对调试的学习,现在可以对调试的过程有个整体的认识,本篇介绍调试与异常之间的关系,尽管在之前一个篇章中,已经比较详细的概括了异常相关的各个知识点,但是调试本身就相当于给调试器发送一个异常类型的调试事件。这里就再回顾一下。
调试器下的异常分发在之前学习用户异常的分发与内核异常的分发时,由于 ...
调试事件的处理
前言前面两篇学习了调试器进程与被调试进程如何通过调试对象建立起联系,也了解了调试事件等概念,总结为下图:
本篇将通过程序模拟两种建立调试关系的方式,分析调试事件的处理过程及不同调试事件的结构细节。
建立调试关系(创建进程)模拟程序代码首先,我们要模拟一个调试关系建立的过程,参考如下代码:
c12 ...
调试事件的采集
什么是调试事件前一篇在介绍调试对象时,分析了调试器如何通过调试对象与被调试进程建立连接,这同样产生了另一个新的问题,调试器进程如何才能知道被调试进程发生甚么事了?于是就有了调试事件这么一个概念,用来描述被调试进程的某些行为,当被调试进程做出了一些行为后,如果属于调试事件中的一类,就会借助调试对象告知 ...
调试对象
前言本篇开始学习软件调试的基础知识,也是Windows内核基础的最后一个阶段了。软件调试实际上东西不多,若是想开发一个调试器,掌握十几个API就差不多了,但是如果想要在调试与反调试的对抗中占据主动,对细节的了解才是最重要的。
软件调试系列主要用到kernel32.dll、ntdll.dll、ntos ...
内核回调机制
谁调用了窗口过程先来看一个问题,谁调用了窗口过程?根据前面的学习,可以得出:
GetMessage()在处理SentMessagesListHead中消息时,会调用窗口过程。
DispatchMessage()在处理其它队列中的消息时,会调用窗口过程。
但实际上还有一种,就是内核代码本身会调用窗 ...
消息的分发
要点回顾前篇学习了关于消息的接收,主要是围绕GetMessage函数展开的,了解到GetMessage函数不仅仅读取消息,还会处理SentMessagesListHead队列中的消息。并且消息队列不止一个,共有七个。本篇学习了解消息的分发,主要是围绕DispatchMessage展开。
核心逻辑关于 ...
消息的接收
要点回顾前两篇关于消息机制的学习主要介绍了以下2点:
一个GUI线程有一个消息队列
Code1普通线程 -> GUI线程 -> THREAD.Win32Thread -> THREADINFO -> 消息队列
一个线程可以有多个窗口,所有窗口共享一个消息队列
Code12_WINDOW_OBJE ...