none
Перехват запуска приложения RRS feed

  • Вопрос

  • Всем добрый вечер. Появилась задача перехватить запуск любого приложения и принять решения, должен ли он быть запущен или нет. Кто подскажет, как это можно реализовать на качественном уровне, чтобы никакой процесс не запустился не замеченным? Буду рад любой информации. Заранее спасибо.

    19 апреля 2011 г. 16:08

Ответы

  • Попробуй так. Конечно не хук, но с задачей вполне справляется. Ни один процесс еще не проскальзывал =). Задержку таймера нахожу оптимальной в 1 сек.

        public RuningProcess[] PreviusProsesses;
        public RuningProcess[] CurentProcesses;
    
        private RuningProcess[] GetRuningProcess()
        {
          Process[] MyProcesses = Process.GetProcesses();
          RuningProcess[] LaunchProcesses = new RuningProcess[MyProcesses.Length];
          for (int i = 0; i < MyProcesses.Length; i++)
          {
            LaunchProcesses[i] = new RuningProcess();
            try
            {
              LaunchProcesses[i].Name = MyProcesses[i].ProcessName;
              LaunchProcesses[i].PID = MyProcesses[i].Id;
              LaunchProcesses[i].Started = MyProcesses[i].StartTime;
            }
            catch { }
          }
          return LaunchProcesses;
        }
    
        private RuningProcess[] GetNewProcesses(RuningProcess[] Old, RuningProcess[] New)
        {
          foreach (RuningProcess p in New)
          {
            bool exists = false;
            foreach (RuningProcess p1 in Old)
            {
              if (p.PID == p1.PID) exists = true;
            }
            if (!exists) LogProcessesWrite("Open", p.Name, p.PID.ToString(), p.Started.ToLongTimeString());
          }
          return null;
        }
    
        private RuningProcess[] GetClosedProcesses(RuningProcess[] Old, RuningProcess[] New)
        {
          foreach (RuningProcess p in Old)
          {
            bool exists = false;
            foreach (RuningProcess p1 in New)
            {
              if (p.PID == p1.PID) exists = true;
            }
            if (!exists) LogProcessesWrite("Close", p.Name, p.PID.ToString(), p.Started.ToLongTimeString());
          }
          return null;
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
          CurentProcesses = GetRuningProcess();
          if (CurentProcesses != PreviusProsesses)
          {
            GetNewProcesses(PreviusProsesses, CurentProcesses);
            GetClosedProcesses(PreviusProsesses, CurentProcesses);
          }
          PreviusProsesses = CurentProcesses;
        }
    
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 5:02
    • Снята пометка об ответе vikaz 23 апреля 2011 г. 16:56
    • Помечено в качестве ответа vikaz 23 апреля 2011 г. 16:56
    21 апреля 2011 г. 7:11

Все ответы

  • Хм....А разве средствами администрирования этого никак не добиться?
    [My blog] [My E-mail]
    19 апреля 2011 г. 16:11
  • Это не везде возможно. Да и вопрос очень интересен, хочется расковырять. :)

     


    Меня интересует какой принцип заложен в антивирусном программном обеспечении? Вроде как какой-то драйвер ядра пишется. Действительно ли это так?
    19 апреля 2011 г. 16:21
  • Чтобы ответить на этот вопрос, думаю стоит хорошенько почитать теорию операционных систем, а именно про организацию и обслуживание процессов. А так же какой-нибудь справочник по WinAPI.
    [My blog] [My E-mail]
    19 апреля 2011 г. 18:36
  • Попробуй так. Конечно не хук, но с задачей вполне справляется. Ни один процесс еще не проскальзывал =). Задержку таймера нахожу оптимальной в 1 сек.

        public RuningProcess[] PreviusProsesses;
        public RuningProcess[] CurentProcesses;
    
        private RuningProcess[] GetRuningProcess()
        {
          Process[] MyProcesses = Process.GetProcesses();
          RuningProcess[] LaunchProcesses = new RuningProcess[MyProcesses.Length];
          for (int i = 0; i < MyProcesses.Length; i++)
          {
            LaunchProcesses[i] = new RuningProcess();
            try
            {
              LaunchProcesses[i].Name = MyProcesses[i].ProcessName;
              LaunchProcesses[i].PID = MyProcesses[i].Id;
              LaunchProcesses[i].Started = MyProcesses[i].StartTime;
            }
            catch { }
          }
          return LaunchProcesses;
        }
    
        private RuningProcess[] GetNewProcesses(RuningProcess[] Old, RuningProcess[] New)
        {
          foreach (RuningProcess p in New)
          {
            bool exists = false;
            foreach (RuningProcess p1 in Old)
            {
              if (p.PID == p1.PID) exists = true;
            }
            if (!exists) LogProcessesWrite("Open", p.Name, p.PID.ToString(), p.Started.ToLongTimeString());
          }
          return null;
        }
    
        private RuningProcess[] GetClosedProcesses(RuningProcess[] Old, RuningProcess[] New)
        {
          foreach (RuningProcess p in Old)
          {
            bool exists = false;
            foreach (RuningProcess p1 in New)
            {
              if (p.PID == p1.PID) exists = true;
            }
            if (!exists) LogProcessesWrite("Close", p.Name, p.PID.ToString(), p.Started.ToLongTimeString());
          }
          return null;
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
          CurentProcesses = GetRuningProcess();
          if (CurentProcesses != PreviusProsesses)
          {
            GetNewProcesses(PreviusProsesses, CurentProcesses);
            GetClosedProcesses(PreviusProsesses, CurentProcesses);
          }
          PreviusProsesses = CurentProcesses;
        }
    
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 5:02
    • Снята пометка об ответе vikaz 23 апреля 2011 г. 16:56
    • Помечено в качестве ответа vikaz 23 апреля 2011 г. 16:56
    21 апреля 2011 г. 7:11