четверг, 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 на любое число )



среда, 28 октября 2009 г.

Полезности при работе с LiveKD

Итак, постараюсь обновлять эту тему как можно чаще, так как иногда при тестировании драйверов нужно юзать отладчик режима ядра.

1. Чтобы отладчик выводил логи, можно использовать команду .logopen
2. Чтобы просмотреть сервисы, на которых стоят хуки, надо просмотреть таблицу KiServiceTable, делается это командой dds KiServiceTable L130
3. Чтобы просмотреть информацию о процессах, сущестувет команда !process 0 0 - она выводит все процессы. такая же команда с параметром 1 выведет краткую инфу о процессе, которая будет включать DirBase, которая понадобится для перехода в контекст процесса ( .context ), также можно просмотреть PEB процесса, VAD etc.
Поговорим подробнее о просмотре дерева VAD
1. получим инфу, где находится Vad в процессе firefox.exe
0: kd> !process 8a3758a8 1
PROCESS 8a3758a8  SessionId: 0  Cid: 06c8    Peb: 7ffdf000  ParentCid: 0288
    DirBase: 0b3c81c0  ObjectTable: e3721438  HandleCount: 1257.
    Image: firefox.exe
    VadRoot 8a0cac38 Vads 613 Clone 0 Private 27256. Modified 19445. Locked 0.

Далее, используем команду !vad отладчика ядра:
0: kd> !vad 8a0cac38
VAD     level      start      end    commit
8a2540a8 (16)         10       10         1 Private      READWRITE
8a241b80 (17)         20       20         1 Private      READWRITE
8a23cc98 (15)         30      12f        52 Private      READWRITE
8a175f08 (17)        130      132         0 Mapped       READONLY
8a254600 (16)        140      141         0 Mapped       READONLY
8a393850 (18)        150      18f        64 Private      READWRITE
8a141910 (17)        190      19f         7 Private      READWRITE
89f98d98 (19)        1a0      1af         0 Mapped       READWRITE
8a144bc8 (18)        1b0      1c5         0 Mapped       READONLY
8a1d8fb0 (20)        1d0      210         0 Mapped       READONLY
8a1a3eb8 (19)        220      260         0 Mapped       READONLY
8a1dafd8 (21)        270      275         0 Mapped       READONLY
8a0e6910 (20)        280      2eb        96 Mapped  Exe  EXECUTE_WRITECOPY
8a2cb270 (21)        2f0      3d3       213 Mapped  Exe  EXECUTE_WRITECOPY
8a27e630 (22)        3e0      3f7        18 Mapped  Exe  EXECUTE_WRITECOPY
Обратим внимание на адреса с Execute_writecopy:


0: kd> !vad 8a0e6910  1

VAD @ 8a0e6910
  Start VPN          280  End VPN      2eb  Control Area  8a211ca0
  FirstProtoPte e1486460  LastPte fffffffc  Commit Charge       60 (96.)
  Secured.Flink        0  Blink          0  Banked/Extend        0
  File Offset          0
      ImageMap ViewShare EXECUTE_WRITECOPY


ControlArea  @ 8a211ca0
  Segment      e1486420  Flink      00000000  Blink        00000000
  Section Ref         0  Pfn Ref          6a  Mapped Views        1
  User Ref            1  WaitForDel        0  Flush Count         0
  File Object  8a36fd78  ModWriteCount     0  System Views        0

  Flags (90000a0) Image File HadUserReference Accessed


      File: \Program Files\Mozilla Firefox\sqlite3.dll

Segment @ e1486420
 ......................................................................
Reload command: .reload sqlite3.dll=280000,6c000


Как видим, там содержится модуль sqlite3.dll


Чтобы просмотреть, что именно содержится по адресу StartVPN есть замечательные команды , !dd!da, !du, !dc. Если вы заметили, то при еще при выводе !vad 8a0cac38, у нас выводятся StartVPN & EndVPN адреса. Так что можно смело писать !dc addr>*0x1000

Что самое интересное, командой dс 280*1000 невозможно просмотреть что находится по этому адресу, точнее выдается инфа, но не та. Для этого, нужно переключиться в комнтекст данного процесса, как пишет MSDN, юзаем команду .process 8a3758a8 , далее - смотрим dc 280*1000 и убеждаемся, что там находится на 1-й строчке сигнатура РЕ файла - 'MZ'.... вот для меня только вопрос.. как выйти из контекста ?  Об этом  и PEB - в следующей статье )

вторник, 27 октября 2009 г.

Мой первый блог

Привет всем, кто сейчас читает этот блог .
В этом блоге постараюсь оставлять нужную информацию, которая требуется для тестирования программ.