Резюме: история в картинках о том, как я «улучшал» Диспетчер задач в Windows Server 2012.
Преамбула
Все началось с того, что в целях тестирования (чтобы выяснить, есть ли принципиальная разница) я поставил Windows Сервер 2012 .Для тех кто не знает, вот что это такое Windows 8 , только дороже.
Ну, а еще, с него можно оторвите графический интерфейс и исполнял самые разные роли.
Ну и одна из самых приятных вещей в Windows 8 для меня — это новый Диспетчер задач, и красивый, и удобный.
Каково же было мое удивление, когда я открыл его в WinServer 2012 и не увидел некоторых данных.
Вот пару фотографий для наглядности.
Windows 8:
Windows Сервер 2012
Как видите, не хватает пары вкладок, кроме того, отсутствуют колонки «Диск» и «Сеть».
Диска пока нет на вкладке «Производительность», но по крайней мере это можно включить командой: diskperf -y
Вооружившись Гуглом, я выяснил, что проблема в следующем:
Это связано с тем, что метрики диска по умолчанию отключены в Windows Server 2012 из-за значительного влияния на производительность, однако в Windows 8 они включены.( подробнее здесь ) Что в переводе на русский звучит как «слишком большая нагрузка на диск, поэтому мы удалили ее».Используйте монитор ресурсов для оценки использования дискового и сетевого ввода-вывода.
— Сайед Юсуф из отдела исследований и разработок Microsoft
Вот как я себе представляю картину: серверная, все бегают в оцепенении, сервер не отвечает, нагрузка ужасающая.
И скромный админ в углу: «Я случайно открыл диспетчер задач на сервере вместо нетбука, больше так делать не буду!» То есть, по мнению Microsoft, это вызывает огромную нагрузку на мощных серверах, а на планшетах никаких проблем не вызывает, поэтому удалим здесь и включим здесь.
Несмотря на то, что на серверах диспетчер задач запускается раз в полгода, просто чтобы посмотреть проблемы с производительностью, но у нас эта функция по какой-то странной причине удалена.
В общем меня это не устроило и я начал исследовать проблему.
Версия 1. Реестр
Зная Microsoft и то, что все настраивается в реестре, я начал копаться в Taskmgr.exe, чтобы найти возможные ключи.
Единственный подходящий ключ был найден в HKLM\ System\CurrentControlSet\Services\Partmgr, EnableCounterForIoctl
Но как я узнал ранее, этот ключ включается командой diskperf и интереса не представляет.
Версия 2. Это действительно проверка типа системы?
Совершенно не веря, что такое может произойти (Microsoft обычно просто вырезает ненужные файлы), я решил проверить, что будет, если я скажу Диспетчеру задач, что это действительно находится в клиентской системе.Чтобы проверить версию системы из вашего приложения, вам нужно вызвать функцию GetVersionEx .
Структура вернется ОСВЕРСИЯИНФОЭКС , где поле dwProductType будет указывать, является ли система серверной или клиентской версией.
При этом GetVersionEx вызывает RtlGetNtProductType, который в регистре ecx возвращает 1 для клиента и 3 для сервера.
Начнем с этого.
Я не пользовался многими отладчиками под Windows, поэтому выбрал единственный, который умею использовать в данном случае, WinDbg ( Прямая ссылка не последняя версия).
Для него есть замечательная команда, с помощью которой можно сделать автоматический брейкпойнт с заменой: bp ntdll!RtlGetNtProductType "as /x ReturnValue rcx; gu; ed ReturnValue 1; g"
(т.е.
открываем наш Taskmgr.exe, выполняем команду, запускаем выполнение).
И.
идея сработала.
Все вкладки появились и были полностью работоспособны.
Те.
функционально все присутствует, но отключено только по политическим причинам (могли бы просто скрыть по умолчанию по тем же причинам).
Соответственно, нам нужно копать дальше в этом направлении.
Мы ставим точку останова на ntdll!RtlGetNtProductType и смотрим на стек вызовов, когда к нам обращается настоящий Taskmgr, а не на куски инициализации.
Это выглядит примерно так:
Идем по трассировке стека, ставим точку останова на TaskMgr (или доходим до нее вручную) и видим следующий код:
Это проверка кода возврата, нам здесь делать нечего, пойдем чуть дальше:
Вот он, сок!
Регистры по 1 и 3 сравниваются и в зависимости от ситуации происходит переход в нужную ветку.
Устанавливаем al в 1 и наблюдаем, что всё работает успешно.
Половина пути пройдена.
Нам нужно на постоянной основе думать о решениях, как все это формализовать.
- Можно сделать скрипт для WInDbg, который все сделает сам.
Неспортивно
- Исправьте память перед запуском TaskMgr. Пришлось отбросить этот вариант, потому что я не знаю, как это сделать, и разбираться в нем придется долго.
- Исправьте сам файл Taskmgr.exe. Самый простой вариант — нарушить целостность файла и система может периодически возвращать его к старой версии.
Но я решил, что с этим можно жить и начал думать об этом варианте.
В общем, я выбрал самый глупый метод, заменив jne на пару nops. Так что в результате будет бессмысленное сравнение, потом прыжок в нужное место.
Это делается просто.
Запоминаем необходимую последовательность байт: 8a84244a0100003с01, находим ее в любимом Hex-редакторе и меняем на нужную.
В данном случае 750с на 9090. Мы экономим и.
Обнаруживаем, что взломали цифровую подпись файла (ну кто бы в этом сомневался).
Значит, ее надо убить.
Вариантов много, но мы в хабе, поэтому воспользуемся программой дизайн из хабраузера ДнВ .
Запускаем.
и ничего.
Те же проблемы с поврежденной подписью.
Откуда он это берет? Не буду утомлять вас рассказом о том, как я пытался в этом разобраться, сам подписывал файл, готов был от всего этого отказаться, но получилось.
(это скриншот из программы Стад_PE ).
Вы видели шутку от Microsoft? Целостность файла проверяется флагом в сам файл.
Не могу понять тайный смысл этого, разве что защита от тупых вирусов.
Не понимаю как я дошёл до этого флага, но в общем убираем его, сохраняем и.
все работает! После этого заменяем оригинальный (не забывая дать себе права на это действие), и пользуемся расширенным Диспетчером задач.
Ну и бонусом пишем статью для Хабра :) Надеюсь, она была вам интересна.
Если кто захочет повторить в ознакомительных целях, то для проверки правильности результата вот он файл .
ОБНОВЛЕНИЕ 08.10.2018 Пользователь ЭйДжейлекс обновлено диспетчер задач Теги: #windows server 2012 #exe #Индуистский код #microsoft #Ненормальное программирование #Ассемблер
-
Спрятан Баг С Запретом Символа Процента
19 Oct, 24 -
Бизнес Против Сервиса
19 Oct, 24