打开虚拟机,打开一个程序。如 LoadSys.exe

之后本机打开Windbg通过串行端口连接虚拟机。

lkd->!process 0 0 LoadSys.exe

得到LoadSys.exe 的EPROCESS地址如。0x87654321

lkd->ba r4 0x87654321+0xec (WIN7上DebugPort 偏移为 0xec,可以通过lkd->dt nt!_eprocess,查看。)

上一句下了访问断点。。之后进入虚拟机,打开一个OD。附加LoadSys.exe..这时虚拟机就会断下来。我们来看看调用了哪些函数。。

代码:
读: nt!DbgkCreateThread+0x22a: 856ab86a 399eec000000    cmp     dword ptr [esi+0ECh],ebx  nt!PsGetProcessDebugPort+0x8: 85514130 8b80ec000000    mov     eax,dword ptr [eax+0ECh]  nt!DbgkpSetProcessDebugObject+0x8d: 856f7959 83beec00000000  cmp     dword ptr [esi+0ECh],0  nt!DbgkpSetProcessDebugObject+0x9d: 856f7969 89beec000000    mov     dword ptr [esi+0ECh],edi  nt!DbgkpMarkProcessPeb+0x85: 856f6e90 3987ec000000    cmp     dword ptr [edi+0ECh],eax  nt!DbgkpQueueMessage+0xad: 856f74a7 8b80ec000000    mov     eax,dword ptr [eax+0ECh]  nt!KiDispatchException+0x1d8: 8550539f 39b0ec000000    cmp     dword ptr [eax+0ECh],esi  nt!DbgkForwardException+0x49: 8565deac 8b98ec000000    mov     ebx,dword ptr [eax+0ECh]  nt!PspExitThread+0x2ad: 8569094c 83bfec00000000  cmp     dword ptr [edi+0ECh],0  nt!DbgkExitThread+0x28: 856f8cf1 83b9ec00000000  cmp     dword ptr [ecx+0ECh],0  nt!PspTerminateAllThreads+0x1dd: 856a7ff4 83bfec00000000  cmp     dword ptr [edi+0ECh],0  nt!DbgkExitProcess+0x28: 856f8d63 83b9ec00000000  cmp     dword ptr [ecx+0ECh],0  nt!DbgkpCloseObject+0xd6: 856f707f 3998ec000000    cmp     dword ptr [eax+0ECh],ebx  nt!DbgkpCloseObject+0x119: 856f70c2 3998ec000000    cmp     dword ptr [eax+0ECh],ebx  nt!DbgkpCloseObject+0x121: 856f70ca 83a0ec00000000  and     dword ptr [eax+0ECh],0 
以上为读断点部分。。

记下函数+偏移,进入虚拟机,退出OD和LoadSys.exe...

重新打开LoadSys.exe
之后回到Windbg
lkd->!process 0 0 LoadSys.exe
重新获得 LoadSys.exe 的EPROCESS地址,如:0x88776655

lkd->ba w4 0x88776655+0xec
给LoadSys.exe的DebugPort下写入断点

再进入虚拟机,开OD,附加LoadSys.exe..之后就会断下。。。

代码:
写: nt!DbgkpSetProcessDebugObject+0xa3   //和读其中一个重复  nt!DbgkClearProcessDebugObject+0x41: 856d3e84 05ec000000      add     eax,0ECh  nt!DbgkpCloseObject+0x128            ////和读其中一个重复 

至此我们就找到了WIN7下 调试写入DebugPort的内核相关函数。

==========================================================

但是这个时候的函数并不完整,比如在最后HOOK这些函数后,进行调试发现退出时还是会出错,

这个时候在退出调试时再对debugport进行检测 及其对网上现有XP代码中的debugport相关函数的反汇编发下还有如下代码:

nt!PspProcessDelete+0xbc: 840aa771 8db7ec000000    lea     esi,[edi+0ECh]					   nt!DbgkCopyProcessDebugPort+0xf: 84089865 83a0ec00000000  and     dword ptr [eax+0ECh],0				   nt!DbgkCopyProcessDebugPort+0x1e: 84089874 8b7d0c          mov     edi,dword ptr [ebp+0Ch]   nt!DbgkCopyProcessDebugPort+0x5e: 840898b4 8bbfec000000    mov     edi,dword ptr [edi+0ECh]   nt!DbgkOpenProcessDebugPort+0x16: 840e4c5e 399fec000000    cmp     dword ptr [edi+0ECh],ebx   nt!DbgkOpenProcessDebugPort+0x54: 840e4c9c 8bbfec000000    mov     edi,dword ptr [edi+0ECh]   nt!ObpCloseHandle+0xd1: 8407c13e 3988ec000000    cmp     dword ptr [eax+0ECh],ecx   nt!ObpCloseHandleTableEntry+0x181: 8407c326 83b8ec00000000  cmp     dword ptr [eax+0ECh],0   nt!PsIsProcessBeingDebugged+0x8: 84113a11 83b8ec00000000  cmp     dword ptr [eax+0ECh],0   nt!NtQueryInformationProcess+0x91d: 8406f00c 8b81ec000000    mov     eax,dword ptr [ecx+0ECh] 
至于是否完整,这个验证方法只有HOOK以后调试时才能发现,如果发现错误,可以再次监控debugport,通过栈回溯来发现漏掉的函数。