시험도 끝났고 , 본격적으로 삽질의 삽질 연구를 이리저리 거듭하고 공부해볼까~  하던 중
갑자기 생각나는 그 무언가가 있었으니.......

뭐 엄청난건 아니고 ,  간단한건데 그냥 개인적으로 매우 궁금했던터라.....
바로 시작해보았다.


모 온라인게임 보안프로그램에서 어떤 방식으로 SDT 함수들을 후킹해서 다른 악의적인 프로그램의 접근을 막을까, 궁금했던터라 한번 살펴보기로 했다.
결과적으로는 의외로 KiServiceTable 에서 후킹하고있는 함수의 목록은 그다지 많지 않았다.

먼저 서비스테이블을 한번 살펴보자.
이상하게도  눈으로만 일단 보면  보안프로그램에서 후킹을 하고있는 서비스는 아무것도 없어보인다.

0: kd> $$><myscript\kiservicetable.txt
80506460  805a6614 nt!NtAcceptConnectPort
80506464  805f2aea nt!NtAccessCheck
80506468  805f6320 nt!NtAccessCheckAndAuditAlarm
8050646c  805f2b1c nt!NtAccessCheckByType
80506470  805f635a nt!NtAccessCheckByTypeAndAuditAlarm
80506474  805f2b52 nt!NtAccessCheckByTypeResultList
80506478  805f639e nt!NtAccessCheckByTypeResultListAndAuditAlarm
8050647c  805f63e2 nt!NtAccessCheckByTypeResultListAndAuditAlarmByHandle
80506480  806173ce nt!NtAddAtom
80506484  80618110 nt!NtSetBootOptions
80506488  805edee8 nt!NtAdjustGroupsToken
8050648c  805edb40 nt!NtAdjustPrivilegesToken
80506490  805d6b48 nt!NtAlertResumeThread
80506494  805d6af8 nt!NtAlertThread
80506498  806179f4 nt!NtAllocateLocallyUniqueId
8050649c  805b7f80 nt!NtAllocateUserPhysicalPages
805064a0  80617010 nt!NtAllocateUuids
805064a4  805aaa9e nt!NtAllocateVirtualMemory
805064a8  805b2594 nt!NtAreMappedFilesTheSame
805064ac  805d860c nt!NtAssignProcessToJobObject
805064b0  8050389c nt!NtCallbackReturn
805064b4  80618102 nt!NtCancelDeviceWakeupRequest
805064b8  80578ae6 nt!NtCancelIoFile
805064bc  8053abe2 nt!NtCancelTimer
805064c0  806105de nt!NtClearEvent
805064c4  805be4fa nt!NtClose
805064c8  805f685a nt!NtCloseObjectAuditAlarm
805064cc  80625382 nt!NtCompactKeys
805064d0  805fad6a nt!NtCompareTokens
805064d4  805a6d02 nt!NtCompleteConnectPort
805064d8  806255d6 nt!NtCompressKey
805064dc  805a65b4 nt!NtConnectPort
805064e0  80546e7c nt!NtContinue
805064e4  80643ea8 nt!NtCreateDebugObject
805064e8  805c04aa nt!NtCreateDirectoryObject
805064ec  8061062e nt!NtCreateEvent
805064f0  80618986 nt!NtCreateEventPair
805064f4  8057b084 nt!NtCreateFile
805064f8  8057aa62 nt!NtCreateIoCompletion
805064fc  805d75d0 nt!NtCreateJobObject
80506500  805d7308 nt!NtCreateJobSet
80506504  806257b2 nt!NtCreateKey
80506508  8057b192 nt!NtCreateMailslotFile
8050650c  80618d7e nt!NtCreateMutant
80506510  8057b0be nt!NtCreateNamedPipeFile
80506514  805ad9d2 nt!NtCreatePagingFile
80506518  805a70d0 nt!NtCreatePort
8050651c  805d31fa nt!NtCreateProcess
80506520  805d3144 nt!NtCreateProcessEx
80506524  8061919e nt!NtCreateProfile
80506528  805ad3ac nt!NtCreateSection
8050652c  8061672e nt!NtCreateSemaphore
80506530  805c59c4 nt!NtCreateSymbolicLinkObject
80506534  805d2fe2 nt!NtCreateThread
80506538  8061864e nt!NtCreateTimer
8050653c  805fb112 nt!NtCreateToken
80506540  805a70f4 nt!NtCreateWaitablePort
80506544  80644f84 nt!NtDebugActiveProcess
80506548  806450d4 nt!NtDebugContinue
8050654c  80618052 nt!NtDelayExecution
80506550  80617884 nt!NtDeleteAtom
80506554  80618102 nt!NtCancelDeviceWakeupRequest
80506558  80578c2c nt!NtDeleteFile
8050655c  80625c42 nt!NtDeleteKey
80506560  805f6966 nt!NtDeleteObjectAuditAlarm
80506564  80625e12 nt!NtDeleteValueKey
80506568  8057b24a nt!NtDeviceIoControlFile
8050656c  806146ac nt!NtDisplayString
80506570  805bffd2 nt!NtDuplicateObject
80506574  805eed96 nt!NtDuplicateToken
80506578  80618110 nt!NtSetBootOptions
8050657c  80625ff2 nt!NtEnumerateKey
80506580  806180f4 nt!NtEnumerateSystemEnvironmentValuesEx
80506584  8062625c nt!NtEnumerateValueKey
80506588  805b5ca0 nt!NtExtendSection
8050658c  805eef42 nt!NtFilterToken
80506590  80617638 nt!NtFindAtom
80506594  80578cf8 nt!NtFlushBuffersFile
80506598  805b8814 nt!NtFlushInstructionCache
8050659c  806264c6 nt!NtFlushKey
805065a0  805ae6e6 nt!NtFlushVirtualMemory
805065a4  805b87b6 nt!NtFlushWriteBuffer
805065a8  805b8322 nt!NtFreeUserPhysicalPages
805065ac  805b4f7c nt!NtFreeVirtualMemory
805065b0  8057b27e nt!NtFsControlFile
805065b4  805d34f4 nt!NtGetContextThread
805065b8  805ca64e nt!NtGetDevicePowerState
805065bc  8059b116 nt!NtGetPlugPlayEvent
805065c0  8052318a nt!NtGetWriteWatch
805065c4  805faa5e nt!NtImpersonateAnonymousToken
805065c8  805a715e nt!NtImpersonateClientOfPort
805065cc  805d97cc nt!NtImpersonateThread
805065d0  80623908 nt!NtInitializeRegistry
805065d4  805ca434 nt!NtInitiatePowerAction
805065d8  805d71cc nt!NtIsProcessInJob
805065dc  805ca63a nt!NtIsSystemResumeAutomatic
805065e0  805a736a nt!NtListenPort
805065e4  8058613a nt!NtLoadDriver
805065e8  806279ae nt!NtLoadKey
805065ec  806275ba nt!NtLoadKey2
805065f0  8057b2b2 nt!NtLockFile
805065f4  80614c9e nt!NtLockProductActivationKeys
805065f8  80625682 nt!NtLockRegistryKey
805065fc  805b891c nt!NtLockVirtualMemory
80506600  805c02a0 nt!NtMakePermanentObject
80506604  805be59e nt!NtMakeTemporaryObject
80506608  805b73e0 nt!NtMapUserPhysicalPages
8050660c  805b7930 nt!NtMapUserPhysicalPagesScatter
80506610  805b4004 nt!NtMapViewOfSection
80506614  80618102 nt!NtCancelDeviceWakeupRequest
80506618  8057beca nt!NtNotifyChangeDirectoryFile
8050661c  80627978 nt!NtNotifyChangeKey
80506620  806265c8 nt!NtNotifyChangeMultipleKeys
80506624  805c057c nt!NtOpenDirectoryObject
80506628  8061072e nt!NtOpenEvent
8050662c  80618a5e nt!NtOpenEventPair
80506630  8057c182 nt!NtOpenFile
80506634  8057ab3a nt!NtOpenIoCompletion
80506638  805d7756 nt!NtOpenJobObject
8050663c  80626b84 nt!NtOpenKey
80506640  80618e56 nt!NtOpenMutant
80506644  805f6428 nt!NtOpenObjectAuditAlarm
80506648  805cd40a nt!NtOpenProcess
8050664c  805ef730 nt!NtOpenProcessToken
80506650  805ef394 nt!NtOpenProcessTokenEx
80506654  805ac3d0 nt!NtOpenSection
80506658  80616828 nt!NtOpenSemaphore
8050665c  805c5baa nt!NtOpenSymbolicLinkObject
80506660  805cd696 nt!NtOpenThread
80506664  805ef74e nt!NtOpenThreadToken
80506668  805ef504 nt!NtOpenThreadTokenEx
8050666c  80618770 nt!NtOpenTimer
80506670  80647176 nt!NtPlugPlayControl
80506674  805cb4bc nt!NtPowerInformation
80506678  805f9b10 nt!NtPrivilegeCheck
8050667c  805f573a nt!NtPrivilegeObjectAuditAlarm
80506680  805f5926 nt!NtPrivilegedServiceAuditAlarm
80506684  805ba3e8 nt!NtProtectVirtualMemory
80506688  806107e6 nt!NtPulseEvent
8050668c  80578ed6 nt!NtQueryAttributesFile
80506690  80618110 nt!NtSetBootOptions
80506694  80618110 nt!NtSetBootOptions
80506698  80541bc6 nt!NtQueryDebugFilterState
8050669c  806123d8 nt!NtQueryDefaultLocale
805066a0  80613038 nt!NtQueryDefaultUILanguage
805066a4  8057be64 nt!NtQueryDirectoryFile
805066a8  805c061c nt!NtQueryDirectoryObject
805066ac  8057c1b2 nt!NtQueryEaFile
805066b0  806108ae nt!NtQueryEvent
805066b4  8057902a nt!NtQueryFullAttributesFile
805066b8  806178ac nt!NtQueryInformationAtom
805066bc  8057ca1e nt!NtQueryInformationFile
805066c0  805d7c28 nt!NtQueryInformationJobObject
805066c4  805a73c8 nt!NtQueryInformationPort
805066c8  805cef5e nt!NtQueryInformationProcess
805066cc  805cdb8c nt!NtQueryInformationThread
805066d0  805ef82e nt!NtQueryInformationToken
805066d4  806127d6 nt!NtQueryInstallUILanguage
805066d8  80619620 nt!NtQueryIntervalProfile
805066dc  8057abe2 nt!NtQueryIoCompletion
805066e0  80626eaa nt!NtQueryKey
805066e4  80624900 nt!NtQueryMultipleValueKey
805066e8  80618efe nt!NtQueryMutant
805066ec  805c7296 nt!NtQueryObject
805066f0  80624fac nt!NtQueryOpenSubKeys
805066f4  806196ae nt!NtQueryPerformanceCounter
805066f8  8057d800 nt!NtQueryQuotaInformationFile
805066fc  805ba5aa nt!NtQuerySection
80506700  805c2064 nt!NtQuerySecurityObject
80506704  806168e0 nt!NtQuerySemaphore
80506708  805c5c4a nt!NtQuerySymbolicLinkObject
8050670c  8061812c nt!NtQuerySystemEnvironmentValue
80506710  806180e6 nt!NtSetSystemEnvironmentValueEx
80506714  806130b8 nt!NtQuerySystemInformation
80506718  80614878 nt!NtQuerySystemTime
8050671c  80618828 nt!NtQueryTimer
80506720  8061490a nt!NtQueryTimerResolution
80506724  806239ea nt!NtQueryValueKey
80506728  805bac38 nt!NtQueryVirtualMemory
8050672c  8057dcea nt!NtQueryVolumeInformationFile
80506730  805d3240 nt!NtQueueApcThread
80506734  80546ec4 nt!NtRaiseException
80506738  80616552 nt!NtRaiseHardError
8050673c  8057e48a nt!NtReadFile
80506740  8057e9f4 nt!NtReadFileScatter
80506744  805a7e50 nt!NtReadRequestData
80506748  805b628c nt!NtReadVirtualMemory
8050674c  805d4762 nt!NtRegisterThreadTerminatePort
80506750  80619036 nt!NtReleaseMutant
80506754  80616a10 nt!NtReleaseSemaphore
80506758  8057aeda nt!NtRemoveIoCompletion
8050675c  80645054 nt!NtRemoveProcessDebug
80506760  806251d4 nt!NtRenameKey
80506764  8062785e nt!NtReplaceKey
80506768  805a74d0 nt!NtReplyPort
8050676c  805a8498 nt!NtReplyWaitReceivePort
80506770  805a7ea0 nt!NtReplyWaitReceivePortEx
80506774  805a77ba nt!NtReplyWaitReplyPort
80506778  805ca5cc nt!NtRequestDeviceWakeup
8050677c  805a4a2e nt!NtRequestPort
80506780  805a4d5a nt!NtRequestWaitReplyPort
80506784  805ca3da nt!NtRequestWakeupLatency
80506788  806109c0 nt!NtResetEvent
8050678c  80523672 nt!NtResetWriteWatch
80506790  8062716a nt!NtRestoreKey
80506794  805d6aa2 nt!NtResumeProcess
80506798  805d6984 nt!NtResumeThread
8050679c  80627266 nt!NtSaveKey
805067a0  8062734c nt!NtSaveKeyEx
805067a4  80627474 nt!NtSaveMergedKeys
805067a8  805a5d48 nt!NtSecureConnectPort
805067ac  80618110 nt!NtSetBootOptions
805067b0  80618110 nt!NtSetBootOptions
805067b4  805d3704 nt!NtSetContextThread
805067b8  80647d0c nt!NtSetDebugFilterState
805067bc  806163fc nt!NtSetDefaultHardErrorPort
805067c0  80612528 nt!NtSetDefaultLocale
805067c4  80612d9a nt!NtSetDefaultUILanguage
805067c8  8057c6c6 nt!NtSetEaFile
805067cc  80610a80 nt!NtSetEvent
805067d0  80610b4a nt!NtSetEventBoostPriority
805067d4  80618d1a nt!NtSetHighEventPair
805067d8  80618c4a nt!NtSetHighWaitLowEventPair
805067dc  80644a1e nt!NtSetInformationDebugObject
805067e0  8057d010 nt!NtSetInformationFile
805067e4  805d8936 nt!NtSetInformationJobObject
805067e8  806244cc nt!NtSetInformationKey
805067ec  805c680c nt!NtSetInformationObject
805067f0  805cfe54 nt!NtSetInformationProcess
805067f4  805ce0d8 nt!NtSetInformationThread
805067f8  805fbe8c nt!NtSetInformationToken
805067fc  80619182 nt!NtSetIntervalProfile
80506800  8057ae78 nt!NtSetIoCompletion
80506804  805d58ce nt!NtSetLdtEntries
80506808  80618cb6 nt!NtSetLowEventPair
8050680c  80618bde nt!NtSetLowWaitHighEventPair
80506810  8057d7de nt!NtSetQuotaInformationFile
80506814  805c25f8 nt!NtSetSecurityObject
80506818  806183b0 nt!NtSetSystemEnvironmentValue
8050681c  806180e6 nt!NtSetSystemEnvironmentValueEx
80506820  806113e6 nt!NtSetSystemInformation
80506824  80654e18 nt!NtSetSystemPowerState
80506828  80615b80 nt!NtSetSystemTime
8050682c  805ca2ee nt!NtSetThreadExecutionState
80506830  8053ad72 nt!NtSetTimer
80506834  80615052 nt!NtSetTimerResolution
80506838  80616ec6 nt!NtSetUuidSeed
8050683c  80623d38 nt!NtSetValueKey
80506840  8057e0f4 nt!NtSetVolumeInformationFile
80506844  80614670 nt!NtShutdownSystem
80506848  80528768 nt!NtSignalAndWaitForSingleObject
8050684c  806193cc nt!NtStartProfile
80506850  80619576 nt!NtStopProfile
80506854  805d6a4c nt!NtSuspendProcess
80506858  805d68be nt!NtSuspendThread
8050685c  8061979a nt!NtSystemDebugControl
80506860  805d94ca nt!NtTerminateJobObject
80506864  805d49ac nt!NtTerminateProcess
80506868  805d4ba6 nt!NtTerminateThread
8050686c  805d6c0c nt!NtTestAlert
80506870  80537108 nt!NtTraceEvent
80506874  8061811e nt!NtTranslateFilePath
80506878  805862ce nt!NtUnloadDriver
8050687c  80624062 nt!NtUnloadKey
80506880  8062427c nt!NtUnloadKeyEx
80506884  8057b656 nt!NtUnlockFile
80506888  805b8eaa nt!NtUnlockVirtualMemory
8050688c  805b4e12 nt!NtUnmapViewOfSection
80506890  805fd244 nt!NtVdmControl
80506894  80644786 nt!NtWaitForDebugEvent
80506898  805c27ae nt!NtWaitForMultipleObjects
8050689c  805c26c4 nt!NtWaitForSingleObject
805068a0  80618b7a nt!NtWaitHighEventPair
805068a4  80618b16 nt!NtWaitLowEventPair
805068a8  8057eef2 nt!NtWriteFile
805068ac  8057f4d6 nt!NtWriteFileGather
805068b0  805a7e78 nt!NtWriteRequestData
805068b4  805b6396 nt!NtWriteVirtualMemory
805068b8  80506ae8 nt!NtYieldExecution
805068bc  80619bf2 nt!NtCreateKeyedEvent
805068c0  80619cdc nt!NtOpenKeyedEvent
805068c4  80619d8e nt!NtReleaseKeyedEvent
805068c8  80619fea nt!NtWaitForKeyedEvent
805068cc  805cd90c nt!NtQueryPortInformationProcess

스크롤의 압박이 있지만 , 깨끗하다는걸 증명하기 위해서는....어쩔수가 없다
아주 깨끗하지 않은가?
이건 뭐  SSDT 후킹을 하고있나?  라고 의심할수밖에 없을정도로.....깨끗한 테이블~~

이때까지만 해도  아~   KTHREAD의  ServiceTable의 값을 바꿔서 새로만든 ServiceTable로 연결 시켜서
SSDT Relocation 기법을 쓰는구나  싶었다.
하지만 그것도 아니었다.

   +0x0d8 UserAffinity     : 3
   +0x0dc SystemAffinityActive : 0 ''
   +0x0dd PowerState       : 0 ''
   +0x0de NpxIrql          : 0 ''
   +0x0df InitialNode      : 0 ''
   +0x0e0 ServiceTable     : 0x8055e700 
   +0x0e4 Queue            : (null) 
   +0x0e8 ApcQueueLock     : 0
   +0x0f0 Timer            : _KTIMER
   +0x118 QueueListEntry   : _LIST_ENTRY [ 0x0 - 0x0 ]


0: kd> dds KeServiceDescriptorTable
8055e700  80506460 nt!KiServiceTable
8055e704  00000000
8055e708  0000011c
8055e70c  805068d4 nt!KiArgumentTable


Relocation도 아니면 뭐지?  생각하다가
결국은  내부 함수 후킹일 것 같네?  라는 생각이 들어서...
그래서 보통 대부분의 온라인 게임 보안 프로그램에서는 NtOpenProcess는 무조건 따내겠지? 하는 생각으로
NtOpenProcess 내부에서 호출하고있는 함수들의 목록을 살펴보기로 했다.

0: kd> uf /c nt!NtOpenProcess
nt!NtOpenProcess (805cd40a)
  nt!NtOpenProcess+0xa (805cd414):
    call to EagleNT+0xa9e0 (b1f3d9e0)
  nt!NtOpenProcess+0x4e (805cd458):
    call to nt!ExRaiseDatatypeMisalignment (80616092)
  nt!NtOpenProcess+0x7c (805cd486):
    call to nt!ExRaiseDatatypeMisalignment (80616092)
  nt!NtOpenProcess+0x116 (805cd520):
    call to nt!SeCreateAccessState (805f2dc6)
  nt!NtOpenProcess+0x132 (805cd53c):
    call to nt!SeSinglePrivilegeCheck (805f9ce0)
  nt!NtOpenProcess+0x17d (805cd587):
    call to nt!ObOpenObjectByName (805bd8f4)
  nt!NtOpenProcess+0x18b (805cd595):
    call to nt!SeDeleteAccessState (805f2b88)
  nt!NtOpenProcess+0x1e2 (805cd5ec):
    call to nt!PsLookupProcessThreadByCid (805d5030)
  nt!NtOpenProcess+0x1f4 (805cd5fe):
    call to nt!SeDeleteAccessState (805f2b88)
  nt!NtOpenProcess+0x202 (805cd60c):
    call to nt!PsLookupProcessByProcessId (805d50ec)
  nt!NtOpenProcess+0x224 (805cd62e):
    call to nt!ObOpenObjectByPointer (805bdc7a)
  nt!NtOpenProcess+0x232 (805cd63c):
    call to nt!SeDeleteAccessState (805f2b88)
  nt!NtOpenProcess+0x23e (805cd648):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtOpenProcess+0x246 (805cd650):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtOpenProcess+0x27e (805cd688):
    call to nt!_SEH_epilog (8053dbcb)



뷁 ,  NtOpenProcess가 호출되자마자  바로  다른곳을 호출하고 있음을 볼수있다.

더 확실히 보기 위해서


0: kd> u nt!NtOpenProcess
nt!NtOpenProcess:
805cd40a 68c4000000      push    0C4h
805cd40f 68c0c44d80      push    offset nt!ObWatchHandles+0x25c (804dc4c0)
805cd414 e8c7059731      call    EagleNT+0xa9e0 (b1f3d9e0)
805cd419 33f6            xor     esi,esi
805cd41b 8975d4          mov     dword ptr [ebp-2Ch],esi
805cd41e 33c0            xor     eax,eax
805cd420 8d7dd8          lea     edi,[ebp-28h]
805cd423 ab              stos    dword ptr es:[edi]


NtOpenProcess가 호출되자마자 바로 보안 드라이버의 함수를 실행한다.
이런 방식으로 후킹 해버리면  SSDT Restore나 Hook을 해도 마찬가지가 되버리기 때문에
알려진 공격방법에 대해서는 자유롭게 되는것이다.

NtOpenProcess 앞부분을 살펴보면
0xC4 와    ObWatchHandles+0x25C 를 PUSH 하면서  후킹함수를 호출하고 있다.
ObWatchHandles는  dd  로 살펴보니 HandleList  개념일것 같은데 ,  자세히는 모르겠다.

아마도 다른  서비스함수들 내부에도 이런식으로 여러개 따냈을것이 분명하기 때문에,
무식한방법으로 스크립트를 동원해서 내부를 싸그리 뒤져보기로 했다.

스크립트는 아래와 같이 작성하였다. (0x470은   Windows XP SP3 기준)

r $t0 = 0
r $t1 = 0
.for(r $t0 = 0; (@$t0 <= 470); r $t0 = @$t0 + 0x04)
{
      r $t1 = @$t0 + nt!KiServiceTable
      uf -c poi(@$t1)
}

그래서 결과를 추려내었더니 , 후킹하는 함수들의 목록은 아래와 같았다.

nt!NtClose (805be4fa)
  nt!NtClose+0x18 (805be512):
    call to EagleNT+0xa910 (b1f3d910)

>NtClose를 자세히 살펴보면 다음과 같다.
0: kd> u nt!NtClose
nt!NtClose:
805be4fa 8bff            mov     edi,edi
805be4fc 55              push    ebp
805be4fd 8bec            mov     ebp,esp
805be4ff 64a124010000    mov     eax,dword ptr fs:[00000124h]
805be505 0fbe8040010000  movsx   eax,byte ptr [eax+140h]
805be50c 6a00            push    0
805be50e 50              push    eax
805be50f ff7508          push    dword ptr [ebp+8]
805be512 e8f9f39731      call    EagleNT+0xa910 (b1f3d910)
805be517 5d              pop     ebp
805be518 c20400          ret     4
엥? 이게 끝인가?  NtClose는 정말 간단하게 되있군.




nt!NtDeviceIoControlFile (8057b24a)
  nt!NtDeviceIoControlFile+0x25 (8057b26f):
    call to EagleNT+0xa7d0 (b1f3d7d0)

>NtDeviceIoControlFile을 자세히 살펴보면 다음과 같다.
0: kd> u nt!NtDeviceIoControlFile
nt!NtDeviceIoControlFile:
8057b24a 8bff            mov     edi,edi
8057b24c 55              push    ebp
8057b24d 8bec            mov     ebp,esp
8057b24f 6a01            push    1
8057b251 ff752c          push    dword ptr [ebp+2Ch]
8057b254 ff7528          push    dword ptr [ebp+28h]
8057b257 ff7524          push    dword ptr [ebp+24h]
8057b25a ff7520          push    dword ptr [ebp+20h]
8057b25d ff751c          push    dword ptr [ebp+1Ch]
8057b260 ff7518          push    dword ptr [ebp+18h]
8057b263 ff7514          push    dword ptr [ebp+14h]
8057b266 ff7510          push    dword ptr [ebp+10h]
8057b269 ff750c          push    dword ptr [ebp+0Ch]
8057b26c ff7508          push    dword ptr [ebp+8]
8057b26f e85c259c31      call    EagleNT+0xa7d0 (b1f3d7d0)
8057b274 5d              pop     ebp
8057b275 c22800          ret     28h



nt!NtOpenProcess (805cd40a)
  nt!NtOpenProcess+0xa (805cd414):
    call to EagleNT+0xa9e0 (b1f3d9e0)

>NtOpenProcess는 위에서 보았으니 생략



nt!NtReadVirtualMemory (805b628c)
  nt!NtReadVirtualMemory+0x7 (805b6293):
    call to EagleNT+0xac40 (b1f3dc40)

>NtReadVirtualMemory를 자세히 보자
0: kd> u nt!NtReadVirtualMemory
nt!NtReadVirtualMemory:
805b628c 6a1c            push    1Ch
805b628e 68f0be4d80      push    offset nt!MmClaimParameterAdjustDownTime+0x90 (804dbef0)
805b6293 e8a8799831      call    EagleNT+0xac40 (b1f3dc40)
805b6298 64a124010000    mov     eax,dword ptr fs:[00000124h]
805b629e 8bf8            mov     edi,eax
805b62a0 8a8740010000    mov     al,byte ptr [edi+140h]
805b62a6 8845e0          mov     byte ptr [ebp-20h],al
805b62a9 8b7514          mov     esi,dword ptr [ebp+14h]


nt!NtWriteVirtualMemory (805b6396)
  nt!NtWriteVirtualMemory+0x7 (805b639d):
    call to EagleNT+0xad90 (b1f3dd90)


>NtWriteVirtualMemory
0: kd> u nt!NtWriteVirtualMemory
nt!NtWriteVirtualMemory:
805b6396 6a1c            push    1Ch
805b6398 6808bf4d80      push    offset nt!MmClaimParameterAdjustDownTime+0xa8 (804dbf08)
805b639d e8ee799831      call    EagleNT+0xad90 (b1f3dd90)
805b63a2 64a124010000    mov     eax,dword ptr fs:[00000124h]
805b63a8 8bf8            mov     edi,eax
805b63aa 8a8740010000    mov     al,byte ptr [edi+140h]
805b63b0 8845e0          mov     byte ptr [ebp-20h],al
805b63b3 8b7514          mov     esi,dword ptr [ebp+14h]





덧글의  TaeHwa 님의 도움으로 아래 내용 추가



 KiServiceTable에 있지않은  함수중에서  KiAttachProcess  라는 녀석이 있다.
이녀석은 이래저래 많이 사용되고 아주 민감한 녀석인데  이 녀석까지도  따내버린걸 확인할 수 있었다.
0: kd> uf /c nt!KiAttachProcess
nt!KiAttachProcess (804faa08)
  nt!KiAttachProcess+0x19 (804faa21):
    call to EagleNT+0xa3f0 (b1f3d3f0)
  nt!KiAttachProcess+0x77 (804faa7f):
    call to nt!KiReadyThread (80505124)
  nt!KiAttachProcess+0x89 (804faa91):
    call to nt!KiSwapProcess (80547ca0)
  nt!KiAttachProcess+0x91 (804faa99):
    call to nt!KiUnlockDispatcherDatabase (805478a8)
  nt!KiAttachProcess+0xe0 (804faae8):
    call to nt!KiSetSwapEvent (804fa5de)
  nt!KiAttachProcess+0xe8 (804faaf0):
    call to hal!KeAcquireQueuedSpinLockRaiseToSynch (806e8a3c)
  nt!KiAttachProcess+0x10c (804fab14):
    call to hal!KeReleaseQueuedSpinLock (806e8aa8)
  nt!KiAttachProcess+0x118 (804fab20):
    call to nt!KiSwapThread (805057bc)

0: kd> u nt!KiAttachProcess
nt!KiAttachProcess:
804faa08 8bff            mov     edi,edi
804faa0a 55              push    ebp
804faa0b 8bec            mov     ebp,esp
804faa0d 53              push    ebx
804faa0e 56              push    esi
804faa0f 8b7508          mov     esi,dword ptr [ebp+8]
804faa12 57              push    edi
804faa13 ff7514          push    dword ptr [ebp+14h]
804faa16 8b7d0c          mov     edi,dword ptr [ebp+0Ch]
804faa19 66ff4760        inc     word ptr [edi+60h]
804faa1d 8d5e34          lea     ebx,[esi+34h]
804faa20 53              push    ebx
804faa21 e8ca29a431      call    EagleNT+0xa3f0 (b1f3d3f0)
804faa26 895b04          mov     dword ptr [ebx+4],ebx
804faa29 891b            mov     dword ptr [ebx],ebx
804faa2b 8d463c          lea     eax,[esi+3Ch]




또한 

0: kd> uf /c nt!PsSuspendThread
nt!PsSuspendThread (805d6790)
  nt!PsSuspendThread+0x7 (805d6797):
    call to EagleNT+0xaee0 (b1f3dee0)
  nt!PsSuspendThread+0x22 (805d67b2):
    call to nt!KeSuspendThread (804ff4f8)
  nt!PsSuspendThread+0x52 (805d67e2):
    call to nt!ExAcquireRundownProtection (8060e3fa)
  nt!PsSuspendThread+0x6a (805d67fa):
    call to nt!KeSuspendThread (804ff4f8)
  nt!PsSuspendThread+0xa0 (805d6830):
    call to nt!KeForceResumeThread (804ff010)
  nt!PsSuspendThread+0xb4 (805d6844):
    call to nt!ExReleaseRundownProtection (8060e454)
  nt!PsSuspendThread+0xce (805d685e):
    call to nt!_SEH_epilog (8053dbcb)


0: kd> u nt!PsSuspendThread
nt!PsSuspendThread:
805d6790 6a18            push    18h
805d6792 68e8c94d80      push    offset nt!ObWatchHandles+0x784 (804dc9e8)
805d6797 e844779631      call    EagleNT+0xaee0 (b1f3dee0)
805d679c 33f6            xor     esi,esi
805d679e 8975e4          mov     dword ptr [ebp-1Ch],esi
805d67a1 64a124010000    mov     eax,dword ptr fs:[00000124h]
805d67a7 8b7d08          mov     edi,dword ptr [ebp+8]
805d67aa 3bf8            cmp     edi,eax

SuspendThread를 후킹하는것은  아마 유저모드 보안모듈의 실행흐름을 Suspend 시키는걸 방지하기 위해서 따내는것 같다.




결과적으로  현재까지 확인된 결과는
NtClose
NtDeviceIoControlFile
NtOpenProcess
NtWriteVirtualMemory
NtReadVirtualMemory
KiAttachProcess
PsSuspendThread




모듈 이름이 다 나와있긴하지만 , 대놓고 공개적으로 이름을 거론하긴 좀 뭐해서 , 모 보안 프로그램이라고 지칭하였다.
시간을 두고 살펴볼 필요가 있을것 같다.
저작자 표시 비영리 변경 금지
신고
by Sone 2009.12.21 03:39
| 1 |