Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];

Вниз

Скрыть программу от Ctrl-Alt-Del в XP   Найти похожие ветки 

 
Burmistroff   (2003-01-10 16:33) [40]

> Игорь Шевченко
"Кстати, а моя программка из кладовки "QuerySystemInformation" этот скрытый процесс увидит"

Вестимо да. Ведь ваша прога и использует NtQuery...

> Song
"Но как я уже сказал Avenger"у, только со стандартным менеджером процессов. "

Не только со стандартным. Любая прога, использующая EnumProcesses из PSAPI вместо NtQuery - не увидит


 
Игорь Шевченко   (2003-01-10 17:05) [41]

Burmistroff (10.01.03 16:33)

Тогда это плохое скрытие. (Игорь Шевченко © (08.01.03 16:10))

Да и непонятно, зачем вообще скрывать :-)))


 
DJ_Sedoy   (2003-01-10 19:44) [42]

Ну сокрытие - это один из методов против "снятия" процесса, т.к. даже если в событии OnCloseQuery устанавливать CanClose:=false, то после 2-3 попыток программа "выполняет недопустимую операцию" и преспокойно закрывается


 
Burmistroff   (2003-01-10 23:10) [43]

WinNT если надо - то любую работающую программу закроет, как бы она не сопротивлялась. Однако, если она зависнет (у меня такое бывает с Opera 6 и TotalCommander 5.5), то порой даже NT разводит руками, и остается единственный способ снятия задачи - перезагрузка (logoff/logon не помогает).


 
Ice   (2003-01-11 01:34) [44]

Переключение контекста потока. В данном случае резидентный код исполняется в контексте какого-либо уже запущенного потока. Между прочим, сама система широко использует потоки пользователей для собственных нужд. Как пишет Хелен Кастер в книге "Основы Windows NT и NTFS" система "похищает" поток и использует его для обработки прерываний, вызова DPC и системных APC функций. То есть немалая часть операционной системы представляет собой программы-невидимки.
При использовании данного метода не создаются ни новый процесс, ни новый поток. Загрузка библиотеки в другие процессы тоже не требуется. Таким образом, единственным косвенным признаком существования постороннего резидентного кода является разовое увеличение используемой памяти. Но память - наиболее активно расходуемый ресурс. Практически все программы постоянно выделяют и освобождают память и определить, какое количество занятых килобайт является нормой для того или иного процесса, очень затруднительно.
Разумеется, есть и недостатки. Во-первых, резидентный код может выполняться, только когда система передает управление потоку-носителю. Но возможна ситуация, что поток имеет весьма низкий приоритет, и из-за вытесняющей многозадачности редко будет получать управление. Более того, поток может перейти в состояние ожидания, и оставаться в нем неопределенно долго. Если же поток будет завершен, то завершится и резидентный код. Суммируя, работа резидентного кода в решающей степени зависит от потока-носителя.


 
Игорь Шевченко   (2003-01-11 15:21) [45]


> система "похищает" поток и использует его для обработки
> прерываний, вызова DPC и системных APC функций. То есть
> немалая часть операционной системы представляет собой программы-невидимки


С одним маленьким замечанием: для обработки DPC используются потоки процесса SYSTEM (WorkerThreads).

А так, любой вызов системного сервиса выполняется в основном, в контексте того потока, который ее вызвал, только в режиме ядра.

О программе Avenger [NhT]: Как и следовало ожидать, и Process Explorer и моя программа его прекрасно видят. Так что скрыть можно разве что у неопытных пользователей. Хотя неопытные и Task Manager вряд ли лишний раз полезут. О методах и коде сказать ничего не могу, так как имею только запакованные исходники. Видимо, страшно секретная программа, раз даже EXEшник запакован :-)


 
gsu   (2003-01-11 15:31) [46]

Вот как дети маленькие, раз нельзя - так нельзя. Вы еще БГ пожалуйтесь, скажите, ая-яй какя у вас прога не хорошая (-:|~


 
Игорь Шевченко   (2003-01-11 15:42) [47]

Ошибочка: вместо только запакованные исходники следует читать запакованные EXEшники


 
Ice   (2003-01-11 19:35) [48]


>Вот как дети маленькие, раз нельзя - так нельзя.

Если нельзя, но очень хочется, значит можно. :)
Так возможно ли это: быть резидентом и не "светиться" в Task Manager? Отвечаю, ЭТО ВОЗМОЖНО!
Вы действительно не можете спрятать процесс от NtQuerySystemInformation (по крайней мере, я не знаю, как это можно сделать). Но кто сказал, что резидентами становятся только процессы! Ведь кто такой резидент? Это всего навсего кусочек памяти, который периодически получает управление. Поэтому помимо процесса резидентом может быть драйвер, поток (thread), волокно (fiber), APC и DPC процедуры, функции обработки исключений и прерываний.
(Кстати, если говорить совсем строго, то исполняется не процесс, а его потоки, поэтому процесс резидентом не является).

Итак, на сегодняшний день, я знаю следующие способы прятать резидентный код:
1. Загружать драйвер. Это настолько примитивно, что обсуждать этот способ не будем. Кроме всего прочего, NtQuerySystemInformation предоставляет информацию и о драйверах, хотя Task Manager этого не делает. Ну и потом, ведь есть SoftIce!
2. Создавать поток в заданном процессе. Этот способ подробно описан у Джеффри Рихтера в книге "Windows для профессионалов".
Этот способ намного более интересен и оригинален. Но на сегодняшний день это уже классика, и удивить этим невозможно. Резидентный код обнаружить в этом случае довольно тяжело. В Task Manager у одного из процессов появляется дополнительный поток, но кто из нас на память скажет, сколько должно быть потоков у Explorer.exe? Помимо Task Manager можно посмотреть список загруженных библиотек, но опять же, кто из нас на память скажет, какие библиотеки должны быть загружены в Explorer.exe. Наконец, есть возможность посмотреть время создания потоков. А вот тут разница будет. Одним словом, будьте внимательны к потокам в резидентных процессах.
3. Всевозможные Rootkit. Это загрузка драйвера, который перехватывает обращения к NtQuerySystemInformation и подставляет свои данные.
Недостаток все тот же - необходимы права администратора! Если же у вас на машине все-таки запустили драйвер, то дела ваши плохи.
4. Hooking. Основан на функции SetWindowsHookEx. Насколько я понимаю, на нем основаны "невидимые" закладки под клавиатуру, мышь и всего того, на что сажается hook. При таком способе новый поток не создается. Но библиотека, откуда вызывается функция обработки ловушки, грузится во ВСЕ существующие и вновь создаваемые процессы. Поэтому, запустите свой процесс, и если в нем появилась библиотека, которую вы не предусмотрели, то самое время перегрузить машину.

5. Переключение контекста потока.
Вкратце, алгоритм предлагаемого метода состоит в следующем:
1. Необходимо найти подходящий процесс, то есть процесс, имеющий постоянно работающие потоки с приоритетом нормальный или выше (>8). Во избежание трудностей с правами, имеет смысл использовать пользовательский процесс. Для нахождения такого процесса естественно использовать все ту же функцию NtQuerySystemInformation.
2. После того, как нужный процесс найден, и определены идентификаторы его потоков, загрузим в пространство данного процесса сам исполняемый резидентный код. Чтобы не возиться с ассемблером, я это делаю в виде библиотеки, но это вопрос предпочтений. Процедура загрузки библиотеки в заданный процесс подробно описана у Джеффри Рихтера.
3. Приостанавливаем один из потоков процесса, сохраняем его стек и текущий контекст, создаем новый стек, изменяем контекст потока так, чтобы указатель на текущую команду (регистр Eip) указывал на наш резидентный код, переходим на новый стек, "пробуждаем" поток. Теперь, при получении потоком процессорного времени будет выполняться наш резидентный код. Естественно, это не все, так как в нашу задачу не входит нарушить нормальное исполнение процесса (что мы, хакеры что ли?).
4. После того, как резидентный код отработал, необходимо перейти на старый стек и восстановить старый контекст. Теперь поток должен работать в нормальном режиме.
Вот, собственно, и все.Разумеется, некоторые непринципиальные детали были опущены. По сути, во многом то же самое выполняет сама ОС при исполнении DPC и APC процедур.

Что предлагаемый способ НЕ ДЕЛАЕТ:
1. Не скрывает процесс.
2. Не скрывает поток.
3. Не запускает драйвер.
Процесс не создается, поэтому скрывать его отсутствие не нужно.
Поток создается, но, быстро отработав, нормально завершает работу, поэтому скрывать его тоже не нужно. (Кстати, может кто-нибудь, действительно, умеет скрывать поток без драйвера? Было бы очень интересно!)
Драйвер вообще не нужен. Скрывать что-либо с помощью драйвера, это хорошая идея, более того, уже реализованная. Проблема только в запуске драйвера.
Еще один вопрос ко всем. Как все-таки обнаружить подобного резидента? Или, как детектировать вызов APC и DPC процедур операционной системой?


 
Burmistroff   (2003-01-11 20:56) [49]

>Ice.
Маленькая поправка - hooking - грузится НЕ во ВСЕ процессы.
А переключение контекста - довольно удобно, и в случае с NT - просто. Только вот как получить хэндл потока в 9x? Для этого есть конечно же нашли алгоритм, но официальной (и даже "недокументированной") процедуры я пока не встречал.


И еще, кто нибудь знает, можно ли восстанавливать флаги (то что правее регистров в окне CPU в Delphi) собственного thread"a какой-либо командой ASM"a (вроде push/pop для регистров)?


 
Burmistroff   (2003-01-11 21:07) [50]

>Ice
И еще, я не понял, почему переключение контекста создается поток???

А как обнаружить.... солжный вопрос. Гораздо проще предотвратить это (чем я собственно и занимаюсь).


 
K_O_T   (2003-01-12 13:11) [51]

2 Avenger
Я надеялся увидить исходники.
С++`ные исходники у меня есть. Интересно было бы на Delphi их увидить? До недавнего времени да С++ мне было жутко смотреть. Теперь я его подучил. Если нужно будет преведу :)


 
R4D][   (2003-01-12 13:39) [52]

2Burmistroff:
Боюсь показаться наивным, но если ты имеешь в виду ThreadID, то функция есть - GetWindowThreadProcessId, а так я уже почти закончил делать троян, основанный на hook"ах, как наткнулся на эту конференцию...я вижу, что идея не нова, поэтому и мой троян тоже, наверное, банален. Я хотел бы спросить, я думал, что политика безопастности в XP не позволит кому угодно ставить hook"и, так вот, так ли это?


 
Burmistroff   (2003-01-12 19:01) [53]

> R4D][
А толку то от ThreadID??? Для всех важных операций нужен хэндл.

" я думал, что политика безопастности в XP не позволит кому угодно ставить hook"и, так вот, так ли это?"
Да, это так. Можно поставить хук только на процессы с тем же уровнем привилегий, что и у тебя. Я поэтому всякие трояны "тестирую" (да и в вообще в инете сижу) только из под user"ского профиля.


 
R4D][   (2003-01-12 19:11) [54]

2Burmistroff:
Спасибо за ответ на вопрос;
Не мог ты объяснить мне, не ведующему, что енто за хэндл потока, и как он от индификатора потока отличается.
Заранее благодарен.


 
Burmistroff   (2003-01-14 19:53) [55]

{Suspend/Resume}Thread
{Get/Set}ThreadContext
В качестве параметра требуют хэндл (handle, дескриптор), а не идентификатор (ID)


 
}{enon   (2003-01-15 18:17) [56]

А почему, усли нужно просто не дать закрыть прогу, нельзя сделать так: при закрытии проги (OnClose) запускаешь её копию и передаёшь ей параметры (правдо последнее делается каряво)?


 
AlexandrRya   (2003-01-15 22:53) [57]

Anatoly Podgoretsky © (31.12.02 13:03)> Круто сказано :)

Lex31337 (04.01.03 16:42) > 100% перехват не возможен - я могу написать аналог виндузного загрузчика и грузить библиотеку ей - перхват LoadLibrary не поможет - не удасться отследить вызов NtQuerySystemInformation. Кроме того NtQuerySystemInformation (imho) ббазируется на ZwQuerySystemInformation - ловит лучше ее.

Так что лучше читать Рихтера и слушать совета Ice.


 
Игорь Шевченко   (2003-01-16 09:58) [58]


> Кроме того NtQuerySystemInformation (imho) ббазируется на
> ZwQuerySystemInformation


Неверное IMHO. Это два имени одной и той же функции.


 
Burmistroff   (2003-01-16 18:36) [59]

> Неверное IMHO. Это два имени одной и той же функции.

Согласен.


 
Snap   (2003-03-09 14:28) [60]

Удалено модератором
Примечание: Задай СВОЙ вопрос в отдельной своей ветке


 
Danillo   (2003-03-09 16:19) [61]

Для удаления программы из диалога "Завершение работы программы", вызываемого по Ctrl+Alt+Del, нужно используют функцию RegisterServiceProcess. В Windows NT этой функции не существует. Поэтому, чтобы не происходило ошибки, нужно проверять версию Windows. Если это не Windows NT, то нужно динамически загрузить kernel32.dll.


procedure TForm1.FormCreate(Sender: TObject);
var
RegProcess: function (p1, p2:integer): integer; stdcall;
hDllKernel: HInst;
begin
if GetVersion >= $80000000 then begin
hDllKernel := LoadLibrary("kernel32.dll");
RegProcess := GetProcAddress(hDllKernel, "RegisterServiceProcess");
RegProcess(0, 1);
end;
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or
WS_EX_TOOLWINDOW);
end;

Точно не знаю но может получиться и на XP!



Страницы: 1 2 вся ветка

Форум: "Система";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.011 c
3-91160
Senator
2003-04-09 12:46
2003.04.28
запрос


14-91476
Agent[007]
2003-04-08 13:34
2003.04.28
HTML


6-91423
Novichek
2003-03-05 16:16
2003.04.28
Как скачать с интернета WEB-страницу


3-91178
AleksandrKu
2003-04-09 14:36
2003.04.28
Помогите со StoredProc


1-91322
mihei
2003-04-15 14:56
2003.04.28
Проблема с DBGridEh





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский