Приховуємо процес в диспетчері завдань windows

Часто анонімність і скритність грають ключову роль в успішному виконанні будь-яких дій як в реальності, так і в віртуальності, зокрема в операційних системах. У даній статті мова піде про те, як стати анонімним в OS Windows. Вся інформація надана лише для мети ознайомлення.

Отже, ми спробуємо сховатися від очей користувача в диспетчері завдань Windows. Спосіб, за допомогою якого ми будемо цього домагатися є надзвичайно простим по відношенню до тих, які засновані на перехопленні ядерних (часто недокументованих) функцій і на створенні власних драйверів.

Суть методу: пошук вікна Диспетчера Завдань -> пошук в ньому дочірнього вікна (списку), що містить імена всіх процесів -> видалення зі списку нашого процесу.

Що використовувалося для дослідження:

Для написання коду будемо використовувати середу Delphi. Швидше, Delphi буде зручніше в нашому випадку, ніж C ++. Але це лише моє скромне думку.

Що ж, в першу чергу спробуємо з'ясувати, що з себе представляє список процесів і як він працює. З полувзора зрозуміло, що це звичайне вікно класу «SysListView32» (список), яке оновлюється з частотою 2 кадру в секунду (раз в 0.5 секунд). Дивимося ієрархію вікон:

Приховуємо процес в диспетчері завдань windows

Як бачимо, список процесів, справді, є звичайне вікно класу «SysListView32», яке є дочірнім по відношенню до вікна (вкладці) «Процеси», яке також є дочірнім по відношенню до головного вікна Диспетчера задач. Маємо лише подвійний рівень вкладеності. Крім того у списку є одне дочірнє вікно класу «SysHeader32», яке, як не важко здогадатися є заголовком (маркером полів) для списку процесів.
Так як перед нами звичайний список, то в нашому розпорядженні цілий набір макрокоманд для управління його вмістом. Їх різноманітність, на перший погляд, захоплює. Але багато хто з них працюють лише з батьківського процесу, тобто щоб їх нам використовувати, необхідно буде зімітувати, ніби вони виконуються в батьківському процесі. Але таким властивістю володіють не всі, зокрема, макрокоманда ListView_DeleteItem. яка видаляє елемент з вікна-списку (клас «SysListView32»).
Її ми і будемо використовувати в процесі нашого застосування. Ця функція другим параметром отримує індекс видаляється елемента.
Тепер нам треба якось з'ясувати, яким же індексом володіє елемент з лейблом приховуваного процесу в диспетчері завдань. Для цього нам потрібно якось витягнути зі списку процесів в диспетчері завдань всі елементи (лейбли з іменами процесів) і послідовно їх порівнювати з ім'ям того процесу, який ми бажаємо приховати.

Використовуючи макроси типу ListView_GetItemText наші дії були б приблизно наступними:

1) Виділення ділянки пам'яті в процесі диспетчера задач (VirtualAllocEx)
2) Здійснення дочірньому вікна-списку Диспетчера завдань повідомлення LVM_GETITEMTEXT (SendMessage)
3) Запис в виділену область пам'яті Диспетчера завдань інформації про елемент списку (WriteProcessMemory)
4) Читання з пам'яті диспетчера тієї інформації, яка нас цікавить про процес (ReadProcessMemory)

Використовуючи цей спосіб можна легко «вистрілити собі в ногу», вважаючи байти зміщення від початку різних використовуваних в коді структур. Так само цей спосіб буде досить важкий для тих, хто не особливо заглиблений у WinAPI, так що його ми відразу приберемо в сторону. В іншому, знайти реалізацію даного способу на просторах інтернету не складе особливих труднощів. Замість цього, я запропоную вам сформувати свій список процесів, і вже орієнтуючись в ньому, шукати заповітний індекс процесу в списку процесів диспетчера завдань.

У Microsoft вирішили особливо не париться з приводу тулзи, іменованої «Диспетчер Завдань», і використовували звичайні функції WinAPI для отримання всіх процесів в системі. Поверхнево дивимося taskmng.exe під отладчиком:

Приховуємо процес в диспетчері завдань windows

Бачимо використання WinAPI функції CreateToolHelp32SnapShot.
Всім відомо, що 'Це може бути корисним не тільки для отримання снепшот процесів, але і потоків процесу або модулів, наприклад. Але в даному випадку це малоймовірно. Навряд чи тут будуть використовувати щось в роді енумератора процесів (EnumProcesses).
Ми зупинилися на тому, що хочемо сформувати свій список процесів і шукати наш процес в ньому. Для цього скористаємося тією функцією, що виявили в отладчике. Якщо відкриємо диспетчер задач на вкладці «Процеси», то зауважимо, що всі процеси відсортовані за алфавітом для зручності пошуку. Отже, нам потрібно отримати список імен всіх процесів в системі і впорядкувати їх за зростанням в алфавітному порядку. Приступимо до написання коду в Delphi.

Для початку створимо демонстраційне віконне додаток з двома таймерами: перший буде переформовувати список з процесами з тією ж частотою, з якою це робить Диспетчер завдань Windows (раз в дві секунди); другий буде спрацьовувати 1000 разів в секунду і буде служити для відстеження оновлення списку процесів в диспетчері і, отже, появи нашого приховуваного процесу. Також додамо на форму кнопку.

Ось, власне, і весь код :)
Приховуємо, наприклад, в диспетчері завдань процес самого Диспетчера завдань:

Приховуємо процес в диспетчері завдань windows

І після натискання на кнопку «Приховати процес» процес зникає зі списку:

Приховуємо процес в диспетчері завдань windows

Всі сліди присутності в системі стерті, а сам він спокійно виконується в звичайному режимі десь в глибинах процесора :)

Що ж, думаю, такий спосіб заслуговує існувати, правда він вимагає невеликих доробок. Так, звичайно ж з його допомогою можна приховати процес від самої системи, але приховування в стандартній ТУЛЗ Windows, якою користується левова частка всіх користувачів, це теж непогано.
Сподіваюся, мені вдалося вас хоч трішечки зацікавити цією темою.

До скорого! І нехай буде з вами сила анонімності ...