Введение
В настоящее время существует огромное число вредоносных программ под разные платформы. Помимо устранения последствий атаки антивирусным компаниям также важно знать, кто является автором вредоносной программы. Это необходимо, например, для идентификации хакерской группировки, устроившей атаку, что может помочь розыску преступников и задержанию.
В последнее время фокус злоумышленников сместился на мобильные устройства, поэтому их защита, как и определение автора появившихся вирусов, становится все более актуальной задачей.
Таким образом, выбранная тема «Установление авторства кода мобильных приложений» важна и имеет практическое значение.
1. Методы анализа программ
В прошлом семестре было изучено множество публикаций (отображены здесь), работающих с исходным кодом на языке программирования высокого уровня, для установления потенциального единого авторства двух предоставленных образцов.
Проблема заключается в том, что получить исходный код вредоносного ПО удается достаточно редко. Кроме того, вредоносное ПО всегда можно переписать на другой язык программирования, для многих пар ЯП существуют специальные инструменты для портирования. Это заметно усложняет анализ исходного кода и побуждает перейти к анализу байт-кода, например, IL.
- IL можно всегда получить из бинарного файла, скомпилированного под .NET;
- в IL меньше инструкций, чем в большинстве языков программирования высокого уровня, а их набор жестко зафиксирован;
- результирующий IL не будет сильно отличаться, если одна программа была скомпилирована на разных языках программирования;
- IL-код не чувствителен к пробельным символам в исходном коде, которые с легкостью позволяют обманывать обычный антиплагиат.
IL-код используется при разработке мобильных приложений с помощью Xamarin.NET. Кроме того, IL очень похож на другой подобный язык стековой машины — JVM, используемый для Android-приложений, написанных на Java или Kotlin, и достаточно легко сводится к нему.
2. Признаки, указывающие на авторство
Рассмотрим информацию, которую можно получить при анализе кода приложения или его кода:
- Название сущностей (переменных, классов, методов и т. д.). Эта информация доступна только при наличии исходного кода программы или метаданных. Но она дает много информации о привычках автора. Стиль наименования, метод наименования, наличие ошибок в английских названиях — все это может помочь идентифицировать автора.
- Последовательность инструкций — ее совпадение (возможно, с точностью до некоторой перестановки) свидетельствует о заимствовании фрагментов кода, что также может являться признаком авторства: программист может использовать фрагменты своих других программ для экономии времени.
- Взаимосвязь классов и функций — может анализироваться и при наличии только IL-кода (если речь идет о .NET приложениях). Анализ схемы наследования классов, последовательности и путей вызовов функций могут помочь обнаружить автора.
- Метаинформация файлов — может содержать сведения о версии компилятора, системе, на которой была выполнена компиляция, а также ее время и дата.
- Системные зависимости — может анализироваться без исходного кода, но позволяет сделать выводы о возможном поведении программы.
3. Потенциальные методы определения авторства
3.1. Установление авторства по графу программы
В статье «Detection of Software Plagiarism by Program Dependence Graph Analysis» авторы делают упор на последовательность инструкций и их значение. Каждый фрагмент разбивается на строки, а они идентифицируются по своему семантическому значению (объявление, присваивание, вызов функции и т. д). Затем последовательность лексем преобразуется в граф. Единое авторство для двух фрагментов кода в этой работе рассматривается, как изоморфизм подграфов, представляющих код. Такой алгоритм устойчив к переименованиям, перестановкам инструкций, заменам и вставкам кода.
3.2. Установление авторства с использованием ГЗП
В статье «Платформенно-независимый и масштабируемый инструмент поиска клонов кода в бинарных файлах» используется метод поиска графа зависимостей и их последующее сравнение. Но, в отличие от предыдущего метода, граф зависимостей составляется отдельно для каждой подпрограммы. Это позволяет нивелировать влияние перестановки блоков кода местами на результат определения авторства. На втором этапе производится поиск клонов на основе ранее созданных графов. Для каждой пары графов строится наибольший общий подграф, на основе которого определяются клоны бинарного кода.
4. Заключение и план дальнейшей работы
За первый учебный год были рассмотрены работы, в которых представлены различные алгоритмы сравнения программ. Также немного изучен механизм обфускации, были найдены около десятка различных обфускаторов, которые работают для программ платформы .NET. Данные материалы будут использованы в моей работе.
План НИР заключается в следующем:
- Составление выборки кодов, на которых будет проводиться исследование
- Применение найденных алгоритмов установления авторства к IL-коду образцов из выборки, выявление их применимости и точности
- Применение алгоритмов к обфусцированным образам, замер точности
- Построение собственного алгоритма, который будет выявлять обфусцированные образцы одного автора