Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Создать неубиваемый процесс
Посл.ответ Сообщение

Ранг: 7.5 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 07 ноября 2016 23:47
· Личное сообщение · #1

Хочу написать неубиваемый из диспетчера задач процесс. Придумал топорную идею: запускать два процесса, которые следят друг за другом. Первый процесс выполняет некоторую работу, а второй ждет его завершения. Если первый процесс завершен, второй запускает новый процесс и начинает работу с начала. Я реализовал это так:

Code:
  1. #include <windows.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. #pragma comment(lib, "user32.lib")
  6.  
  7. void RunNewProcess(char *szExePath)
  8. {
  9.          PROCESS_INFORMATION pi;
  10.          STARTUPINFO si;
  11.          HANDLE hCurrentProcess = NULL;
  12.          char szCmdLine[MAX_PATH];
  13.  
  14.          DuplicateHandle(GetCurrentProcess(),
  15.                  GetCurrentProcess(),
  16.                  GetCurrentProcess(),
  17.                  &hCurrentProcess,
  18.                  0,
  19.                  TRUE,
  20.                  DUPLICATE_SAME_ACCESS);
  21.  
  22.          ZeroMemory(&si, sizeof(STARTUPINFO));
  23.          si.cb = sizeof(STARTUPINFO);
  24.          wsprintf(szCmdLine, "%s %d", szExePath, (int)hCurrentProcess);
  25.          CreateProcess(NULL,
  26.                  szCmdLine,
  27.                  NULL,
  28.                  NULL,
  29.                  TRUE,
  30.                  CREATE_NEW_CONSOLE,
  31.                  NULL,
  32.                  NULL,
  33.                  &si,
  34.                  &pi);
  35. }
  36.  
  37. void thread(void)
  38. {
  39.          int i = 0;
  40.          while (1)
  41.          {
  42.                  ++i;
  43.                  printf("%d ", i);
  44.                  Sleep(500);
  45.          }
  46. }
  47.  
  48. int main(int argc, char *argv[])
  49. {
  50.          HANDLE hParentProcess = NULL;
  51.          HANDLE hThread = NULL;
  52.          char szExePath[MAX_PATH];
  53.  
  54.          GetModuleFileName(NULL, szExePath, MAX_PATH);
  55.  
  56.          if (argv[1] == NULL)      // First run
  57.          {
  58.                  //RunNewProcess(szExePath);
  59.          }
  60.          else hParentProcess = (HANDLE) atoi(argv[1]);
  61.  
  62.          WaitForSingleObject(hParentProcess, INFINITE);
  63.          RunNewProcess(szExePath);
  64.  
  65.          hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, NULL);
  66.          WaitForSingleObject(hThread, INFINITE);
  67. }


Но здесь только дочерний процесс следит за родительским. Если дочерний процесс вырубить, родительский не запустит новый процесс. Как это реализовать? Можно было в родительском процессе запустить новый тред, который вызывает WaitForSingleObject для хэндла дочернего процесса, но как получить этот хэндл, если функция CreateProcess не возвращает его?

Какие подводные камни в таком способе "неубиваемости", если мое приложение будет иметь гуй и выполнять некоторую работу в системе? Или их нет?

Как еще можно сделать процесс неубиваемым? Кроме маскировки под winlogon и использования хуков. Можно ли защититься от вырубания дерева процессов?

| Сообщение посчитали полезным: Det


Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 08 ноября 2016 00:12
· Личное сообщение · #2

ZeroMemory

CreateProcess() возвращает хэндлы процесса и потока, так же хэндл процесса или иного обьекта можно получиться референсом, открыть процесс/поток/файл етц.

Обычно в ядре завершение блокируется, ставятся хуки на сервисные таблицы.

-----
vx


| Сообщение посчитали полезным: ZeroMemory

Ранг: 7.5 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 08 ноября 2016 00:20
· Личное сообщение · #3

Ах, да, они же возвращаются в структуре, если правильно помню.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 ноября 2016 00:51
· Личное сообщение · #4

это вам на форум программистов

-----
[nice coder and reverser]



 eXeL@B —› Программирование —› Создать неубиваемый процесс
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати