Иногда при отладке у вас бсод, к нему, как говорится, прилагается BugCheck.
вот именно в этом "багчеке" есть определенные коды вылета системы. что поможет вам в анализе дампа, т.к. не всегда получается то что хотите.
Само описание всех багчеков доступно на msdn -
Надеюсь, поможет в будующей работе. :-)
вторник, 17 ноября 2009 г.
понедельник, 16 ноября 2009 г.
VirtualKD. Ускоряем генерацию дампа в DbgView.
если что-то давало БСОД и вам надо было сделать ПОЛНЫЙ дамп, ( команда ./dump /f ), то его генерация могла занять мнооого времени....
Эти и многие другие проблемы решает утилита VirtualKD.
Скачать ее можно с этого сайта . Пользуйтесь!
Пишут что она поддерживает Vmware + VirtualBox.
у меня сейчас последняя версия workstation (6.5.3), и работает вроде как стабильно, правда WinDbg пришлось вручную запукать для отладки по пайпу ) .
ЗЫ. правда поначалу чтобы поставить утилитку придетсяпомучать прочитать что и как установить ;)
Эти и многие другие проблемы решает утилита VirtualKD.
Скачать ее можно с этого сайта . Пользуйтесь!
Пишут что она поддерживает Vmware + VirtualBox.
у меня сейчас последняя версия workstation (6.5.3), и работает вроде как стабильно, правда WinDbg пришлось вручную запукать для отладки по пайпу ) .
ЗЫ. правда поначалу чтобы поставить утилитку придется
куда делся вывод логов драйвера в Vista / Windows 7 через WinDbg ?
Вот недавно столкнулся с проблемой...
На чековой семерке в WinDbg не могу просмотреть вывод лога тестируемого драйвера.
1 способ
После некоторых опросов знакомых программистов, выяснилось, что это все решается в реестре.
Open up the registry and go to this path,
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter"
and add the following value "DEFAULT" : REG_DWORD : 0xFFFFFFFF and then reboot
Вот и все...
Надеюсь, что это кому-то поможет . :)
2 способ
просто во время удаленной отладки вводим команду
На чековой семерке в WinDbg не могу просмотреть вывод лога тестируемого драйвера.
1 способ
После некоторых опросов знакомых программистов, выяснилось, что это все решается в реестре.
Open up the registry and go to this path,
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter"
and add the following value "DEFAULT" : REG_DWORD : 0xFFFFFFFF and then reboot
Вот и все...
Надеюсь, что это кому-то поможет . :)
2 способ
просто во время удаленной отладки вводим команду
ed nt!KD_DEFAULT_MASK 0xFFFFFFFF
четверг, 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 - в следующей статье )
вторник, 27 октября 2009 г.
Мой первый блог
Привет всем, кто сейчас читает этот блог .
В этом блоге постараюсь оставлять нужную информацию, которая требуется для тестирования программ.
В этом блоге постараюсь оставлять нужную информацию, которая требуется для тестирования программ.
Подписаться на:
Сообщения (Atom)