Blog. Just Blog

Как запустить несколько копий Диспетчера задач

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как запустить несколько копий Диспетчера задач
Как запустить несколько копий Диспетчера задач

Если запустить стандартный Диспетчер задач Windows, а потом попробовать запустить его еще раз, то вторая копия не запустится, просто активируется первая запущенная копия. Я не знаю, зачем это было сделано, но какая-то причина наверняка есть. Элегантного решения с параметром в командной строке, как было в случае с regedit, у taskmgr нет. В подобных случаях я придерживаюсь принципа, что если нельзя, но очень хочется, то можно.

Давайте сперва узнаем, каким образом Диспетчер задач определяет, что как минимум одна его копия уже запущена. Есть несколько способов, с помощью которых это можно сделать. Перебором этих способов я выяснил, что сперва проверятся наличие мьютекса с корявым именем типа Local\TASKMGR.879e4d63-6c0e-4544-97f2-1244bd3f6de0, если он уже есть, то выполняется еще одна проверка:
  1. .text:0100DFAD                 lea     eax, [ebp+Buffer]
  2. .text:0100DFB3                 push    eax             ; lpWindowName
  3. .text:0100DFB4                 push    8002h           ; lpClassName
  4. .text:0100DFB9                 call    ds:FindWindowW
  5. .text:0100DFBF                 mov     [ebp+hWnd], eax
  6. .text:0100DFC5                 test    eax, eax
  7. .text:0100DFC7                 jz      short loc_100E02F
  8. .text:0100DFC9                 lea     ecx, [ebp+dwProcessId]
  9. .text:0100DFCF                 push    ecx             ; lpdwProcessId
  10. .text:0100DFD0                 push    eax             ; hWnd
  11. .text:0100DFD1                 call    ds:GetWindowThreadProcessId
  12. .text:0100DFD7                 push    [ebp+dwProcessId] ; dwProcessId
  13. .text:0100DFDD                 call    ds:AllowSetForegroundWindow
  14. .text:0100DFE3                 lea     eax, [ebp+dwResult]
  15. .text:0100DFE9                 push    eax             ; lpdwResult
  16. .text:0100DFEA                 push    2710h           ; uTimeout
  17. .text:0100DFEF                 push    2               ; fuFlags
  18. .text:0100DFF1                 push    0               ; lParam
  19. .text:0100DFF3                 push    0               ; wParam
  20. .text:0100DFF5                 push    40Bh            ; Msg
  21. .text:0100DFFA                 push    [ebp+hWnd]      ; hWnd
  22. .text:0100E000                 call    ds:SendMessageTimeoutW
  23. .text:0100E006                 test    eax, eax
Ищется определенное окно по имени и классу, если оно найдено, то по совокупности результатов двух проверок делается вывод, что это и есть ранее запущенный Диспетчер задач. Процессу-владельцу найденного окна передается право на перемещение своего окна на передний план, после чего ему отправляется сообщение на активацию. Если подходящего окна не найдено, то новая копия считает, что одноименный мьютекс был создан абсолютно другой программой и запускается в обычном порядке. Удалить чужой мьютекс вроде бы можно, но там очень нетривиальные и грязные методы, которые лучше не применять. А вот сделать так, чтобы не было найдено окно уже запущенной копии taskmgr, - это мы запросто. Напомню, поиск выполняется по имени и классу, изменить класс уже созданного окна невозможно, но можно поменять заголовок, например, дописать к нему в конец символ пробела. Визуально для пользователя ничего не изменится, но функция FindWindow такое окно уже не найдет.

Если планируется работать только в одной конкретной локали, то можно использовать поиск по строке "Диспетчер задач Windows" или какая там вам нужна, но лучше сделать универсальное решение. Давайте посмотрим, откуда в самом taskmgr берется строка заголовка для проверки. Обнаружится вот такой код:
  1. .text:0100DF62                 push    104h            ; cchBufferMax
  2. .text:0100DF67                 lea     eax, [ebp+Buffer]
  3. .text:0100DF6D                 push    eax             ; lpBuffer
  4. .text:0100DF6E                 push    2713h           ; uID
  5. .text:0100DF73                 push    hInstance       ; hInstance
  6. .text:0100DF79                 call    ds:LoadStringW
Из ресурсов файла taskmgr.exe загружается юникодная строка с индексом 2713h, это и есть текст заголовка окна Диспетчера задач для языка установленной системы Windows. Я проверил на нескольких системах, индекс строки в ресурсах везде одинаковый.

Для того, чтобы запустить вторую и следующие копии Диспетчера задач, надо выполнить следующие действия. Из ресурсов файла taskmgr.exe загружается строка заголовка окна. Ищутся все окна верхнего уровня с этим заголовком и классом 8002h, затем заголовок каждого из них меняется на эту же строку, но с дописанным в конце пробелом. После этого можно смело запускать новый процесс taskmgr.exe удобным для вас способом.
  1. szFileName du 'taskmgr.exe',0
  2. szSpace    du ' ',0
  3.  
  4. OldClassName rb 100h
  5. NewClassName rb 100h
  1.         ; Загрузить taskmgr.exe как библиотеку
  2.         invoke  LoadLibrary,szFileName
  3.         mov     ebx,eax
  4.         ; Найти строку заголовка окна
  5.         invoke  LoadString,ebx,2713h,OldClassName,100h
  6.         ; Выгрузить библиотеку
  7.         invoke  FreeLibrary,ebx
  8.  
  9.         ; Дописать пробел к заголовку окна
  10.         invoke  lstrcpy,NewClassName,OldClassName
  11.         invoke  lstrcat,NewClassName,szSpace
  12. @@:
  13.         ; Найти все окна Диспетчера задач
  14.         invoke  FindWindow,8002h,OldClassName
  15.         or      eax,eax
  16.         jz      @f
  17.         ; Установить новый текст в заголовок
  18.         invoke  SetWindowText,eax,NewClassName
  19.         jmp     @b
  20. @@:
  21.         ; Запустить еще одну копию Диспетчера задач
  22.         invoke  ShellExecute,HWND_DESKTOP,NULL,szFileName,NULL,NULL,SW_SHOW
Процедуру придется повторять каждый раз перед запуском каждой новой копии taskmgr, так как заголовок восстанавливается при любых действиях с окном Диспетчера задач, например, при переключении вкладок.

Если не хочется применять загрузчик, например, для своей домашней системы, то можете просто пропатчить файл taskmgr.exe, заменив условный переход JZ после FindWindow на безусловный JMP. Но это так себе решение, Windows плохо относится к модификации системных файлов, да и сам файл может быть перезаписан при каком-нибудь очередном обновлении.

В приложении пример программы с исходным текстом, которая запускает две и более копии Диспетчера задач.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

One.More.Task.Manager.Demo.zip (1,980 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 613 | Комментариев: 9

Комментарии

Отзывы посетителей сайта о статье
X-Wing Top Ace (09.10.2019 в 16:24):
ЦитатаА я вот привык пользоваться именно штатным виндовым таскманагером

Засомневался, отключил в ProcExp'е замещение таскманагера и нажал Ctrl+Alt+Del. Посмотрел на таскманагер повнимательнее, еще раз убедился, что не зря от него отвык давно, надежно и без малейшего желания выкнуть обратно, завершил его и снова включил его замещение Process Explorer'ом.

В панели настройки отображаемых колонок нет флажков для отображения полного имени экзюка и/или командной строки запущенного процесса. То есть от слова совсем. ;) И по-другому их в таскманагере тоже не увидеть. Если, скажем, Process Hacker с самого начала отображает эту инфу в хинтах при наведении крысы на интересующий процесс (я люблю, чтобы она была видна в окне для всех процессов, и именно поэтому намного чаще юзаю Process Explorer, но это уже дело вкуса - обе альтернативы хорошие, нефиг разводить холивар Process Explorer vs Process Hacker. И вообще, в Process Hacker'е просто была хитрее запрятана настройка колонок, теперь у меня полные имена видны и в его окне), то с таскманагером XP SP3 что я только не делал - полные пути к экзюкам процессов в нем не удалось увидеть нигде от слова никак. ;)

Правда, это под XPенью - в семерке и выше они все же добавлены. Только начиная с семерки, блин! ;)

Неудивительно, что технокрысы, пишущие автодрянных троянцев, записывают свои поделия, скажем, в каталог Fonts под именем svchost.exe, spoolsw.exe и т. д. - если на машину не поставить нормальную альтернативу таскманагеру, увидеть, что откуда запущено, невозможно! А значит, непонятно, который из этих процессов нужно прибить. Редактировать автозагрузку при активном троянце в системе - бесполезняк, троянец снова пропишется, если его кодил не полный ламер.
ManHunter (06.10.2019 в 23:24):
Жжошь, чертяка
voffka (06.10.2019 в 20:33):
Зачем, зачем - в полной версии лаунчера можно устроить "войну диспетчеров" под саундтрек из горца.
avp1965 (04.10.2019 в 18:57):
Мда-ааа...разбурчались, как "старпёры".
"Ежели человек ещё что-то думает - значит ещё Homo Sapiens" )))))
u-b0at (04.10.2019 в 16:40):
2ManHunter: Множество окон? Там же есть соответствующие вкладки. Или это на любителя - вместо того, чтобы листать вкладки в одном окне, можно перебирать открытые окна приложений. Или это нужно ооооочень продвинутым)) Экспертам. Ну, всё равно интересно. Спасибо!
ManHunter (04.10.2019 в 14:28):
А я вот привык пользоваться именно штатным виндовым таскманагером, хотя про альтернативы прекрасно знаю.
X-Wing Top Ace (04.10.2019 в 13:21):
Цитатазапустить несколько копий Диспетчера задач

А на фига? Process Explorer же есть (и не только он). В настройках ProcExp'а запуск только одной копии отключается на раз. А "Диспетчер задач"... Все равно что юзать "Проводник" при наличии TotalCmd, FAR'а, DblCmd и прочих нормальных двухпанельников.

И если с "Проводником" была своя рациональная причина (пока с моей подачи не нашелся плагин для "Тотальника", позволяющий обойтись без "Проводника"), то здесь... на фига?

Немного оффтопа. В свое время пришлось (развелось их на предприятии, а штатный сисадмин не мычал, не телился и даже сам разносил эту заразу на своих флэшках) врукопашную вычищать трояны, плодящиеся через автодрянь. Так вот, от "Диспетчера задач" толку не было. Когда врукопашную вычищаешь троянца, нужно видеть полные пути к файлам запущенных процессов. В "Диспетчере задач" это либо невозможно, либо к правому уху через левую пятку и с натягом совы на глобус впридачу.

На зараженной машине первым делом я с лазерного чудо-диска (чтоб на свою флэшку не подхватить) распаковывал в каталог на винте и запускал Process Explorer, чтобы легко увидеть, какой из одноименных процессов откуда был запущен. В ProcExp'е это просто - включаешь колонки пути и командной строки и все видишь (лично я так и оставляю их включенными в настройках ProcExp'а).
ManHunter (04.10.2019 в 10:42):
В одном окне список процессов, в другом окне загруженность сети. Ну и так, из любопытства, интересно же.
u-b0at (04.10.2019 в 10:12):
Простите моё невежество, имею вопрос - зачем?
Зачем нужно запускать более, чем одно приложение "Диспетчер задач"?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0048 сек.) / Память: 4.75 Mb
Наверх