Наши друзья
|
Восстановление исходного кода
Инженерный анализ представляет собой процесс воссоздания принципиальной схемы машины с помощью изучения только самой машины и характеристик ее работы. На самом высоком уровне это может означать изучение механизма, принцип действия которого сначала неясен, но начинает проясняться по ходу дальнейшего анализа. Грамотный инженер по восстановлению исходного кода сначала стремится понять детали программного обеспечения, что, с другой стороны, предполагает понимание всей системы в целом. Он должен хорошо разбираться как в программном обеспечении, так и в аппаратных средствах, и иметь истинное представление о том, как эти средства взаимодействуют друг с другом.
Рассмотрим, как внешние данные обрабатываются программой. Внешний пользователь может вводить данные и команды. Каждый выбор ветви кода является результатом нескольких решений, которые принимаются на основе входных данных. Иногда канал исполнения кода может быть "широким" и успешно пропускать неограниченное количество сообщений. Но он бывает и "узким", что приводит к замедлению или даже зависанию программы, если входные данные сформированы некорректно. На 1 изображена блок-схема программы стандартного FTP-сервера. На этом рисунке хорошо видно, насколько сложны взаимосвязи между участками программы. Каждый фрагмент кода изображен в виде блока, содержащего соответствующие машинные команды.
Вообще, чем больше углубляться в про-грамку, тем большее количество переходов будет между местом "старта" и конечной точкой. Чтобы получить доступ к конкретной точке в нашем "доме", придется сначала пройти через многие "комнаты" (и надеяться, что там есть полезные данные). Каждая внутренняя "дверь" имеет свои правила относительно того, какие данные разрешено пропускать. Поэтому очень сложно создать "правильные" вредоносные данные, которые бы прошли сквозь все "двери", как внешние, так и внутренние. В общем, входные данные становятся все более лаконичными и специфическими по мере углубления в программу. Вот почему для взлома программы недостаточно прямолинейных попыток подбора. Простая подача на вход программы случайных данных практически никогда не приводит к перебору всех возможных маршрутов исполнения кода. Поэтому многие возможные пути в программе остаются неизученными (и неиспользованными при взломе) как хакерами, так и специалистами по обеспечению безопасности.
Зачем это нужно?
Восстановление исходного кода позволяет узнать об оригинальной структуре программы и том, как вообще работают программы. Это просто необходимые сведения при взломе программного обеспечения. Например, можно узнать, какие системные функции использует атакуемая программа, к каким файлам она обращается, на основе каких протоколов работает и как взаимодействует с другими компьютерами локальной сети.
Основное преимущество восстановления исходного кода программы состоит в возможности изменить структуру программы и повлиять на ход ее выполнения. С технической точки зрения это создание заплаты (patching), поскольку добавляются заплаты к оригинальному программному коду. Заплаты позволяют добавить команды или изменить метод работы конкретного вызова функции, а значит, добавить потайные возможности, удалить или деактивировать функции и исправить в исходном коде ошибки, связанные с системой безопасности. В среде хакеров заплаты часто используются для уничтожения механизмов защиты от копирования.
Как и любое средство, восстановление исходного кода можно использовать и в благих, и в дурных целях.
Насколько это легально?
Восстановление исходного кода затрагивает вопросы, описанные в законе об интеллектуальной собственности. Во многих лицензиях на использование программного обеспечения жестко запрещается восстановление исходного кода. Компании по разработке программного обеспечения опасаются (и абсолютно справедливо), что с помощью восстановления исходного кода будут раскрыты алгоритмы и методы, использованные в их программах, которые являются их собственностью. Однако нет никакого прямого закона, запрещающего восстановление исходного кода.
Поскольку восстановление исходного кода является основным действием для устранения механизма защиты от копирования, то возникают определенные сомнения насчет его легальности. Безусловно, применение восстановления исходного кода для уничтожения защиты от копирования является незаконным. Однако само по себе восстановление исходного кода не является незаконным. Если появится закон, запрещающий восстановление исходного кода, то это создаст массу проблем для рядовых пользователей программного обеспечения. Подобный запрет будет напоминать запрет на открытие капота вашего автомобиля для его ремонта, т.е. пользователю, согласно такому закону, при каждом ремонте и техническом обслуживании придется обращаться к дилеру.
Поставщики программного обеспечения запрещают восстановление исходного кода в своих лицензиях по многим причинам. Одна из очевидных причин заключается в том, что восстановление исходного кода позволяет раскрыть секретные методы и алгоритмы. Однако фокусировать всевозможные проблемы на самой идее восстановления исходного кода было бы довольно глупо. Для опытного программиста обладание двоичным машинным кодом не менее полезно, нежели самим исходным кодом. Таким образом, секреты уже раскрыты, хотя только специалисты способны "прочесть" код. Не забывайте, что секретные методы можно защитить другими путями, без попыток их скрыть от всех, кроме специалистов, в скомпилированном программном коде. Для этой цели существуют патенты и закон по защите авторских прав. Хорошим примером защиты авторских прав являются алгоритмы шифрования. Мощность и распространенность этих алгоритмов возможно обеспечить только при общедоступности этих алгоритмов для их оценки специалистами по шифрованию. Однако разработчик алгоритма может запатентовать свои авторские права. Так произошло для популярной схемы шифрования RSA.
Второй причиной противодействия восстановлению исходного кода является желание разработчиков программ закрыть свои программы от исследователей, которые могут найти ошибки в системе защиты. Довольно часто специалисты по безопасности находят такие ошибки в программах и сообщают о них с помощью форумов, например, в bugtraq. Это вредит репутации поставщиков программного обеспечения (и одновременно заставляет улучшать несовершенные программы). Значительно лучше, если специалист по обеспечению безопасности спешит уведомить разработчика программы о выявленной проблеме, но ожидает определенное время до выхода исправления, прежде чем сообщать о ней всем пользователям. Обратите внимание, что в период внесения исправлений уязвимое место остается доступным для использования всеми желающими. Если восстановление исходного кода будет запрещено, специалисты не смогут проверять качество программного кода. Пользователям придется верить на слово поставщикам программ, заявляющим о высочайшем качестве их продукта. При этом не забывайте, что ни один поставщик не несет финансовой ответственности за выявление недостатков в своем программном обеспечении.
В контексте закона об авторских правах в цифровую эпоху (DCMA), восстановление исходного кода и структуры программы рассматривается с точки зрения нарушения прав собственности и взлома программного обеспечения. С очень интересной точкой зрения относительно того, как этот закон влияет на свободу личности, можно ознакомиться на сайте Эда Фелтена (http: //www. freedomtotinker. com).
При интерактивной покупке или установке программного обеспечения пользователю обычно выводится окно лицензионного соглашения с конечным пользователем (EULA). Это соглашение о правилах использования программного обеспечения, которое надо прочесть и принять. Во многих случаях даже вскрытие контейнера с пакетом программного обеспечения (например, коробки) означает согласие с условиями лицензии. При загрузке программного обеспечения по Internet, как правило, от пользователя требуется щелкнуть на кнопке "I AGREE" ("Я согласен") при появлении окна, содержащего текст лицензии. При этом часто запрещается восстановление исходного кода и структуры программы.
Еще более строгие ограничения относительно восстановления исходного кода и структуры программы (вплоть до криминальной ответственности) накладывает стандарт UCITA (Uniform Computer Information Transaction Act), который уже принят в нескольких штатах США. |