This time we'll be looking for functions and their addresses in IAT (Import Address Table) in one of kernel modules, e.g. Ntfs.sys
First you need to do in windbg is to view file headers of module and get IAT address :
0: kd> !dh -f ntfs
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
0 DLL characteristics
0 [ 0] address [size] of Export Directory
86674 [ 50] address [size] of Import Directory
17B80 [ 51C] address [size] of Import Address Table Directory
............................................................................
Then you need to find out module's start address:
0: kd> lm m ntfs
start end module name
b9e35000 b9ec1600 Ntfs (deferred)
And now when you know IAT directory address and module's start address you can look whole list of functions in IAT of Ntfs module
0: kd> dds b9e35000+17b80
b9e4cb80 806e69f0 hal!KeAcquireInStackQueuedSpinLock
b9e4cb84 806e6940 hal!ExAcquireFastMutex
b9e4cb88 806e6aa8 hal!KeReleaseQueuedSpinLock
b9e4cb8c 806e6a4c hal!KeAcquireQueuedSpinLock
b9e4cb90 806e6900 hal!KfReleaseSpinLock
b9e4cb94 806e699c hal!ExTryToAcquireFastMutex
b9e4cb98 806e6974 hal!ExReleaseFastMutex
b9e4cb9c 806e6aa0 hal!KeReleaseInStackQueuedSpinLock
b9e4cba0 806e6830 hal!KfAcquireSpinLock
b9e4cba4 00000000
b9e4cba8 b9ec3022 KSecDD!GenerateSessionKey
b9e4cbac b9ec2fdc KSecDD!EfsGenerateKey
b9e4cbb0 b9ec3002 KSecDD!GenerateDirEfs
b9e4cbb4 b9ec28f4 KSecDD!InitSecurityInterfaceW
b9e4cbb8 b9ec3012 KSecDD!EfsDecryptFek
b9e4cbbc 00000000
b9e4cbc0 8054705c nt!ExRaiseStatus
b9e4cbc4 804ec29a nt!FsRtlNormalizeNtstatus
b9e4cbc8 804e41b4 nt!CcFlushCache
b9e4cbcc 80535b9e nt!ExIsResourceAcquiredExclusiveLite
b9e4cbd0 8052e79c nt!RtlInitUnicodeString
b9e4cbd4 80546168 nt!InterlockedPopEntrySList
b9e4cbd8 8054618c nt!RtlpInterlockedPushEntrySList
b9e4cbdc 804f7e92 nt!KeQuerySystemTime
b9e4cbe0 80546210 nt!RtlCompareMemory
b9e4cbe4 8056d1b6 nt!FsRtlAreNamesEqual
b9e4cbe8 804eb004 nt!FsRtlCheckLockForWriteAccess
As yu may noticed, it lists not only functions regarding to ntoskrnl.exe , so it seems like Ntfs module contains exports to a few modules like hal.dll , KSecDD and ntoskrnl.exe. To ensure, we may use PEtools utility ( see screen below):
By the way, if you are too lazy to use windbg :-) you can use PEtools.
Показаны сообщения с ярлыком livekd. Показать все сообщения
Показаны сообщения с ярлыком livekd. Показать все сообщения
среда, 20 октября 2010 г.
четверг, 29 октября 2009 г.
Просмотр PEB процесса
Итак, все что нам нужно
1. Узнать адрес процесса !process 0 0
2. Перейти в контекст процесса .process
3. Display PEB : !peb
Ниже пример:
В общем, еще одно замечание. после выполнения .process вы в контексте ТОЛЬКО данного процесса, теперь надо бы вернуться обратно, т.е. надо перейти на контекст процесса System.
Вот, пожалуй, и все.
P.S. кстати, сравнивая выводы PEB & VAD можно кое-что интересное обнаружить.
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
либо заюзав dd W32pServiceTable и потом шагами смотреть каждый индекс (см. пред заметку), либо сразу вывести табличку dds W32pServiceTable L29A
Для просмотра этой таблицы, выведем все таблицы которые есть в 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.
Далее,
Этот вывод содержит указатели на системные сервисы, такие как NtCreateFile etc.
Чтобы просмотреть системный сервис с определенным индексом делаем так:
dd 80504460+(индекс)*4
Да, мои читатели, спросите вы меня.. неужели теперь надо делать так много шагов и действий ? Нет, чтобы просмотреть все таблицу KiServiceTable, достаточно просто указать команду:
dds KiServiceTable L117
и эта команда вам выведет все 279 индексов (дада, 0x117h = 279 ), если хотите вывести больше - измените 117 на любое число )
Команды 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 // 1с - индекс ф-и
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
Далее, используем команду !vad отладчика ядра:
Чтобы просмотреть, что именно содержится по адресу StartVPN есть замечательные команды , !dd!da, !du, !dc. Если вы заметили, то при еще при выводе !vad 8a0cac38, у нас выводятся StartVPN & EndVPN адреса. Так что можно смело писать !dc addr>*0x1000
Что самое интересное, командой dс 280*1000 невозможно просмотреть что находится по этому адресу, точнее выдается инфа, но не та. Для этого, нужно переключиться в комнтекст данного процесса, как пишет MSDN, юзаем команду .process 8a3758a8 , далее - смотрим dc 280*1000 и убеждаемся, что там находится на 1-й строчке сигнатура РЕ файла - 'MZ'.... вот для меня только вопрос.. как выйти из контекста ? Об этом и PEB - в следующей статье )
1. Чтобы отладчик выводил логи, можно использовать команду .logopen
2. Чтобы просмотреть сервисы, на которых стоят хуки, надо просмотреть таблицу KiServiceTable, делается это командой dds KiServiceTable L130
3. Чтобы просмотреть информацию о процессах, сущестувет команда !process 0 0 - она выводит все процессы. такая же команда с параметром 1 выведет краткую инфу о процессе, которая будет включать DirBase, которая понадобится для перехода в контекст процесса ( .context
Поговорим подробнее о просмотре дерева 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Обратим внимание на адреса с Execute_writecopy:
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
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
Что самое интересное, командой dс 280*1000 невозможно просмотреть что находится по этому адресу, точнее выдается инфа, но не та. Для этого, нужно переключиться в комнтекст данного процесса, как пишет MSDN, юзаем команду .process 8a3758a8 , далее - смотрим dc 280*1000 и убеждаемся, что там находится на 1-й строчке сигнатура РЕ файла - 'MZ'.... вот для меня только вопрос.. как выйти из контекста ? Об этом и PEB - в следующей статье )
Подписаться на:
Сообщения (Atom)