21.2. Анализ кода программ | Телекоммуникации вчера, сегодня, завтра

Последовательность действий при создании объекта радиосвязи

Бланк формы №1 ТАКТИКО-ТЕХНИЧЕСКИЕ ДАННЫЕ РЭС

Поставка оборудования обеспеченного радиочастотами

Витрина



21.2. Анализ кода программ

Два основных способа исследования программного кода — это дизассемблирование и отладка.

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

Для защиты от дизассемблеров применяются различные методы. Например, если код программы запакован или зашифрован, дизассемблер не сможет увидеть в исследуемом файле настоящие инструкции и окажется бесполезен. Но защищенную таким образом программу можно сначала расшифровать и распаковать, а потом воспользоваться дизассемблером.

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

Так что реальную сложность для дизассемблирования представляют только программы, которые расшифровывают фрагменты кода динамически, не допуская единовременного присутствия в памяти расшифрованного кода целиком.

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

Иногда код программы модифицируется таким образом, чтобы дизассемблированную последовательность команд было очень трудно анализировать. Например, соседние команды разносятся в разные места, а правильность выполнения организуется за счет большого числа безусловных переходов. Или между командами вставляются произвольные фрагменты кода, не влияющие на результаты вычислений, но отнимающие у человека, выполняющего анализ, уйму времени.

Правда, стоит отметить, что, например, дизассемблер IDA Pro имеет весьма мощные средства расширения (подключаемые модули и язык сценариев), предоставляя тем самым возможность нейтрализовать все попытки противодействия дизассемблированию и последующему анализу.

Отладчик, в отличие от дизассемблера, является активным инструментом и позволяет проследить процесс выполнения по шагам, получая в любой момент всю информацию о текущем состоянии программы или вносить изменения в порядок ее выполнения. Разумеется, отладчик способен показывать дизассемблированные инструкции, состояния регистров, памяти и многое другое. Но наличие отладчика, в силу его активности, может быть обнаружено программой или той ее частью, которая отвечает за защиту. И программа может предпринять ответные действия.

Отладчики бывают трех основных типов: уровня пользователя, уровня ядра и эмулирующие.

Отладчики пользовательского уровня (User-level Debuggers) имеют практически те же возможности, что и отлаживаемая программа. Они используют Debugging API, входящий в состав операционной системы и с его помощью осуществляют контроль над объектом отладки. Отладчики пользовательского уровня входят в состав многих сред разработки, таких как Visual Studio. Они пригодны для исследования незащищенных программ, но могут быть легко обнаружены.

Отладчики уровня ядра (Kernel-mode Debuggers) встраиваются внутрь операционной системы и имеют гораздо больше возможностей, чем отладчики пользовательского уровня. Из ядра операционной системы можно контролировать многие процессы, не доступные другими способами. Одним из самых мощных и часто используемых отладчиков уровня ядра является Softlce, разработанный в компании NuMega Labs (Compuware Corporation). Но и отладчики уровня ядра почти всегда могут быть обнаружены из программы, не имеющей доступа к ядру. Хотя для Softlce, например, был разработан модуль расширения IceExt, позволяющий, среди прочего, неплохо скрывать наличие отладчика в памяти.

Эмулирующие отладчики, пожалуй, являются самым мощным средством исследования кода программ. Такие отладчики эмулируют выполнение всех потенциально опасных действий, которые программа может использовать для выхода из-под контроля исследователя. Однако основная проблема создания эмулирующих отладчиков заключается в том, что иногда им приходится эмулировать реальное периферийное оборудование, а это чрезвычайно сложная задача. Возможно поэтому сейчас нет доступных широкой аудитории эмулирующих отладчиков, хотя существует как минимум два пакета для создания виртуальных компьютеров: VMware, разработанный одноименной компанией, и VirtualPC, созданный в Connectix Corp. и недавно перешедший в собственность корпорации Microsoft.

Для защиты от отладки программа должна уметь определять наличие отладчика. Для обнаружения того же Softlce разработано более десяти способов. Но в некоторых случаях можно определить, что программа исследуется при помощи отладчика по косвенным признакам, таким как время выполнения.

В современных процессорах с архитектурой х86 реализована команда RDTSC (Read Time-Stamp Counter). Эта команда позволяет получить количество тактов процессора, прошедших с момента включения питания или последнего сброса. Очевидно, что отладчик тоже является программой. Следовательно, когда защищенная программа исследуется отладчиком, изрядная часть тактов процессора расходуется на выполнение его кода. И если программа знает приблизительное количество тактов, необходимое для выполнения определенного фрагмента кода, то, измерив реально затраченное число тактов, легко обнаружить значительное увеличение времени выполнения, затраченного на отладку.

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



Поиск по сайту


Смотрите также