滴水逆向软件调试
一、调试对象
分为两种:创建进程和附加进程
创建进程为将未运行的程序创建进程
附加进程为将运行中的进程附加
对调试器做的事
DebugActiveProcess调用了DbgUiConnectToDbg,然后调用了ntdll.dll模块中的DbgUiConnectToDbg
DbgUiConnectToDbg调用ZwCreateDebugObject,进入0环,创建_DEBUG_OBJECT
_ZwCreateDebugObject第一个参数为输出,由于是在3环,所以是一个句柄,存在当前线程TEB(0XF24)中
对被调试进程做的事
DebugActiveProcess函数,成功创建调试对象后和调试器进程创建连接后。调用ProcessIdToHandle,将进程ID转换成进程句柄。然后将进程句柄做为参数调用DbgUiDebugActiveProcess
DbgUiDebugActiveProcess调用ntdll.dll模块中的DbgUiDebugActiveProcess函数
DbgUiDebugActiveProcess中调用_NtDebugActiveProcess,参数一为上面传下来的被调试进程的句柄,参数二为TEB+0XF24,当前线程的调试对象
_ntDebugActiveProcess进入0环
NtDebugActiveProcess中两个传下来的参数,因为是3环传下来的,所以是句柄。ObReferenceObjectByHandle函数为根据句柄获得对象,参数一为进程句柄,获得EPROCESS地址放到参数5,参数5被占用,函数调用完后参数5为EPROCESS地址
获取当前线程所处进程,如果是当前进程或者是PsInitialSystemProcess,结束
再次调用ObReferenceObjectByHandle,这次获取调试对象的地址
然后调用DbgKpSetProcessDebugObject函数将调试对象和被调试进程关联起来,参数一为被调试进程的EPROCESS,参数二为调试对象的地址
判断EPROCESS+0BCh,也就是DebugPort是不是为0
如果DebugPort是0,将DEBUG_OBJECT存储到被调试进程EPROCESS的DebugPort中