Форум: "WinAPI";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
ВнизНевидимый процесс. Найти похожие ветки
← →
Serd_hhc (2002-06-02 16:24) [0]Я знаю о RegisterServiceProcess в W9x, а вот под NT такое слышал (и не только на этом сайте), что можно сделать так, чтобы система вообще не знала о твоём процессе. Вроде реализация происходит с помощью хуков. Система определяет процесс при помощи Process32First, а мы в своё время, должны ей "сказать", что то, что она сейчас нашла, это не процесс, а фиг знает что...
Итак вопрос (на заднем плане слышен удар гонга :) :
Как это реализовать на делфи.
(Слышется звук "Пиииии...":).
← →
paul_shmakov (2002-06-03 01:34) [1]вот здесь я подробно описывал различные способы реализации:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1014992279&n=2
← →
Serd_hhc (2002-06-03 04:00) [2]Я читал твоё подробное описание, но ты лишь в скользь упомянул на счёт Process32First. Если ты можешб сказать больше, так скажи.
← →
VuDZ (2002-06-03 13:22) [3]поищи на void.ru - там было всё нормально описано
← →
paul_shmakov (2002-06-04 13:56) [4]2 Serd_hhc:
ok
сразу говорю - Process32First к nt отношения не имеет, т.к. это одна из функций Toolhelp API. а этот api поддерживается всеми (9x, me, 2k, xp), кроме nt.
так что для nt нужно будет выбирать другой способ.
имхо в win9x/me существует только один стандартный способ получения списка процессов - это как раз и есть Toolhelp32 API. это сильно упрощает задачу перехвата, к тому же есть у win9x особенность... (см. ниже).
под nt/2k/xp все сложнее. здесь вариантов получения списка процессов гораздо больше - чтение информации о производительности из реестра, performance data helper api (для nt - это отдельная компонента, для w2k/xp - стандартная), недокументированная функция ZwQuerySystemInformation из ntdll.dll, Windows Management Instrumentation (w2k/xp).
поэтому перехватывать в nt/2k/xp нужно ох как много, хотя реально (имхо!) все эти api используют ZwQuerySystemInformation.
так что можно попробовать перехватывать только ее.
а идея дествительно проста - перехват вызовов тех функций, с помощью которых различные программы определяют список работающих процессов.
т.е. задача сводится к перехвату вызовов некоего api в чужих процессах. реализовать эту идею можно различными способами: от простой правки таблицы импорта, до "патча" самой перехватываемой функции.
фактически нужно будет выполнить два приема:
1) внедриться в чужой процесс (например, внедрить свою dll, или выделить в чужем процессе память, скопировать туда код и запустить поток через CreateRemoteThread и т.п.)
на эту тему как раз в той ветке:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1014992279&n=2
2) установить свои перехватчики функций api. опять же здесь есть разные варианты. про самый простой - правка таблицы импорта - смотри там же.
теперь о win9x/me. эта операционка имеет несколько особенностей, которые позволяют получить очень красивое решение.
1) не поддерживается защита PAGE_WRITECOPY регионов памяти. объясню на примере: в библиотеке kernel32.dll нуждается каждый процесс, соответственно каждый из них загружает ее при старте. конечно же операционка загружает kernel32.dll в память только один раз, а потом все процессы просто получают доступ к этому модулю. вот здесь и проявляется важный момент!
под winnt/2k/xp kernel32.dll имеет защиту copy-on-write. т.е. если некий процесс пропатчит что-либо в загруженном kernel32, то все пропатченные страницы автоматически скопируются для данного процесса. т.е. все вресенные им изменения будут видны только ему.
а под win9x/me это не так. защита copy-on-write здесь не реализована. поэтому если мы поправим что-либо в kernel32, то эти изменения будут видны всем (!) процессам.
дабы избежать такого произвола microsoft закрыла доступ к kernel32 так, что никакой VirtualProtect не помогает. т.е. сделала его строго readonly. но этот readonly можно снять с помощью недокументированного вызова ядра, что и делает back orifice.
ну а если мы можем править kernel32.dll в памяти, то задача практически решена. bo2k правит таблицу экспорта kernel32.dll так, чтобы она указывала на его функции-перехватчики.
тут еще одна проблема возникает: а где быть функциям-перехватчикам? они ведь должны быть доступны из всех процессов. что, опять внедрять какой-то код в каждый процесс?
нет, в win9x/me есть еще одна особенность - вся виртуальная память выше 2Гб является общей для всех процессов. поэтому выделяем там память под наши перехватчики, копируем их туда и все!
посмотреть, как это реализовано можно в исходниках bo2k.
что-то я увлекся :)
так вот, резюме: если вы хотите прятать свой процесс, перехватывая вызов функций toolhelp api, ZwQuerySystemInformation и т.п., то:
- для разных операционок потребуется перехват различных функций;
- читайте про перехват api - информации достаточно много.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c