DebugPort 호출 함수 찾기

3566 단어
가상 머신을 열고 프로그램을 엽니다.LoadSys와 같습니다.exe
그런 다음 Windbg이 열리고 Serial 포트를 통해 가상 시스템이 연결됩니다.
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를 검사하고 인터넷에 있는 기존 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를 다시 감시하고 창고 추적을 통해 누락된 함수를 발견할 수 있다.

좋은 웹페이지 즐겨찾기