Современные подходы к анализу программного обеспечения

Введение

Современное программное обеспечение состоит из множества программных модулей, реализованных с применением различных технологий. Рассматривая тенденции развития технологической базы разработки программного обеспечения отметим движение в сторону платформы .NET Framework для Microsoft Windows. В основе функционирования программных решений, разработанных под платформу .NET Framework лежит байт-код. Принцип JIT компиляции в данной технологии несколько схож с подходом, реализованным для языка программирования Java [1].

Для UNIX-подобных операционных систем преимущественно разрабатывается “Native” (скомпилированное под платформу) программное обеспечение. Отдельно следует обратить внимание на Android системы в основе которых лежит ядро Linux. Значительная часть программных приложений для этой операционной системы разрабатывается для работы под Dalvik виртуальной машиной с применением Android SDK [2].

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

В настоящее время ряд средств позволяет проводить реверс-инжиниринг как Native программного обеспечения, так и базирующегося на байт-коде. К таким средствам относятся Hex Rays IDA Pro [3], Red Gate .NET Reflector [4], JetBrains dotPeek [5] и другие.

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

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

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

Современные подходы к анализу программного обеспечения

Методы анализа современного программного обеспечения в общем случае делят на три типа [6]:

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

2) Метод черного ящика. Примером данного метода является Fuzzing. Данный метод больше подходит для поиска уязвимостей и ошибок в программном обеспечении, поскольку методом полноценного анализом программного обеспечения данный подход назвать затруднительно.

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

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