<< Предыдущая

стр. 35
(из 39 стр.)

ОГЛАВЛЕНИЕ

Следующая >>



Еще один способ классификации инструментов — по области применения,
т. е. что именно подвергается исследованию:
• исполняемый код;
• ресурсы приложения;
• дисковые файлы;
• записи в реестре;
• информация в оперативной памяти;
• информация, получаемая от устройств ввода;
О информация, посылаемая на устройства ввода;
• сообщения и данные, пересылаемые между процессами и внутри процесса;
• данные, передаваемые по сети;
• вызовы библиотечных функций.
Рассмотрим несколько наиболее мощных инструментов исследования.


21.2. Анализ кода программ
Два основных способа исследования программного кода — это дизассемб-
лирование и отладка.
Используя дизассемблер, можно посмотреть, как устроена программа, какие
команды и в какой последовательности должны выполняться, к каким
функциям идет обращение и т. д. В общем случае дизассемблер не способен
восстановить исходный текст программы, написанной на языке высокого
уровня, таком как С или Pascal. Результатом работы дизассемблера является
(как можно догадаться из названия) эквивалентный текст на языке ассемблера.
Для осмысления ассемблерного текста аналитик, разумеется, должен быть хо-
рошо знаком с языком ассемблера и с особенностями той среды, в которой
должна выполняться дизассемблируемая программа. Дизассемблер является
пассивным инструментом — он никак не воздействует на программу.
Самым мощным дизассемблером из существующих на сегодняшний день]
можно смело назвать дизассемблер IDA Pro (Interactive DisAssembler), разра-.
ботанный компанией DataRescue.
Для зашиты от дизассемблеров применяются различные методы. Например,
если код программы запакован или зашифрован, дизассемблер не сможет
увидеть в исследуемом файле настоящие инструкции и окажется бесполезен.
Но защищенную таким образом программу можно сначала расшифровать и
распаковать, а потом воспользоваться дизассемблером.
Для большинства популярных средств упаковки и шифрования кода испол-
няемых модулей давно разработаны автоматические или полуавтоматические
Глава 21. Инструментарий исследователя 245


распаковщики. А для того чтобы узнать, чем именно запакован тот или иной
модуль, можно воспользоваться специальными программами-идентификато-
рами, которые по некоторым характерным признакам способны опознавать
название и версию используемого средства защиты, а также версию компи-
лятора, применявшегося при разработке программы.
Так что реальную сложность для дизассемблирования представляют только
программы, которые расшифровывают фрагменты кода динамически, не
допуская единовременного присутствия в памяти расшифрованного кода
целиком.
В некоторых случаях дизассемблер отказывается работать с исполняемым
файлом, если какие-то заголовки файла сформированы с нарушением спе-
цификации, но данный способ также не является надежным.
Иногда код программы модифицируется таким образом, чтобы дизассемб-
лированную последовательность команд было очень трудно анализировать.
Например, соседние команды разносятся в разные места, а правильность
выполнения организуется за счет большого числа безусловных переходов.
Или между командами вставляются произвольные фрагменты кода, не
влияющие на результаты вычислений, но отнимающие у человека, выпол-
няющего анализ, уйму времени.
Правда, стоит отметить, что, например, дизассемблер IDA Pro имеет весьма
мощные средства расширения (подключаемые модули и язык сценариев),
предоставляя тем самым возможность нейтрализовать все попытки противо-
действия дизассемблированию и последующему анализу.
Отладчик, в отличие от дизассемблера, является активным инструментом
и позволяет проследить процесс выполнения по шагам, получая в любой
момент всю информацию о текущем состоянии программы или вносить из-
менения в порядок ее выполнения. Разумеется, отладчик способен показы-
вать дизассемблированные инструкции, состояния регистров, памяти и
многое другое. Но наличие отладчика, в силу его активности, может быть
обнаружено программой или той ее частью, которая отвечает за защиту.
И программа может предпринять ответные действия.
Отладчики бывают трех основных типов: уровня пользователя, уровня ядра
и эмулирующие.
Отладчики пользовательского уровня (User-level Debuggers) имеют практиче-
ски те же возможности, что и отлаживаемая программа. Они используют
Debugging API, входящий в состав операционной системы и с его помощью
осуществляют контроль над объектом отладки. Отладчики пользователь-
ского уровня входят в состав многих сред разработки, таких как Visual
Studio. Они пригодны для исследования незащищенных программ, но могут
быть легко обнаружены.
246 Часть V. Заметки об исследовании средств защиты


Отладчики уровня ядра (Kernel-mode Debuggers) встраиваются внутрь опера-
ционной системы и имеют гораздо больше возможностей, чем отладчики
пользовательского уровня. Из ядра операционной системы можно контро-
лировать многие процессы, не доступные другими способами. Одним из са-
мых мощных и часто используемых отладчиков уровня ядра является
Softlce, разработанный в компании NuMega Labs (Compuware Corporation).
Но и отладчики уровня ядра почти всегда могут быть обнаружены из про-
граммы, не имеющей доступа к ядру. Хотя для Softlce, например, был раз-
работан модуль расширения IceExt, позволяющий, среди прочего, неплохо
скрывать наличие отладчика в памяти.
Эмулирующие отладчики, пожалуй, являются самым мощным средством
исследования кода программ. Такие отладчики эмулируют выполнение всех
потенциально опасных действий, которые программа может использовать
для выхода из-под контроля исследователя. Однако основная проблема соз-
дания эмулирующих отладчиков заключается в том, что иногда им прихо-
дится эмулировать реальное периферийное оборудование, а это чрезвычайно
сложная задача. Возможно поэтому сейчас нет доступных широкой аудито-
рии эмулирующих отладчиков, хотя существует как минимум два пакета для
создания виртуальных компьютеров: VMware, разработанный одноименной
компанией, и VirtualPC, созданный в Connectix Corp. и недавно перешед-
ший в собственность корпорации Microsoft.
Для защиты от отладки программа должна уметь определять наличие отлад-
чика. Для обнаружения того же Softlce разработано более десяти способов.
Но в некоторых случаях можно определить, что программа исследуется при
помощи отладчика по косвенным признакам, таким как время выполнения.
В современных процессорах с архитектурой х86 реализована команда
RDTSC (Read Time-Stamp Counter). Эта команда позволяет получить коли-
чество тактов процессора, прошедших с момента включения питания или
последнего сброса. Очевидно, что отладчик тоже является программой. Сле-
довательно, когда защищенная программа исследуется отладчиком, изрядная
часть тактов процессора расходуется на выполнение его кода. И если про-
грамма знает приблизительное количество тактов, необходимое для выпол-
нения определенного фрагмента кода, то, измерив реально затраченное чис-
ло тактов, легко обнаружить значительное увеличение времени выполнения,
затраченного на отладку.
Для программ, компилируемых в псевдокод, также существуют и отладчики,
и декомпиляторы, выдающие исходный текст не на ассемблере, а в некото-
ром ином представлении, пригодном для анализа.
Глава 21. Инструментарий исследователя 247


21.3. Работа с ресурсами
Для того чтобы найти какую-нибудь информацию в ресурсах исполняемого
модуля, можно воспользоваться даже таким инструментом, как редактором
Microsoft Visual Studio. Но лучше использовать специализированные редак-
торы ресурсов, которых существует довольно много. Эти редакторы, как
правило, позволяют просматривать ресурсы известных типов (например тек-
стовые строки, иконки, картинки и описания диалогов) в естественном ви-
де, а незнакомые ресурсы — в виде шестнадцатеричного дампа.
Полезным может оказаться и модуль расширения Resource Browser, подклю-
чаемый к файловому менеджеру FAR. Этот модуль позволяет просматривать
ресурсы в виде иерархического фрагмента файловой системы с подкаталога-
ми и файлами. При использовании такого представления ресурсов очень
удобно производить поиск.


21.4. Доступ к файлам и реестру
О программах-мониторах, протоколирующих попытки доступа к реестру и
дисковым файлам, рассказывалось в разд. 14.3.2. Монитор реестра (Registry
Monitor) и монитор доступа к файлам (File Monitor) — это активные инст-
рументы.
А пассивные инструменты просто запоминают состояния реестра или фай-
лов и по расхождениям позволяют определить, что именно изменилось.
Простейший способ обнаружить измененные файлы, не сохраняя их цели-
ком, — подсчитать и запомнить значения хэш-функции от содержимого каж-
дого файла до и после выполнения процесса, вносящего изменения, а потом
сравнить два набора хэшей между собой. Именно на таком принципе строи-
лась работа антивирусного монитора Adlnf, функционировавшего под DOS.
Если удалось установить, какие именно файлы подвергаются изменению, их
можно целиком заархивировать, а потом, после, внесения изменений, срав-
нить старое и новое содержимое. Для этого можно воспользоваться специаль-
ными инструментами или утилитой FC (File Compare), входящей в состав
Windows. FC позволяет сравнивать как двоичные, так и текстовые файлы.
С реестром работать не так удобно, как с файлами, из-за того, что реестр
Windows представляет собой довольно сложную древовидную структуру.
Зато объем данных, хранимых в реестре, сравнительно невелик — от силы
несколько десятков мегабайт. Поэтому можно просто обойти все ветви рее-
стра и сохранить значения в собственном формате. Одна из программ, по-
зволяющих это сделать, — Advanced Registry Tracer (ART), разработанная
компанией ElcomSoft Co. Ltd.
248 Часть V. Заметки об исследовании средств защиты


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


21.5. Содержимое оперативной памяти
Для доступа к памяти процесса можно использовать функции стандартного
Win32 API. В операционных системах семейства NT некоторые процессы
могут быть запущены с атрибутами безопасности, не позволяющими про-
стым пользователям получать доступ к внутренностям процесса. Но это де-
лается для того, чтобы защитить ядро операционной системы в многополь-
зовательской среде. А в случаях исследования программ, как правило,
пользователь может поставить себе любые права доступа и не встретит пре-
пятствий для доступа к памяти исследуемого процесса.
Существуют также специальные программы, позволяющие не просто сохра-
нить фрагмент памяти на диск, но записать его в формате Portable Executable
(РЕ). Такая операция называется получением дампа исполняемого файла и
применяется для получения расшифрованной и распакованной версии ис-
следуемой программы.


21.6. Устройства ввода и вывода
Устройства ввода-вывода невозможно исследовать пассивными средствами,
зато обращения к ним можно протоколировать.
Программы для протоколирования нажатий на клавиатуру обычно называют
клавиатурными шпионами и применяют для перехвата паролей, вводимых
пользователем. Однако этот прием применяется или троянскими програм-
мами, или при попытке выведать секретную информацию у человека, но
никак не при исследовании средств защиты.
Протоколирование ввода и вывода в СОМ- и LPT-порты может осуществ-
ляться, например, при помощи программы PortMon, разработанной Марком
Русиновичем (Mark Russinovich) из компании Syslnternals.


21.7. Сообщения Windows
Очень многие процессы внутри Windows управляются с помощью сообще-
ний. Разумеется, существуют программы, позволяющие отслеживать и про-
токолировать, какие именно сообщения были переданы тому или иному
процессу.
Глава 21. Инструментарий исследователя 249

Одной из таких программ является Microsoft Spy++, входящая в состав
Visual Studio. Spy++ позволяет из списка или интерактивно на экране вы-
брать окно, сообщения для которого необходимо отслеживать, и просмот-
реть его свойства. Можно также задать, какие именно сообщения должны
протоколироваться и какие их атрибуты будут показываться. Протокол мо-
жет сразу записываться в файл.


21.8. Сетевой обмен
Для перехвата данных, передаваемых по сети, используются специальные
программы, называемые снифферами (sniffer). Как правило, снифферы спо-
собны перехватывать все сообщения, передаваемые между устройствами
внутри физического сегмента сети, к которому подключен компьютер со
сниффером.
Несмотря на то, что уже много лет существуют протоколы, позволяющие
скрыть от противника всю важную информацию при передаче по сети, до
сих пор не вышли из употребления некоторые протоколы, в которых, на-
пример, пароли пользователей передаются в открытом виде.
Так в оригинальной версии протокола FTP (File Transfer Protocol), опи-
санной в RFC 765 (Request For Comment № 765) и датированной июнем
1980 года, и в обновленной версии протокола от октября 1985 года
(RFC 959) описан только один метод аутентификации. При использовании
этого метода пароль передается открытым текстом как аргумент команды
PASS.
Ан&тогично, протокол РОРЗ (Post Office Protocol — Version 3), описание ко-
торого впервые было опубликовано в 1988 году (RFC 1081), при аутентифи-
кации передавал пароль пользователя только открытым текстом.
Позже и для FTP, и для РОРЗ были сделаны расширения протокола и
добавлены несколько более безопасных методов аутентификации. Но до
сих пор многие люди продолжают по разным причинам использовать ау-
тентификацию, при которой пароли передаются открытым текстом. На-
пример, настройки почтового клиента могли очень давно не обновлять-
ся — зачем, ведь все и так работает. А некоторые клиентские программы и
серверы просто не поддерживают расширенные способы аутентификации.
И почти всегда по умолчанию используется самый совместимый, а не са-
мый безопасный метод подключения, а пользователям не приходит в голо-
ву его поменять — далеко не каждый знает, что при помощи сниффера
получить пароль FTP или РОРЗ, передаваемый открытым текстом, не со-
ставляет труда.
250 Часть V. Заметки об исследовании средств защиты


21.9. Вызовы библиотечных функций
Очень много информации о программе можно получить путем анализа об-
ращений, которые она делает к библиотечным функциям. Например, при
использовании протокола SSL (Secure Sockets Layer) применение сниффера
не дает никаких результатов, т. к. все сообщения, передаваемые по сети,
оказываются зашифрованы. Но под Windows большинство программ для
доступа к сети, так или иначе, используют библиотеку wsock32.dll (Windows
Socket 32-Bit DLL). И, перехватывая обращения к функциям из этой биб-
лиотеки, можно получить доступ к содержимому передаваемых и получае-
мых сообщений, не применяя сниффер.
Аналогичным образом можно перехватывать и протоколировать обращения
к другим библиотекам, входящим в состав Windows или распространяемым
вместе с исследуемой программой.
Существует несколько решений для разработчиков, позволяющих перехва-
тывать обращения к библиотечным функциям, например библиотека
Detours, созданная корпорацией Microsoft, и библиотека ApiHooks, разрабо-
танная человеком по имени Радим Пича (Radim "EliCZ" Picha). Также в Ин-

<< Предыдущая

стр. 35
(из 39 стр.)

ОГЛАВЛЕНИЕ

Следующая >>