[Previous] [Next]

Программы Свена Шрайбера

Программы, о которых здесь пойдет речь — лишь часть из программ-примеров, прилагаемых к уже упомянутой книге Свена Шрайбера "Недокументированные возможности Windows 2000", где можно ознакомиться с ними более подробно, включая исходные тексты и рабочие проекты, позволяющие выполнить компиляцию и сборку действительно работающих приложений. В настоящее время программы и их исходные тексты можно загрузить также с авторского Интернет-сайта Свена Шрайбера по адресу orgon.com/w2k_internals/cd.html.

Программа w2k_svc

Консольное приложение для Windows NT, позволяющее просматривать установленные службы и драйверы. Например, по команде

w2k_svc /any /all >list.txt 

программа выводит список установленных системных служб и загруженных драйверов в текстовый файл list.txt. Начало этого файла приводится ниже.

// w2k_svc.exe
// SBS Windows 2000 Service List V1.00
// 08-27-2000 Sven В. Schreiber
// [email protected]

Found 261 drivers and processes:
    1. Abiosdsk . . . . . . . . . . . . . . . . Abiosdsk
    2. abp480n5 . . . . . . . . . . . . . . . . abp480n5
    3. Драйвер  . . . . . . . . . . . . . . . . Microsoft ACPI ACPI
    4. ACPIEC . . . . . . . . . . . . . . . . . ACPIEC
. . . . . . . . . . . . . . . . . . . . . . . .

Записи отсортированы в алфавитном порядке по имени сервиса (имя, которым представлен драйвер, например, в Системном Реестре). В частности, драйвер мини-порта Microsoft USB универсального хост-контроллера загружается из файла c:\Windows\System32\DRIVERS\usbuhci.sys, имеет имя сервиса "usbuhci". Соответственно, в данном примере запись об этой службе идет под номером 238 (в соответствии с положением "usbuhci" среди имен остальных служб).

Задать вывод информации только лишь о драйверах можно командой:

w2k_svc /drivers /active >list.txt 

Программа w2k_sym

Консольное приложение для Windows NT, позволяющее просматривать процессы и работающие драйверы режима ядра. Например, по команде

w2k_sym /v /d >list.txt 

программа выводит список загруженных драйверов (см. фрагмент распечатки ниже) в текстовый файл list.txt. В данном случае (для компьютера, на котором проводился тест) первые 27 записей абсолютно идентичны списку DLL и системных драйверов, выводимому при загрузке операционной системы, если в файл boot.ini ввести ключ загрузки /sos (обеспечивающий вывод на экран списка загружаемых драйверов во время старта системы).

121 drivers
Monday, 12-30-2002, 14:29:07


    #  ADDRESS       SIZE NAME
-------------------------------------------------------------------
    1: 804D0000    1E4580 \WINDOWS\system32\ntoskrnl.exe
    2: 806B5000     1F700 \WINDOWS\system32\hal.dll
    3: FD998000      1B80 \WINDOWS\system32\KDCOM.DLL
    4: FD8A8000      3000 \WINDOWS\system32\BOOTVID.dll
    5: FD44B000     2BE00 ACPI.sys
    6: FD99A000      1100 \WINDOWS\System32\DRIVERS\WMILIB.SYS
    7: FD498000      F500 pci.sys
    8: FD4A8000      8D00 isapnp.sys
    9: FD99C000      1100 viaide.sys
   10: FD718000      5C80 \WINDOWS\System32\DRIVERS\PCIIDEX.SYS
   11: FD4B8000      9280 MountMgr.sys
   12: FD42C000     1EA00 ftdisk.sys
   13: FD99E000      1700 dmload.sys
   14: FD408000     23C80 dmio.sys
   15: FD720000      4900 PartMgr.sys
   16: FD4C8000      C000 VolSnap.sys
   17: FD3F2000     15280 atapi.sys
   18: FD4D8000      8380 disk.sys
   19: FD4E8000      AF80 \WINDOWS\System32\DRIVERS\CLASSPNP.SYS
   20: FD3E0000     11300 sr.sys
   21: FD3BC000     23580 Fastfat.sys
   22: FD3A8000     13780 KSecDD.sys
   23: FD380000     27700 NDIS.sys
   24: FD728000      6B00 viaagp.sys
   25: FD9A0000      1C80 nmfilter.sys
   26: FD362000     1D320 Siwvid.sys
   27: FD348000     19600 Мuр.sys
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Интересно, что по командам

w2k_sym /v /m - выводить список загруженных модулей
w2k_sym /v /p - выводить список работающих процессов 

информация о драйверах не выводится. Это косвенный, но уверенный намек на то, что драйверы не представляют полноценных процессов (впрочем, как и динамические библиотеки, DLL), а работают в контексте того кода, который к ним обратился.

Программа w2k_mem

Консольное приложение для Windows NT, позволяющее просматривать дамп любых областей памяти, включая внутренние области ядра (системной памяти с адресами более 0x80000000), что недоступно для приложений пользовательского режима.

Предположим, вы воспользовались командой

w2k_mem #0x200 0x898F9094 >display_mem1.txt 

тогда в файле display_mem1.txt вы сможете увидеть дамп памяти длиной 512 байт (то есть 0x200) по шестнадцатеричному адресу 0xF98F9094 — конечно же, только в том случае, если память по этому адресу в настоящий момент выделена какому-нибудь процессу. В противном случае, результат будет следующим:

F98F9094..F98F9293: 0 valid bytes
Address  | 04 05 06 07-08 09 0A 0B : 0C 0D 0E OF-10 11 12 13 | 456789ABCDEF0123
---------|-------------------------:-------------------------|-----------------
F98F9094 |            -            :            -            |
F98F90A4 |            -            :            -            |
F98F90B4 |            -            :            -            |
F98F90C4 |            -            :            -            |
F98F90D4 |            -            :            -            |
F98F90E4 |            -            :            -            |

. . . . . . . . . . . . . . . . . . . . . . . .

Для успешно выполненной команды (в примере ниже по адресу 0x80DC5C88 существует занятая область памяти)

w2k_mem #0x200 0x80DC5C88 >display_mem2.txt 

результат выглядит следующим образом:

80DC5C88..80DC6087: 256 valid bytes
Address  | 08 09 0A 0B-0C 0D 0E 0F : 10 11 12 13-14 15 16 17 | 89ABCDEF01234567
---------|-------------------------:-------------------------|-----------------
80DC5C88 | 03 00 C4 00-00 00 00 00 : 48 56 F4 FE-00 00 00 00 | ..A.....HVo?....
80DC5C98 | 00 00 00 00-00 00 00 00 : 00 00 00 00-40 00 00 00 | [email protected]
80DC5CA8 | 00 00 00 00-00 00 00 00 : 40 5D DC 80-22 00 00 00 | [email protected]]U?"...
80DC5CB8 | 01 00 00 00-00 00 00 00 : 00 00 00 00-00 00 00 00 | ................
80DC5CC8 | 00 00 00 00-00 00 00 00 : 00 00 00 00-00 00 00 00 | ................
80DC5CD8 | 00 00 00 00-00 00 00 00 : 00 00 00 00-00 00 00 00 | ................
80DC5CE8 | 14 00 14 00-EC 5C DC 80 : EC 5C DC 80-00 00 00 00 | ....i\U?i\U?....
. . . . . . . . . . . . . . . . . . . . . . . .

Строго говоря, подобных результатов можно добиться и при помощи отладчиков например, SoftIce. Тем не менее, у трех упомянутых программ имеется одно неоспоримое преимущество: методы, наработанные Свеном Шрайбером, могут быть включены в нужное место программного кода ваших приложений (к чему призывает и сам автор этих программ).

Наиболее очевидный способ получения стартовых адресов для путешествия по памяти режима ядра заключается в использовании вывода сообщений из отладочных версий драйверного кода, которые видны в рабочих окнах программ Debug View или Debug Print Monitor.