СПОСОБ И СИСТЕМА ОПРЕДЕЛЕНИЯ ПРИНАДЛЕЖНОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ПО ЕГО МАШИННОМУ КОДУ Российский патент 2020 года по МПК G06F8/74 G06F8/75 G06F21/56 

Описание патента на изобретение RU2728497C1

ОБЛАСТЬ ТЕХНИКИ

Данное техническое решение относится к области вычислительной техники, а именно к способам и системам определения принадлежности программного обеспечения (ПО) к известному семейству ПО, а также принадлежности ПО той или иной группе авторов ПО.

УРОВЕНЬ ТЕХНИКИ

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

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

Поэтому в области кибербезопасности знание о том, что данный образец вредоносного ПО (ВПО) принадлежит к определенному семейству ВПО, как и знание о том, что данный образец ВПО создан определенным автором или группой авторов, может быть весьма важно.

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

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

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

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

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

"Stylometric Autorship Attribution in Collaborative Documents", Dauber et al., материалы International Conference on Cyber Security Cryptography and Machine Learning (CSCML) 2017, стр. 115-135,

"DECEPTION IN AUTHORSHIP ATTRIBUTION", S. Afroz, http://hdl.handle.net/1860/4431

«Текстовый анализатор», Александр Гранин, https://habr.com/ru/post/114186/

Программа «Определение авторства» компании NeoNeuro, https://neoneuro.com

Tools for Software Analysis and Forensic Engineering, S.A.F.E., https://www.safe-corp.com/index.htm

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

СУЩНОСТЬ ИЗОБРЕТЕНИЯ

В рамках настоящего описания, если это не оговорено непосредственно по месту применения, нижеперечисленные специальные термины используются в следующих значениях:

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

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

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

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

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

- получают файл, содержащий машинный код программного обеспечения;

- определяют формат полученного файла;

- извлекают и сохраняют код функций, присутствующих в полученном файле;

- удаляют из сохраненного кода функции, которые являются библиотечными;

- выделяют в каждой функции команды;

- выделяют в каждой команде пару «действие, аргумент»;

- преобразуют каждую пару «действие, аргумент» в целое число;

- сохраняют, отдельно для каждой выделенной функции, полученную последовательность чисел.

- накапливают заранее заданное количество результатов анализа машинного кода;

- выявляют в результатах анализа машинного кода повторяющиеся последовательности чисел (паттерны);

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

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

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

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

В другом частном варианте реализации способа после удаления библиотечных функций дополнительно удаляют из сохраненного кода устойчивые конструкции;

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

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

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

Еще в одном частном варианте реализации способа классификатор обучают методом машинного обучения.

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

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

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

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

Заявленное решение также осуществляется за счет системы определения принадлежности программного обеспечения по его машинному коду, содержащей:

- долговременную память, выполненную с возможностью хранения базы данных;

- вычислительное устройство, выполненное с возможностью выполнения описанного способа.

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

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

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

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

ОПИСАНИЕ ЧЕРТЕЖЕЙ

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

Фиг. 1 иллюстрирует компьютерно-реализуемый способ определения принадлежности программного обеспечения к определенному семейству программ по его машинному коду;

Фиг. 2 иллюстрирует шаги изготовления вспомогательной программы, используемой на одном из необязательных шагов обработки машинного кода.

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

Фиг. 4 иллюстрирует пример общей схемы компьютерного устройства.

ДЕТАЛЬНОЕ ОПИСАНИЕ ИЗОБРЕТЕНИЯ

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

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

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

Как представлено на Фиг. 1, заявленный компьютерно-реализуемый способ определения принадлежности программного обеспечения к определенному семейству программ по его машинному коду (100) реализован следующим образом:

На шаге (110) получают файл, содержащий машинный код программы, подлежащей анализу. Это может быть файл, содержащий скомпилированную программу, например, файл с расширением *.ехе, или динамическую библиотеку, например, файл с расширением *.dll.

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

На шаге (130) определяют, относится ли исследуемый файл к ВПО, а также зашифрован ли он, упакован ли архиватором, обфусцирован ли и т.д. Определение того, зашифрован ли файл, может выполняться любым общеизвестным способом, например, исчислением частичной энтропии: в том случае, если энтропия на протяжении значительной части файла превышает заранее определенный порог (например, более 6), файл считают зашифрованным.

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

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

Снятие дампов может выполняться любым известным способом, например, при помощи утилиты ProcDump.

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

В том случае, если исследуемый файл заведомо не относится к ВПО и не модифицирован средствами шифрования и обфускации, шаг (140) пропускают и переходят непосредственно к шагу (150).

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

На данном шаге код подвергается дизассемблированию; в результате по машинным кодам или операционным кодам восстанавливают функции, входящие в состав анализируемого ВПО. Дизассемблирование выполняют специализированной программой-дизассемблером, которая преобразует машинный, как в данном примере, или операционный код в набор инструкций на языке ассемблер или языке IL. Программа-дизассемблер может быть любой известной, например, IDA Pro, Sourcer или другой. В результате работы данной программы машинный код оказывается размечен: в нем явным образом выделены границы функций. Весь код, находящийся в выделенных дизассемблером границах функций, сохраняют, например, в виде отдельного файла, имеющего текстовый формат.Весь остальной (оставшийся за пределами этих границ) код в описываемом способе считается данными программы и в дальнейшем не используется.

Таким образом на шаге (150) получают и сохраняют в виде отдельного файла код всех функций, имеющихся в анализируемом ВПО.

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

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

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

На шаге (170) анализируют этот файл и из оставшихся функций удаляют устойчивые конструкции, то есть фрагменты кода, которые одинаково часто встречаются в любых программах, например, прологи функций. Это делают посредством заблаговременно изготовленной программы.

Изготовление названной программы (200) может быть выполнено, как это показано на Фиг. 2, следующим образом.

На шаге (210) отбирают достаточное количество, например, 100, экземпляров кода программ, заведомо различных по функциональности и по принадлежности определенным коллективам разработчиков.

На следующем шаге (220) обрабатывают отобранный массив кода алгоритмом, который выявляет повторяющиеся последовательности символов и подсчитывает количество вхождений данной последовательности символов в массиве кода. При этом задают минимальную длину последовательности, например, равной 20 символам, а максимальную длину последовательности не ограничивают. В альтернативном варианте воплощения задают как минимальную, так и максимальную длину последовательности, например, 15 и 250 символов соответственно.

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

Затем на шаге (230) из списка устойчивых последовательностей, возвращенного алгоритмом, отбирают наиболее частотные последовательности. Например, отбирают те последовательности, которые встречаются минимум один раз в каждой программе, т.е. в данном примере, такие, которые встретились 100 раз или больше.

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

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

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

По окончании шага (170) получают файл, в котором из функций, реализованных в анализируемом экземпляре ВПО, удалены устойчивые конструкции, то есть такие фрагменты кода, которые достаточно часто встречаются в любых, произвольно выбранных программах.

Затем переходят к показанному на Фиг. 1 шагу (180). На этом шаге анализируют файл, полученный на предыдущем шаге, и выделяют внутри каждой функции команды, а внутри каждой команды - действие и, возможно, аргумент.

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

Например, при дизассемблировании следующего фрагмента машинного кода

…D6 00 С7 05 3С 3F 42 00 00 00 01 00 FF FF 00…

программой IDA Pro будет выделена следующая команда:

mov dword_423F3C, 10000h

имеющая в машинном коде представление

С7 05 3C 3F42 00 00 00 01 00.

Из результатов дизассемблирования на данном шаге извлекают и сохраняют аргумент, который, в соответствии с синтаксисом ассемблера, приводится после запятой:

mov dword_423F3C, 10000h

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

Сами по себе команды, порожденные дизассемблером (в нашем примере это mov) для дальнейшего анализа не используют, поскольку они не обеспечивают однозначного соответствия анализируемому машинному коду; в частности, команде mov может соответствовать 15-17 различных по существу вариантов машинного кода.

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

Так, в данном примере скрипт будет выполнять следующие проверки:

является ли первый байт данного фрагмента кода одним из префиксов, определенных для архитектуры х86,

является ли первый байт индикатором двухбайтовой операции.

В данном примере обе проверки дали отрицательный результат, и скрипт продолжает разбор текущего фрагмента кода. Первый байт в этом фрагменте - C7h - скрипт, в соответствии со спецификацией архитектуры х86, интерпретирует как код операции, притом такой, полный вид которого необходимо уточнять в зависимости от содержимого следующего, то есть второго байта 05h. Из второго байта скрипт, в соответствии со спецификацией архитектуры х86, извлекает содержимое поля (reg):

05h=(mod)00 (reg)000 (r/m)101

которое добавляет к коду операции. Таким образом, код операции приобретает вид C7h 000b

и сохраняется, например, на той же строке в выходном текстовом файле, где уже хранится извлеченное ранее значение аргумента 10000h.

В соответствии со спецификацией архитектуры х86, для данного кода операции содержимое полей (mod) и (r/m) следующего байта указывает на то, что следующие 4 байта анализируемого фрагмента машинного кода - 3С 3F 42 00 - в данном случае используются для задания адреса команды в виде смещения относительно регистра DS. Адресную составляющую команды в описываемом способе не используют, поэтому следующие 4 байта машинной команды в данном примере игнорируют.

И наконец, последние четыре байта анализируемого фрагмента кода - 00 00 01 00 - в данном случае представляют собой аргумент, который уже был ранее извлечен из результатов дизасемблирования, 10000h. Поэтому дальнейший анализ кода данного фрагмента не выполняется.

В альтернативном варианте реализации описываемого способа, при котором аргумент не извлекают из результатов дизассемблирования, последние четыре байта анализируемого фрагмента - 00 00 01 00 - используют для извлечения аргумента. При этом их преобразуют с учетом того факта, что в архитектуре х86 для записи машинного кода применяется нотация little-endian ("от младшего к старшему"):

00 00 01 00 → 10000h.

Таким образом, в рассматриваемом примере из анализируемого фрагмента машинного кода С7 05 3C 3F 42 00 00 00 01 00

описанным преобразованием на шаге (180) получили и сохранили в файле с результатами следующую пару "действие - аргумент":

C7h 000b l0000h.

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

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

C7h 000b 10000h → 199 0 65536 → 199065536

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

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

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

F1=Р11, Р12, Р13, … P1j …, P1a

Fi=Pi1, Pi2, Pi3, … Pij …, Pib

Индексы a, b, с в данном случае указывают на тот факт, что в разных функциях в общем случае будет различное количество чисел (т.е. пар "действие - аргумент").

Как это показано на Фиг. 1, на следующем шаге (193) анализируют данные, полученные в ходе вышеописанного анализа машинного кода программы, принадлежность которой неизвестна. Все эти данные, преобразованные к виду (1), подаются на входы классификаторов, предварительно обученных на ВПО различных семейств или авторов.

Решение каждого классификатора представляет собой численную оценку вероятности того, что анализируемый образец ВПО принадлежит к тому семейству ВПО или той группе авторов, на массиве данных которого или которой был обучен классификатор. Эти решения постоянно обновляются, т.е. пересматривается при поступлении каждой порции данных вида (1).

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

Фиг. 3 иллюстрирует один из возможных способов обучения (300) классификаторов, используемых на шаге (193) в соответствии с Фиг. 1.

На шаге (310) получают очередной файл, содержащий машинный код программы. Общее количество таких файлов с машинным кодом определяют заранее. Например, для целей обучения могут быть отобраны по 30-70 файлов с машинным кодом для каждого семейства программ, принадлежность к которому необходимо научиться определять. Альтернативно, могут быть отобраны по 20-30 файлов с машинным кодом, авторство которого априори известно. Анализ отобранных файлов производят поочередно.

На шаге (320) определяют формат файла и выбирают соответствующее средство анализа кода. Определение формата быть выполнено любым известным способом, например, как это было описано выше применительно к шагу (120) на Фиг. 1.

На шаге (130) определяют, относится ли исследуемый файл к ВПО, а также зашифрован ли он, упакован ли архиватором, обфусцирован ли и т.д. Определение того, зашифрован или обфусцирован ли файл, может выполняться любым общеизвестным способом, как это было описано выше применительно к шагу (130) на Фиг. 1.

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

Аналогично тому, как это было описано применительно к шагу (140) на Фиг. 1, на шаге (340) получают дампы, то есть "отпечатки" рабочей памяти этих процессов, порожденных анализируемым файлом. Поскольку каждый дамп памяти представляет собой машинный код, располагающийся в памяти в момент снятия дампа, вышеописанным образом на шаге (350) получают машинный код исследуемой программы.

В том случае, если исследуемый файл заведомо не относится к ВПО и не модифицирован средствами шифрования и обфускации, шаг (340) пропускают и переходят непосредственно к шагу (350).

Далее на последовательно выполняемых шагах (360) и (370) удаляют из оставшегося кода функции, являющиеся библиотечными, а также устойчивые конструкции. Это может выполняться полностью аналогично описанному выше применительно к шагам (160) и (170) соответственно.

Затем на шаге (380) выделяют внутри каждой функции команды и операнды. Это может выполняться аналогично описанному выше применительно к шагу (180) на Фиг. 1. Затем на шаге (385) команды и операнды преобразуют в числа; это выполняют полностью аналогично тому, как было описано выше применительно к шагу (190).

На шаге (390) проверяют, достигнут ли конец множества файлов с машинным кодом, отобранных для обучения. Если нет, возвращаются к шагу (310). Таким образом система, реализующая способ, накапливает данные. В результате получают массив данных, сохраненных в файлах, где данные, полученные в ходе анализа каждой программы, имеют вид (1). Притом все программы, машинный код которых был проанализирован, принадлежат к одному, заранее известному семейству программ, либо, альтернативно, к одному автору или коллективу авторов программ.

Когда общее количество данных для данного семейства ПО или данной группы авторов превышает заранее заданный порог, накопленный на предыдущих шагах (310)…(385) массив данных на шаге (395) анализируют, выявляя паттерны. Этим термином в данном случае будем называть повторяющуюся последовательность чисел Pij, или, что то же самое, повторяющиеся последовательности команд, характерных для данного семейства ПО или группы авторов.

Длина паттерна, т.е. какое именно количество чисел, расположенных последовательно, будет считаться паттерном, выбирается заранее. В одном варианте реализации данного способа длина паттерна может быть задана интервалом, например, длина паттерна может быть от 4 до 10 или, альтернативно, от 60 до 80. В другом возможном варианте реализации длина паттерна может быть заранее задана фиксированной величиной, например, 40.

Еще в одном возможном варианте реализации длина паттерна может выбираться автоматически в зависимости от количества паттернов, выявляемых для данного массива данных (данного семейства программ). В этом варианте поиск паттернов начинается, например, при заданной длине 8. Если и когда количество выявленных паттернов превышает установленный при настройке системы порог (например, их найдено более 100), длину паттерна увеличивают на единицу и повторяют поиск, отбросив ранее найденные короткие паттерны. Такой цикл выполняется до тех пор, пока не будет найдено меньшее пороговой величины количество паттернов, имеющих максимально возможную длину.

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

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

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

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

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

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

Затем для каждого семейства программ, используя его коллекцию паттернов, на шаге (397) обучают экспертную систему (классификатор). Техническая реализация классификатора может быть любой общеизвестной; он может быть реализован, например, как графовая вероятностная модель (Random Forest) или как SVM-классификатор.

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

Ниже приведены дополнительные варианты реализации настоящего изобретения.

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

В другом частном варианте реализации способа после удаления библиотечных функций дополнительно удаляют из сохраненного кода устойчивые конструкции;

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

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

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

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

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

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

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

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

Заявленное решение также осуществляется за счет системы определения принадлежности программного обеспечения по его программному коду, содержащей:

- долговременную память, выполненную с возможностью хранения базы данных;

- вычислительное устройство, выполненное с возможностью выполнения описанного способа.

На Фиг. 4 далее будет представлена общая схема компьютерного устройства (400), обеспечивающего обработку данных, необходимую для реализации заявленного решения.

В общем случае устройство (400) содержит такие компоненты, как: один или более процессоров (401), по меньшей мере одну память (402), средство хранения данных (403), интерфейсы ввода/вывода (404), средство В/В (405), средства сетевого взаимодействия (406).

Процессор (401) устройства выполняет основные вычислительные операции, необходимые для функционирования устройства (400) или функциональности одного или более его компонентов. Процессор (401) исполняет необходимые машиночитаемые команды, содержащиеся в оперативной памяти (402).

Память (402), как правило, выполнена в виде ОЗУ и содержит необходимую программную логику, обеспечивающую требуемый функционал.

Средство хранения данных (403) может выполняться в виде HDD, SSD дисков, рейд массива, сетевого хранилища, флэш-памяти, оптических накопителей информации (CD, DVD, MD, Blue-Ray дисков) и т.п. Средство (403) позволяет выполнять долгосрочное хранение различного вида информации, например, вышеупомянутых файлов с машинным кодом, с наборами промежуточных данных, с вычисленными последовательностями и т.п.

Интерфейсы (404) представляют собой стандартные средства для подключения и работы с серверной частью, например, USB, RS232, RJ45, LPT, COM, HDMI, PS/2, Lightning, FireWire и т.п.

Выбор интерфейсов (404) зависит от конкретного исполнения устройства (400), которое может представлять собой персональный компьютер, мейнфрейм, сервер, серверный кластер, тонкий клиент, смартфон, ноутбук и т.п.

В качестве средств В/В данных (405) может использоваться клавиатура. Аппаратное исполнение клавиатуры может быть любым известным: это может быть, как встроенная клавиатура, используемая на ноутбуке или нетбуке, так и обособленное устройство, подключенное к настольному компьютеру, серверу или иному компьютерному устройству. Подключение при этом может быть, как проводным, при котором соединительный кабель клавиатуры подключен к порту PS/2 или USB, расположенному на системном блоке настольного компьютера, так и беспроводным, при котором клавиатура осуществляет обмен данными по каналу беспроводной связи, например, радиоканалу, с базовой станцией, которая, в свою очередь, непосредственно подключена к системному блоку, например, к одному из USB-портов. Помимо клавиатуры, в составе средств В/В данных также может использоваться: джойстик, дисплей (сенсорный дисплей), проектор, тачпад, манипулятор мышь, трекбол, световое перо, динамики, микрофон и т.п.

Средства сетевого взаимодействия (406) выбираются из устройства, обеспечивающий сетевой прием и передачу данных, например, Ethernet карту, WLAN/Wi-Fi модуль, Bluetooth модуль, BLE модуль, NFC модуль, IrDa, RFID модуль, GSM модем и т.п. С помощью средств (405) обеспечивается организация обмена данными по проводному или беспроводному каналу передачи данных, например, WAN, PAN, ЛВС (LAN), Интранет, Интернет, WLAN, WMAN или GSM.

Компоненты устройства (400) сопряжены посредством общей шины передачи данных (410).

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

Похожие патенты RU2728497C1

название год авторы номер документа
СПОСОБ И СИСТЕМА ОПРЕДЕЛЕНИЯ ПРИНАДЛЕЖНОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ПО ЕГО ИСХОДНОМУ КОДУ 2019
  • Слипенчук Павел Владимирович
  • Померанцев Илья Сергеевич
RU2728498C1
СПОСОБ И СИСТЕМА КЛАСТЕРИЗАЦИИ ИСПОЛНЯЕМЫХ ФАЙЛОВ 2021
  • Померанцев Илья Сергеевич
RU2778979C1
СПОСОБ И СИСТЕМА ГЕНЕРАЦИИ СПИСКА ИНДИКАТОРОВ КОМПРОМЕТАЦИИ 2020
  • Померанцев Илья Сергеевич
RU2743619C1
СПОСОБ И СИСТЕМА ПОИСКА СХОЖИХ ВРЕДОНОСНЫХ ПРОГРАММ ПО РЕЗУЛЬТАТАМ ИХ ДИНАМИЧЕСКОГО АНАЛИЗА 2020
  • Прудковский Николай Сергеевич
  • Волков Дмитрий Александрович
RU2738344C1
СИСТЕМА И СПОСОБ СРАВНЕНИЯ ФАЙЛОВ НА ОСНОВЕ ШАБЛОНОВ ФУНКЦИОНАЛЬНОСТИ 2009
  • Василенко Роман Сергеевич
RU2427890C2
СПОСОБ И СИСТЕМА СТАТИЧЕСКОГО АНАЛИЗА ИСПОЛНЯЕМЫХ ФАЙЛОВ НА ОСНОВЕ ПРЕДИКТИВНЫХ МОДЕЛЕЙ 2020
  • Прудковский Николай Сергеевич
RU2759087C1
Способ противодействия вредоносному программному обеспечению (ВПО) путем имитации проверочной среды 2020
  • Брызгин Андрей Александрович
  • Супрунюк Павел Михайлович
RU2748518C1
Система и способ обнаружения вредоносных файлов на мобильных устройствах 2015
  • Кивва Антон Андреевич
  • Бучка Никита Александрович
  • Кузин Михаил Юрьевич
  • Чебышев Виктор Владимирович
RU2614557C2
Система и способ обнаружения вредоносного кода в файле 2016
  • Головкин Максим Юрьевич
  • Монастырский Алексей Владимирович
  • Пинтийский Владислав Валерьевич
  • Павлющик Михаил Александрович
  • Бутузов Виталий Владимирович
  • Карасовский Дмитрий Валериевич
RU2637997C1
Способ выявления вредоносных файлов с использованием графа связей 2023
  • Когтенков Алексей Александрович
  • Романенко Алексей Михайлович
  • Антонов Алексей Евгеньевич
RU2823749C1

Иллюстрации к изобретению RU 2 728 497 C1

Реферат патента 2020 года СПОСОБ И СИСТЕМА ОПРЕДЕЛЕНИЯ ПРИНАДЛЕЖНОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ПО ЕГО МАШИННОМУ КОДУ

Изобретение относится к вычислительной технике. Технический результат заключается в обеспечении автоматической идентификации программного обеспечения (ПО) по последовательности выполняемых им машинных команд. Способ определения принадлежности ПО к определенному семейству программ по его машинному коду, в котором получают файл, содержащий машинный код ПО; определяют формат полученного файла; извлекают и сохраняют код функций, присутствующих в полученном файле; удаляют из сохраненного кода функции, которые являются библиотечными; выделяют в каждой функции команды; выделяют в каждой команде пару «действие, аргумент»; преобразуют каждую пару «действие, аргумент» в число; сохраняют, отдельно для каждой выделенной функции, полученные упорядоченные последовательности чисел; накапливают заранее заданное количество результатов анализа машинного кода и выявляют в них повторяющиеся последовательности чисел (паттерны); для каждого выявленного паттерна вычисляют параметр, характеризующий его частотность; на основе вычисленного набора параметров обучают классификатор определять принадлежность ПО по последовательности пар «действие, аргумент»; применяют обученный классификатор для последующего определения принадлежности ПО к определенному семейству программ. 2 н. и 10 з.п. ф-лы, 4 ил.

Формула изобретения RU 2 728 497 C1

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

- получают файл, содержащий машинный код программного обеспечения;

- определяют формат полученного файла;

- извлекают и сохраняют код функций, присутствующих в полученном файле;

- удаляют из сохраненного кода функции, которые являются библиотечными;

- выделяют в каждой функции команды;

- выделяют в каждой команде пару «действие, аргумент»;

- преобразуют каждую пару «действие, аргумент» в число;

- сохраняют, отдельно для каждой выделенной функции, полученные упорядоченные последовательности чисел;

- накапливают заранее заданное количество результатов анализа машинного кода;

- выявляют в результатах анализа машинного кода повторяющиеся последовательности чисел (паттерны);

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

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

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

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

3. Способ по п. 1, в котором после удаления библиотечных функций дополнительно удаляют из сохраненного кода устойчивые конструкции.

4. Способ по п. 1, в котором дополнительно определяют принадлежность программы определенному заранее известному разработчику программ или коллективу разработчиков программ.

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

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

7. Способ по п. 1, характеризующийся тем, что обучают классификатор методом машинного обучения.

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

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

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

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

12. Система определения принадлежности программного обеспечения к определенному семейству программ по его машинному коду, содержащая:

- долговременную память, выполненную с возможностью хранения используемых файлов и данных;

- вычислительное устройство, выполненное с возможностью выполнения способа по любому из пп. 1-11.

Документы, цитированные в отчете о поиске Патент 2020 года RU2728497C1

CN 103020494 B, 24.06.2015
Станок для изготовления деревянных ниточных катушек из цилиндрических, снабженных осевым отверстием, заготовок 1923
  • Григорьев П.Н.
SU2008A1
US 7383581 B1, 03.06.2008
Устройство для закрепления лыж на раме мотоциклов и велосипедов взамен переднего колеса 1924
  • Шапошников Н.П.
SU2015A1
Система и способ выявления вредоносных файлов с использованием модели обучения, обученной на одном вредоносном файле 2018
  • Прокудин Сергей Викторович
  • Романенко Алексей Михайлович
RU2706896C1

RU 2 728 497 C1

Авторы

Слипенчук Павел Владимирович

Померанцев Илья Сергеевич

Даты

2020-07-29Публикация

2019-12-05Подача