Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Маскировка приложения и драйвера


Автор: Goganchic 8.10.2008, 16:37
Всем привет!
Я сейчас занимаюсь разработкой одного приложения, работающего и в пользовательском пространстве и в пространстве ядра. Эта штука, можно сказать, относится к корпоративной безопасности и простые пользователи не должны знать о ее существовании, т.е. админ пришел, настроил пользователю систему, пользователь сел и если сильно не копает - то ничего и не знает о том, что на его компьютере есть посторонняя, незнакомая ему программа. Следовательно, встает вопрос о маскировке. Хотелось бы узнать, какие способы маскировки существуют. Поясню, меня интересует не только реализация, но и вообще, принципы маскировки, средства можно использовать практически любые (ибо драйвер). Итак, я думаю что можно сделать следующее для маскировки приложения:
  • скрыть его из списка процессов
  • скрыть файл с диска (не поставить ему аттрибут "скрытый", а именно скрыть, т.е. перехватить ф-ию ZwOpenFile и не давать обращаться к файлу, а также не показывать его в листинге директорий)
Кто что может добавить? Как еще можно найти скрытый процесс?

P.s. программа абсолютно легальна и не является ни вирусом, ни руткитом, ни трояном (в смысле, она будет, так сказать, легальным трояном, т.е. администратор будет знать, что эта программа есть)

Автор: azesmcar 8.10.2008, 16:50
Скрыть не очень просто...можешь конечно закрыть OpenProcess, но виден он все равно буден..Можно перехватить EnumProcess, но тогда придеться также перехватыватх и CreateToolHelp32Snapshot...геморроя много, по моему проще сделать свое дело под чужим процессом..к примеру WinLogon, можно заменить msgina.dll, можно написать простую библиотеку которая будет подгружаться ко всем/нужным тебе процесам (AppInit_DLLs).

Автор: Goganchic 8.10.2008, 16:53
Сейчас уже придумал еще одну проблему: программа время от времени будет лезть в сеть, так что нужно ее будет вытирать еще из списка соединений.

Автор: azesmcar 8.10.2008, 17:09
ну я же говорю - внедри DLL в какой нибудь системный процесс и дело с концом...

Добавлено через 2 минуты и 10 секунд
будет ощущение что это к примеру winlogon в сеть лезет..можно еще создать удаленный поток на одном из системных процессов и в нем реализовать все что нужно.

Автор: Goganchic 8.10.2008, 17:21
azesmcar, ок, попробую smile
Если еще есть идеи - я всегда готов выслушать

Автор: Riply 10.10.2008, 06:35
Цитата(Goganchic @  8.10.2008,  17:21 Найти цитируемый пост)
Если еще есть идеи - я всегда готов выслушать 


Сам напросился smile

IMHO, прятанье - самое неблагодарное занятие, ибо положительного
эффекта добиться очень сложно. Как правило, в результате "овчинка выделки не стоит" smile

Цитата(Goganchic @  8.10.2008,  16:37 Найти цитируемый пост)
скрыть его из списка процессов


Чтобы это реализовать, для начала надо знать все способы перечисления процессов.
Ибо спятал от одного способа - найдут другим.
И этих способов - как собак нерезанных smile
Только Ms-Rem, если мне не изменяет память, перечисляет их штук восемь.
(Начинай считать количество функций, которые надо перехватывать smile )


Далее: посмотри сколько открытых Handle`ов у твоего процесса.
Почти через любой из них можно выйти на процесс (ну как минимум узнать о его существовании).
Соответственно придется прятать и их тоже ( кстати, а в скольки таблицах они сидят ? ).

Цитата(Goganchic @  8.10.2008,  16:37 Найти цитируемый пост)
скрыть файл с диска (не поставить ему аттрибут "скрытый", а именно скрыть, т.е. перехватить ф-ию ZwOpenFile и не давать обращаться к файлу, а также не показывать его в листинге директорий)


И здесь наша дорога скатерью не будет smile
Кроме OpenFile, надо еще перехватывать CreateFile, но это цветочки.
Только одна ZwQueryDirectoryFile, может выдавать список объектов, как минимум с тремя разными FILE_INFORMATION_CLASS.
Это означает, что придется корректировать не менее трех разных видов структур только для нее одной.
А сколько еще существует подобных функций ? Я, например, не знаю. А ведь спрятать - означает спрятать от всех, а не от части.
Пусть мы сумели перебрать все возможные подобные ф-ии, перехвать их и подкорректировать.
(Кстати, ты еще ведешь подсчет количества функций ? smile )
Но и здесь встает новая проблема: файл можно найти через MFT.
И вот здесь мы с тобой зубы то и пообламаем 
Ибо коррестировать работу системных функций с MFT - это... ну... вообщем...  это что-то !
Если, кто сумеет, то ему памятник поставить надо будет smile

Все, что я перечислила, это так, навскидку. Просто не спиться. А если подумать, то список подлинее будет

P.S.
 А как ты думаешь, система не будет подтормаживать обрабатывая все наши перехваты ?
 Может у нее ни на что другое и времени не останется ? smile

P.P.S.
 Хоть и упомянула в начале, но на всякий случай повторюсь: все сказанное - IMHO.

Добавлено @ 06:38
В догонку:
 Существуют еще всякие PerformanceCounter-ы, WMI и черта в ступе.
 О них тоже придется позаботиться.
 Ты как там, не сбился с подсчета функций ? smile

Автор: azesmcar 10.10.2008, 06:53
Riply когда то во времена своей бурной молодости я пытался заняться скрытием процессов...
потом понял что геморроя не оберешся и просто перекрыл OpenProcess чтобы программу не убили злые пользователи. Но с ДЛЛ все обстоит совсем иначе..ни тебе процессов, ни перехватов апи. собственно у тебя нет процесса чтобы его можно было увидеть. 

Автор: Riply 10.10.2008, 07:46
Цитата(azesmcar @  10.10.2008,  06:53 Найти цитируемый пост)
Но с ДЛЛ все обстоит совсем иначе..ни тебе процессов, ни перехватов апи. собственно у тебя нет процесса чтобы его можно было увидеть.  


Почти полностью согласна.
Но, если бы мне поставили такую задачу, как спрятаться, я бы
смотрела в сторону "распределенных нитей". Т.е. мы существуем не в виде процесса или DLL,
а в виде группы нитей распределенных в разных процессах smile

Автор: azesmcar 10.10.2008, 08:01
Цитата

можно еще создать удаленный поток на одном из системных процессов


ну я и предложил, или мы говорим о разном? smile нить - это вы а так понимаю о потоке? мне незнакомо другое значение этого термина.

Автор: Riply 10.10.2008, 08:57
Цитата(azesmcar @  10.10.2008,  08:01 Найти цитируемый пост)
нить - это вы а так понимаю о потоке?


Угу. Прсто, мне кажется что "нить" более верный темин.
Во-первых Thread, так преводится.
Во-вторых в потоках можно запутаться - слишком много их развелось smile
Тут тебе и семейство разных TStream`ов и потоки у FS-объектов.

Автор: ama_kid 15.10.2008, 23:14
Цитата(Riply @ 10.10.2008,  07:35)
Цитата(Goganchic @  8.10.2008,  17:21 Найти цитируемый пост)
Если еще есть идеи - я всегда готов выслушать 


Сам напросился smile

IMHO, прятанье - самое неблагодарное занятие, ибо положительного
эффекта добиться очень сложно. Как правило, в результате "овчинка выделки не стоит" smile
[...поSKIPано...]
 Ты как там, не сбился с подсчета функций ? smile

ну, блин, ты расписала  smile  
Все, оно, конечно, правильно, но человек же сказал, что
Цитата(Goganchic @  8.10.2008,  17:37 Найти цитируемый пост)
пользователь сел и если сильно не копает - то ничего и не знает о том, что на его компьютере есть посторонняя, незнакомая ему программа.
эта фраза фактически означает, что можно обойтись, стандартными приёмами:
1) спрятать файл - перехват ZwQueryDirectoryFile, ZwOpenFile и может еще пару-тройку функций...
2) спрятать процесс - перехват ZwQuerySystemInformation...
Все, спрятанный таким образом файл-процесс не будет виден стандартными приемами типа проводника\фара\тотал коммандера\диспетчера задач и даже ProcessExplorer'а от SysInternals... Естесственно, от ProcessHunter'а и прочих руткитов только эти ухищрения не помогут, но при правильной настройке административных прав системы руткиты тоже могут пообломать зубы... smile
Насчет скрытия сетевой активности, к сожалению, не могу ничего сказать, потому что не доводилось интересоваться этой темой, но не думаю, что принцип скрытия там слишком отличается, главное - найти функцию, которая информирует о сетевом соединении и которую можно будет перехватить...
P.S. В общем, я всего лишь хотел сказать, что надо правильно соотнести затраты\цели и решить, стоит ли игра свеч? При борьбе с "типовым пользователем" описанных мной приемов бывает достаточно... smile 

Автор: shara 18.10.2008, 00:59
люди, меня интересует перехват создания/чтения/записи файлов в винде (в идеале перехватить момент создание фала чужим приложением, читать информацию которую оно хочет записать в файл а записывать другие, свои данные), я пока читал сей топ увидел про упоминания интересующих меня функций 
Цитата(Riply @  10.10.2008,  06:35 Найти цитируемый пост)
Кроме OpenFile, надо еще перехватывать CreateFile, но это цветочки.

подскажите, что читать  чтобы понимать о чем вы тут толкуете... как это делается и возможно ли вообще такое?

Автор: Riply 18.10.2008, 06:12
Цитата(shara @  18.10.2008,  00:59 Найти цитируемый пост)
подскажите, что читать  чтобы понимать о чем вы тут толкуете... как это делается и возможно ли вообще такое?


Мое IMHO, что лучше всего начинать изучать тему перехвата с Рихтера.
Он там все по полочкам раскладывает и примеры есть smile
Ну а когда инструмент будет освоен, то для того чтобы лучше понимать 
что, где и когда надо перехватывать (а может и не надо smile ),  рекомендую
почитать David A. Solomon Mark E. Russinovich "Inside Microsoft for Windows 2000"

Автор: shara 19.10.2008, 21:47
Riply, 
спасибо за совет smile 

Автор: Goganchic 20.10.2008, 12:48
shara, штука эта называется filesystem filter driver

Добавлено через 40 секунд
Кстати, я сделал то, что хотел: просто в фильтр-драйвере добавил отказ на некоторые операции для некоторых процессов и усё smile

Автор: shara 9.9.2009, 21:27
Цитата(Goganchic @  20.10.2008,  11:48 Найти цитируемый пост)
filesystem filter driver
 - о как ты был прав. а я по началу полез в сторону перехвата API. жизнь все равно заставила писать фильтр-драйвер

Цитата(Goganchic @  20.10.2008,  11:48 Найти цитируемый пост)
добавил отказ на некоторые операции для некоторых процессов и усё

а на какие именно если не корпоративный секрет?


Автор: DrHex 10.9.2009, 12:56
Первый способ.
1)Перезват NtQuerySystemInformation()
            - Список процессов(так как практически все функции используют именно это функции исключения когда функция реализуется ручками      например SoftIce )
            - Kernel Memory - перехват запроса на получения информации о память ядра с целью скрыть свой драйвер

2) Перехват всех возможных получения handle, connection and etc. 

3) Перехват KeStackAttach, ReadProcessMemory, WriteProcessMemory.(для того что бы наши хуки не кто не снял, но снимут же)

Второй способ. 
1)Внедрится в доверенный процесс. Такой winlogon, system, svchoost. Лучше всего поступить по методу вируса.

Третий способ. 
1)Inject library(не достаток заключается к том что челок просто просканирует процессы на .dll и удалит не нужную)

Лучше всего это модификация доверенного exe файла. Хотя без перехвата нативного апи не обойтись, хотя бы не отображать netstat, и потоки.

P.S.
Перехват апи функций это помогает только если на компьютере нет никаких системных утилит. К примеру Wireless у него кажется сетевой драйвер, так что он реально и передается все данный по сети и знает какие процессы и с кем соединение.

Автор: shara 12.9.2009, 16:44
DrHex, 
это все очень похоже на игру в кошки мышки, ты прячешся стараясь подтянуть все хвосты а кто-то наоборот их вытаскивает. 

общую идею понять не сложно. дальше лишь дело техники..

а как насчет прятанья драйвера? или скажем не прятанья, а его защиты - к примеру, защита от  принудительной выгрузки\остановки  или перемещения куда-нить подальше.    тоже в самом драйвере перехватывать соотв. системные вызововы? тогда, если я правильно все понимаю, наш драйвер может быть выгружен только другим "драйвером" который был загружен раньше? и как следствие вся проблема защиты сводится к тому чтобы пораньше запуститься...  прошу меня поправить если ошибаюсь


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)