Как запустить несколько копий Диспетчера задач
Как запустить несколько копий Диспетчера задач
Если запустить стандартный Диспетчер задач Windows, а потом попробовать запустить его еще раз, то вторая копия не запустится, просто активируется первая запущенная копия. Я не знаю, зачем это было сделано, но какая-то причина наверняка есть. Элегантного решения с параметром в командной строке, как было в случае с regedit, у taskmgr нет. В подобных случаях я придерживаюсь принципа, что если нельзя, но очень хочется, то можно.
Давайте сперва узнаем, каким образом Диспетчер задач определяет, что как минимум одна его копия уже запущена. Есть несколько способов, с помощью которых это можно сделать. Перебором этих способов я выяснил, что сперва проверятся наличие мьютекса с корявым именем типа Local\TASKMGR.879e4d63-6c0e-4544-97f2-1244bd3f6de0, если он уже есть, то выполняется еще одна проверка:
Code (Assembler) : Убрать нумерацию
- .text:0100DFAD lea eax, [ebp+Buffer]
- .text:0100DFB3 push eax ; lpWindowName
- .text:0100DFB4 push 8002h ; lpClassName
- .text:0100DFB9 call ds:FindWindowW
- .text:0100DFBF mov [ebp+hWnd], eax
- .text:0100DFC5 test eax, eax
- .text:0100DFC7 jz short loc_100E02F
- .text:0100DFC9 lea ecx, [ebp+dwProcessId]
- .text:0100DFCF push ecx ; lpdwProcessId
- .text:0100DFD0 push eax ; hWnd
- .text:0100DFD1 call ds:GetWindowThreadProcessId
- .text:0100DFD7 push [ebp+dwProcessId] ; dwProcessId
- .text:0100DFDD call ds:AllowSetForegroundWindow
- .text:0100DFE3 lea eax, [ebp+dwResult]
- .text:0100DFE9 push eax ; lpdwResult
- .text:0100DFEA push 2710h ; uTimeout
- .text:0100DFEF push 2 ; fuFlags
- .text:0100DFF1 push 0 ; lParam
- .text:0100DFF3 push 0 ; wParam
- .text:0100DFF5 push 40Bh ; Msg
- .text:0100DFFA push [ebp+hWnd] ; hWnd
- .text:0100E000 call ds:SendMessageTimeoutW
- .text:0100E006 test eax, eax
Если планируется работать только в одной конкретной локали, то можно использовать поиск по строке "Диспетчер задач Windows" или какая там вам нужна, но лучше сделать универсальное решение. Давайте посмотрим, откуда в самом taskmgr берется строка заголовка для проверки. Обнаружится вот такой код:
Code (Assembler) : Убрать нумерацию
- .text:0100DF62 push 104h ; cchBufferMax
- .text:0100DF67 lea eax, [ebp+Buffer]
- .text:0100DF6D push eax ; lpBuffer
- .text:0100DF6E push 2713h ; uID
- .text:0100DF73 push hInstance ; hInstance
- .text:0100DF79 call ds:LoadStringW
Для того, чтобы запустить вторую и следующие копии Диспетчера задач, надо выполнить следующие действия. Из ресурсов файла taskmgr.exe загружается строка заголовка окна. Ищутся все окна верхнего уровня с этим заголовком и классом 8002h, затем заголовок каждого из них меняется на эту же строку, но с дописанным в конце пробелом. После этого можно смело запускать новый процесс taskmgr.exe удобным для вас способом.
Code (Assembler) : Убрать нумерацию
- szFileName du 'taskmgr.exe',0
- szSpace du ' ',0
- OldClassName rb 100h
- NewClassName rb 100h
Code (Assembler) : Убрать нумерацию
- ; Загрузить taskmgr.exe как библиотеку
- invoke LoadLibrary,szFileName
- mov ebx,eax
- ; Найти строку заголовка окна
- invoke LoadString,ebx,2713h,OldClassName,100h
- ; Выгрузить библиотеку
- invoke FreeLibrary,ebx
- ; Дописать пробел к заголовку окна
- invoke lstrcpy,NewClassName,OldClassName
- invoke lstrcat,NewClassName,szSpace
- @@:
- ; Найти все окна Диспетчера задач
- invoke FindWindow,8002h,OldClassName
- or eax,eax
- jz @f
- ; Установить новый текст в заголовок
- invoke SetWindowText,eax,NewClassName
- jmp @b
- @@:
- ; Запустить еще одну копию Диспетчера задач
- invoke ShellExecute,HWND_DESKTOP,NULL,szFileName,NULL,NULL,SW_SHOW
Если не хочется применять загрузчик, например, для своей домашней системы, то можете просто пропатчить файл taskmgr.exe, заменив условный переход JZ после FindWindow на безусловный JMP. Но это так себе решение, Windows плохо относится к модификации системных файлов, да и сам файл может быть перезаписан при каком-нибудь очередном обновлении.
В приложении пример программы с исходным текстом, которая запускает две и более копии Диспетчера задач.
Просмотров: 3472 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
чебурек
(08.08.2023 в 15:52):
смог нагрузить память полностью и открыл несколько сотен диспедчеров задач
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" )))))
"Ежели человек ещё что-то думает - значит ещё 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):
Простите моё невежество, имею вопрос - зачем?
Зачем нужно запускать более, чем одно приложение "Диспетчер задач"?
Зачем нужно запускать более, чем одно приложение "Диспетчер задач"?
Добавить комментарий
Заполните форму для добавления комментария