четверг, 29 октября 2009 г.

Просмотр PEB процесса

Итак, все что нам нужно
1. Узнать адрес процесса !process 0 0
2. Перейти в контекст процесса .process
3. Display PEB :  !peb

Ниже пример:
kd> !process 0 0
..........................................................................................................................

PROCESS 89a377a8  SessionId: 0  Cid: 07c8    Peb: 7ffdb000  ParentCid: 041c
    DirBase: 52ddc000  ObjectTable: e17023d8  HandleCount: 534.
    Image: KMPlayer.exe

..........................................................................................................................
kd> .process  89a377a8
Implicit process is now 89a377a8
kd> !peb
PEB at 7ffdb000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         00400000
    Ldr                       00251e90
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00251f28 . 002549f0
    Ldr.InLoadOrderModuleList:           00251ec0 . 002549e0
    Ldr.InMemoryOrderModuleList:         00251ec8 . 002549e8
            Base TimeStamp                     Module
          400000 2a425e19 Jun 20 01:22:17 1992 C:\PROGRA~1\THEKMP~1\KMPlayer.exe
        7c900000 49900b58 Feb 09 12:54:16 2009 C:\WINDOWS\system32\ntdll.dll
        7c800000 49c4f502 Mar 21 16:09:06 2009 C:\WINDOWS\system32\kernel32.dll
        7e360000 480381e1 Apr 14 19:10:09 2008 C:\WINDOWS\system32\user32.dll
        77f10000 49007130 Oct 23 15:42:24 2008 C:\WINDOWS\system32\GDI32.dll
        77dc0000 49900b58 Feb 09 12:54:16 2009 C:\WINDOWS\system32\advapi32.dll
        77e70000 49e5f504 Apr 15 17:53:56 2009 C:\WINDOWS\system32\RPCRT4.dll
        77fe0000 4a4334e7 Jun 25 11:27:19 2009 C:\WINDOWS\system32\Secur32.dll
        77110000 480381dc Apr 14 19:10:04 2008 C:\WINDOWS\system32\oleaut32.dll

................................. куча букав ................................................

В общем, еще одно замечание. после выполнения .process вы в контексте ТОЛЬКО данного процесса, теперь надо бы вернуться обратно, т.е. надо перейти на контекст процесса System.

Вот, пожалуй, и все.

P.S. кстати, сравнивая выводы PEB & VAD можно кое-что интересное обнаружить.

Посматриваем таблицу Shadow SSDT (win32k.sys)

Итак, долго мучался, нашел :)
Для просмотра этой таблицы, выведем все таблицы которые есть в KeServiceDescriptorTableShadow


0: kd> dds KeServiceDescriptorTableShadow
8055c6c0  80504460 nt!KiServiceTable
8055c6c4  00000000
8055c6c8  0000011c
8055c6cc  805048d4 nt!KiArgumentTable
8055c6d0  bf99a000 win32k!W32pServiceTable   - то что нам нужно
8055c6d4  00000000
8055c6d8  0000029b
8055c6dc  bf99ad10 win32k!W32pArgumentTable
8055c6e0  00000000
8055c6e4  00000000
8055c6e8  00000000
8055c6ec  00000000
8055c6f0  00000000
8055c6f4  00000000
8055c6f8  00000000
8055c6fc  00000000
8055c700  80504460 nt!KiServiceTable
8055c704  00000000
8055c708  0000011c
8055c70c  805048d4 nt!KiArgumentTable
Теперь, просто можем просмотреть таблицу
либо заюзав dd W32pServiceTable и потом шагами смотреть каждый индекс (см. пред заметку), либо сразу вывести табличку dds W32pServiceTable L29A

просматриваем таблицу KiServiceTable

Итак, все объяснения добавлю позже. О том что такое SSDT и т.п. можете почитать на WASMе , а также почитать Статью

Команды LiveKD:

//display table:
dd KeServiceDescriptorTable

Индекс KiServiceTable=KeServiceTable[0], т.е. первый адрес в KeServiceTable.
И еще, в системе есть также и KeServiceDescriptorTableShadow - та самая копия, так вот, по идее, если все гуд .  то индекс KiSErviceTable=KeServiceDescriptorTableShadow[0] и он равен индексу который в KeServiceDescriptorTable, тобиж, из примера ниже, если все делать, оба индекса должны быть равны 80504460.

0: kd> dd KeServiceDescriptorTable
8055c700  80504460 00000000 0000011c 805048d4  - красным цветом - индекс KiServiceTable
8055c710  00000000 00000000 00000000 00000000
8055c720  00000000 00000000 00000000 00000000
8055c730  00000000 00000000 00000000 00000000
8055c740  00000002 00002710 bf80c339 00000000
8055c750  ba5a7a80 8ad5fcf0 8a391a90 806f60c0
8055c760  00000000 00000000 ffeced30 ffffffff
8055c770  7f4c8370 01ca5871 00000000 00000000

Далее,


0: kd> dd 80504460
80504460  805a4614 805f0aea 805f4320 805f0b1c
80504470  805f435a 805f0b52 805f439e 805f43e2
80504480  806153ce 80616110 805ebee8 b5e58d46
80504490  805d4b48 805d4af8 806159f4 805b5f80
805044a0  80615010 805a8a9e 805b0594 805d660c
805044b0  8050189c 80616102 80576ae6 80538be2
805044c0  8060e5de 805bc4fa 805f485a 80623382
805044d0  805f8d6a 805a4d02 806235d6 b5e58250

Этот вывод содержит указатели на системные сервисы, такие как NtCreateFile etc.

Чтобы просмотреть системный сервис с определенным индексом делаем так:
dd 80504460+(индекс)*4





0: kd> dd 80504460+1c*4     // - индекс ф-и
805044d0  805f8d6a 805a4d02 806235d6 b5e58250  // - указатель на ф-ю





чтобы просмотреть имя и название ф-и, достаточно сделать так:






0: kd> dt 805f8d6a 


NtCompareTokens      // конечное имя ф-и, которая имеет индекс 0х1С в таблице сервисов



Да, мои читатели, спросите вы меня.. неужели теперь надо делать так много шагов и действий ? Нет, чтобы просмотреть все таблицу KiServiceTable, достаточно просто указать команду:


dds KiServiceTable L117 


и эта команда вам выведет все 279 индексов (дада, 0x117h = 279 ), если хотите вывести больше - измените 117 на любое число )