![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как спрятать свой процесс [D4, WinME, Win2k, WinXP]
mate © (2002-08-29 13:43:00)Как спрятать свой процесс от показа в окне Ctrl-Alt-Del под Win2000?
Игорь Шевченко (2002-08-30 12:20:00) [21]paul_shmakov © (30.08.02 12:14)
Реально, методом Руссиновича - подменой обработчика в SystemServiceTable.
Вот только стоит ли овчинка выделки ? :-))
paul_shmakov (2002-08-30 12:14:00) [22]2 Aleksey Pavlov:
не все так просто. все верно, если перехватить все (!) вызовы NtQuerySystemInformation, то можно возвращать из нее все, что дуще угодно.
но! если все так просто, то почему же эту технику повсеместно не используют?
ответ прост: именно очуществить нормально перехват вызова этой функции во всех (!) процессах - очень сложно, да и не реально это грамотно сделать.
Игорь Шевченко (2002-08-30 12:07:00) [23]Aleksey Pavlov © (30.08.02 12:02)
> Такие вещи надо в FAQ складывать, уж слишком часто такие
> вопросы возникают
А может, не стоит ? :-)
Игорь Шевченко (2002-08-30 12:06:00) [24]Aleksey Pavlov © (30.08.02 11:51)
Спасибо, я примерно нечто аналогично и представлял. Но существуют программы, которые не используют даже NtQuerySystemInformation, а используют драйвер для доступа к списку процессов и деталям объекта _EPROCESS через собственный драйвер режима ядра, загружаемый по мере надобности.
Я к тому, что ПРОЦЕСС скрыть невозможно :-) Именно процесс, а не внедренные в область чужого процесса DLL. Хотя, и DLL"и можно найти :-)))
С уважением,
Aleksey Pavlov (2002-08-30 12:02:00) [25]>>paul_shmakov © (30.08.02 11:52):
Такие вещи надо в FAQ складывать, уж слишком часто такие вопросы возникают (и не только в этом форуме).
paul_shmakov (2002-08-30 11:52:00) [26]2 mate:
только-только ушла в архив нужная ветка :(
если очень нужно, то ищите в архиве форума "Система" ветку "TaskManager". там я подробно и развернуто описывал механизмы и принципы скрытия процессов.
p.s. все таки архив - это зло, я ссылку на эту ветку давал около 2-3 раз в неделю.. и тут на тебе, ушло в архив :(
Aleksey Pavlov (2002-08-30 11:52:00) [27]После вызова функции, если не произошло ошибки, первым элементом буфера окажется структура
SYSTEM_PROCESS_INFORMATION, описывающая отдельный процесс. Первым членом этой структуры будет смещение,
указывающее на следующий процесс или NULL, если это последний процесс в списке.
Теперь осталось только перехватить все вызовы этой функции и немного поменять смещения, чтобы вызывающая функцию
программа перепрыгнула через наш процесс. Наш это процесс или не наш определяем по идентификатору процесса
progProcessId, определяемому при запуске программы. Теперь, после перехвата функции NtQuerySystemInformation (все
детали перехвата очень подробно описаны в книге Рихтера или смотрите исходники), вместо оригинальной функции
сначала вызывается наша:
NTAPI Hook_NtQuerySystemInformation(
LONG type, // тип информации
PVOID SystemInformation, // указатель на буфер
LONG SystemInformationLength, // размер буфера в байтах
PLONG ReturnLength // указатель на 32-битное число
)
{
SYSTEM_PROCESS_INFORMATION *pinfo, *pinfo_last;
// вызываем оригинальную функцию
((PFNNtQuerySystemInformation)(PROC) g_NtQuerySystemInformation)
(type, SystemInformation, SystemInformationLength, ReturnLength);
// если получается информация о процессах
if(type == 5)
{
if(SystemInformationLength > 20000)
{
pinfo = (SYSTEM_PROCESS_INFORMATION*)SystemInformation;
for(;;)
{
// если идентификатор процесса равен идентификатору нашего процесса
if(pinfo->ProcessID == progProcessId)
{
// если наш процесс последний в списке
if(pinfo->NextOffest == 0)
{ // предпоследний процесс теперь стал последним, а наш исчез
pinfo_last->NextOffest = 0;
}
else
{ // или прыгаем через наш процесс
pinfo_last->NextOffest += pinfo->NextOffest;
}
}
if(pinfo->NextOffest == 0) break;
// предудущий процесс теперь равен текущему
pinfo_last = pinfo;
// переходим к следующему процессу
pinfo = (SYSTEM_PROCESS_INFORMATION*)((char *)pinfo + pinfo->NextOffest);
}
}
}
}
Теперь любая вызывающая программа при просмотре возвращенного буфера будет прыгать через наш процесс. Вот и все. В
исходниках находится программа, демонстрирующая все вышеизложенное. Сначала компилируем библиотеку, затем
программу.
Конечно для полного сокрытия программы в WINDOWS 2000 этого маловато, стоит также перехватить функции
просмотра загруженных библиотек, FindFirsFile, FindNextFile, подставляя вместо нужного файла "..".
Идея не моя и, честно говоря, лично я не пробовал воплотить такое в жизнь, потому как есть более изящные, с моей точки зрения, способы сокрытия процессов в системе ;)
Это было в своё время на войде описанно.
Так же на ныне несуществующем hackzone была прекрасная статья Tanaka о сокрытии процессов в системах семейства NT с работающими примерами.
Наверняка в INet-е вы сможете её найти.
Aleksey Pavlov (2002-08-30 11:51:00) [28]>> Игорь Шевченко © (30.08.02 09:44):
Перехватывать NtQuerySystemInformation и не требуется :)
Скрыть что-то от NtQuerySystemInformation тоже нельзя.
НО! Можно обмануть NtQuerySystemInformation!
NTAPI Hook_NtQuerySystemInformation(
LONG type, // тип требуемой информации
PVOID SystemInformation, // указатель на буфер, в который вернется информация
LONG SystemInformationLength, // размер буфера в байтах
PLONG ReturnLength // сколько байт было возвращено или требуется
);
Первый параметр отвечает за тип требуемой информации. Нас интересует только информация о
процессах (type = 5). Далее работаем со следующими структурами:
typedef struct {
FILETIME ProcessorTime;
ULONG unk2, unk3;
FILETIME CreateTime;
ULONG unk6;
ULONG StartAddress;
ULONG ProcessID;
ULONG ThreadID;
ULONG CurrentPriority;
ULONG BasePriority;
ULONG ContextSwitchesPerSec;
ULONG ThreadState;
ULONG ThreadWaitReason;
ULONG unk15;
} SYSTEM_THREAD_INFORMATION;
typedef struct {
ULONG NextOffest; // следующий процесс
ULONG ThreadCount;
ULONG unk2, unk3, unk4, unk5, unk6, unk7;
FILETIME CreateTime;
FILETIME UserTime;
FILETIME KernelTime;
ULONG unk14;
WCHAR *pModuleName; /* unicode */
ULONG BasePriority;
ULONG ProcessID;
ULONG InheritedFromUniqueProcessID;
ULONG HandleCount;
ULONG unk20, unk21;
ULONG PeekVirtualSize;
ULONG VirtualSize;
ULONG PageFaultCountPerSec;
ULONG PeakWorkingSetSize;
ULONG WorkingSetSize;
ULONG PeekPagedPoolUsage;
ULONG PagedPoolUsage;
ULONG PeekNonPagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG unk31; /* PagefileUsage ? */
ULONG PeakPagefileUsage;
ULONG unk33; /* PrivateBytes ? */
SYSTEM_THREAD_INFORMATION ThreadInfos[1]; // потоки данного процесса
} SYSTEM_PROCESS_INFORMATION;
Игорь Шевченко (2002-08-30 09:44:00) [29]Almaz © (30.08.02 00:57)
Собираешься перехватывать NtQuerySystemInformation ? Удачи тебе, и побольше :-)
Almaz (2002-08-30 00:57:00) [30]Самый простой способ спрятаться - это внедить свой код в чужой процесс. Под Win2000 это много проще Win9x.
Однако если есть желание поизвращаться - то можно и через перехват API функций - начинающий програмерправ - где-то в просторах сети есть пример на эту тему (только не частично а полностью на СИ :)
Удачи.
Игорь Шевченко (2002-08-29 17:09:00) [31]max2057 © (29.08.02 17:07)
Какие не показываются ? :-)
max2057 (2002-08-29 17:07:00) [32]в Task Manager сервисы если и показываются то не все
Игорь Шевченко (2002-08-29 16:58:00) [33]начинающий програмер © (29.08.02 14:29)
Не надо таких слов говорить, ибо неправда.
chainik_ukr (29.08.02 16:00)
На самом деле все просто необходимо заделать свою прогу под service (службу)
С каких пор сервисы перестали в Task Manager показываться ?
chainik_ukr (2002-08-29 16:00:00) [34]На самом деле все просто необходимо заделать свою прогу под service (службу)
Или можно реализовать приложение в качестве dll , и загрузить как exe модуль с помощью user32.dll
начинающий програмер (2002-08-29 14:29:00) [35]
> Забудь.
Это вполне реально даже не заделывая под драйвер. Говорят где-то есть код, частично на СИ.
Song (2002-08-29 14:12:00) [36]Забудь.
начинающий програмер (2002-08-29 14:08:00) [37]Говорят под драйвет заделать надо...