用户模式的调试原理和过程.
主要对象:
1.调试进程 (用户界面的输入\输出与被调试进程的桥梁)
2.被调试进程
调试器一般会用两个线程(也有用单线程的)来完成调试与用户界面的交互.UI线程与调试线程(DWT Debuger's Work Thread)
这样的原因是界面不会因为调试的等待而停止输入输出.
DWT的主要内容是
1.建立会话.调用CreateProcess或DebugActiveProcess
2.循环调用WaitForDebugEvent,ContinueDebugEvent 来接收被调试进程的调试的event
类似window的消息循环.
DWT的TEP与普通TEP的不同地方在于DbgSsReserved 数组主要用于保存(DebugObject)在xp中数组的每一个元素都是指向DBGSS_THREAD_DATA结构 该结构主要用于保存被调试的进程/句柄调用WaitForDebugEvent,ContinueDebugEvent,dbgUIGetThreadDebugObject,dbgUISetThreadDebugObject 会维护这个数组
被调试进程与普通进程的差别.
EPB的DebugPort 不为空
PEB的BeginDebugged 不为0
CreateProcess
CreateProcessInternalW
ZwCeateProcessEx
-DbgConnectToDbg
-NtConnectPort
设置DbgSsReserved[0]/DbgSsReserved[1] 调试端口句柄/Semaphore信号对象 很多API调试通讯都是通过该调试端口来传递.
-NtCreateProcess
-PspCreateProcess
设置EPROCESS和DebugPort=1
把普通的进程晋升为调试子系统"眼里"的被调试进程.