|
Tanaka Опубликовано: dl, 25.11.01 22:44 Как-то раз, я торопился домой, а моя
любимая Windows NT никак не хотела выключаться. "Ну
же, давай, дохни, родимая," - в нетерпении
понукал я машину но тщетно. Особенно меня бесило
то, что никаких разумных причин таких тормозов не
наблюдалось. К внешним устройствам обращения
нет, машина не свопится. Сколько же нужно
операций процессору, чтобы выключить машину?
Очевидно, дядюшка Билли просто решил оттянуться
с "Мириндой" или пробовал новый "Дью".
Итак, надо мной откровенно издевались, а мне лишь
оставалось в бессильной злобе скрипеть зубами.
Немыслимое унижение, а главное от кого?! И в
ярости я поклялся отмстить!!! - Нэ надо, слюшай! Как всем известно, есть такая хорошо задокументированная функция ExitWindowsEx(), а еще есть плохо задокументированная функция ZwShutDownSystem(). Логично предположить, что эти функции взаимосвязаны и в конце концов ExitWindowsEx() передает управление ZwShutDownSystem(). Попробовал, обе функции прекрасно выключают Windows, только первая делает это долго, а вторая быстро. Казалось бы все понятно: именно в ExitWindowsEx() и происходят все ненужные нам паузы. Ага, щас! - И передает ее влюбленному джигиту. При штатном останове функция ZwShutDownSystem() вообще не вызывается! Давайте рассмотрим, что же происходит при вызове ZwShutDownSystem(). BOOL ZwShutDownSystem(DWORD arg); где arg - некий параметр, может быть и адресом и
числом. Из ntdll.dll сразу же происходит обращение в ядро (ntoskrnl.exe). Далее, система последовательно дергает кучу других "shutdown". А именно, ... Как говорится, без комментариев. И, наконец, "здравствуй железо" call __imp__HalReturnToFirmware После короткой возни в hall.dll, все заканчивается короткой командой ... нет, не "Пли!", нет, и не "Режь!", а out DX, AL Как я ее понял, в 64 порт пишут значение 0xfe. По-видимому, это останов процессора. А может и нет! Кто знает, напишите мне, пожалуйста! Заметим, что SoftIce работает до самого конца! То есть, скорее всего выгрузки драйверов не происходит. Но вернемся к нашему единственному барану, а именно к функции ExitWindowsEx(). Здесь процедура и проще, и ... сложнее! Я еще раз оценил юмор компании Microsoft. - Ха! Шютник! Будишь рэзать свой невеста, мэня нэ забудь позвать! Вся работа ExitWindowsEx() сводится к
добавлению к своим двум аргументам (один из
которых по официальной версии не используется)
еще одного (всегда 0x00) и вызову функции ExitWindowsWorker()
теперь уже с тремя аргументами (один из которых
по официальной версии не используется, а другой
всегда 0x00). ... Итак, остается констатировать неутешительный факт: остановка Windows отдана на откуп подсистеме, взаимодействие с которой происходит через LPC-механизм. - В маем доме нэ выражаться! Благодаря господину Охапкину (поистине великий гуру!), формат функции CsrClientCallServer() известен: int CsrClientCallServer(DWORD length, DWORD opcode, DWORD zero, PVOID message), где length - длина чего-то, но не всего сообщения; При вызове ExitWindowsEx() аргументы
CsrClientCallServer() имеют следующие значения: Итак, можно перегружать (restart), завершать сеанс (log off) и выключать Windows (shut down или power off), используя CsrClientCallServer() с соответствующим 11 словом. Например, 0x08 - Power off 0x00 - Log off 0x02 - Reboot и т. д. "Ну хорошо, это в NT4.0, а как насчет
Windows 2000?" - спросит читатель и будет совершенно
прав. В Win2000 дядюшка Билли уже не так добр и
открыт, как в старые добрые времена. Многие
функции из user32.dll больше не экспортируются в том
числе и функция ExitWindowsWorker() (хотя по-прежнему
вызывается). Перед отправкой сообщение в
подсистему происходят еще какие-то действия
внутри win32k.sys. В остальном все очень похоже, разве,
как уже было сказано, opcode изменился. Что касается
ZwShutDownSystem(), то мне удалось выяснить только, что в
определенный момент происходит проход по
спискам драйверов, и где-то на середине Soft-Ice
намертво падает. - Будем ждать. Сдавай! Да, кстати, чуть не забыл. Биллофобам и окноненавистникам, думаю, будет приятно узнать, что если с помощью CsrClientCallServer() отправить подряд два сообщения с 11-ым словом 0x08 (см. исходник), то сервера как NT4.0, так и Win2000 падают довольно специфическим способом: пустой экран, мышь работает, Soft-Ice работает, но больше ничего сделать нельзя, Task Manager не вызывается. - Нычего ж нэ сдэлал, только вошел! Обыдно, слюшай! Минут 15 ничего не менялось, дальше мое терпение истощилось и я нажал Reset. Вот, пожалуй, и все. Если есть вопросы, замечания или предложения, пишите по адресу tanaka@rambler.ru или смотрите на нашем сайте teamz.nm.ru P.S.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|