Идентификация программистов из исполняемых двоичных файлов


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

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

Для исследования был взят код 600 программистов из ежегодного конкурса программистов Google Code Jam. Мастерство программиста измерялось тем, насколько далеко они продвинулись в соревновании. Все образцы кода, написанные на C ++, пытались решить одну и ту же программную задачу, и, следовательно, основные различия между кодом, возможно, можно отнести, помимо прочего, к стилю кодирования.

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

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

Когда этот подход был опробован на большом наборе данных, 600 программистов, точность упала до 52%. Также было продемонстрировано, что для неоптимизированной компиляции 100 программистов точность составила 78%, но при использовании оптимизирующего компилятора точность упала до 64%. Вы можете ожидать, что оптимизирующий компилятор удалит из двоичного файла еще больше личных качеств программиста.

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

Если вы хотите получить более подробную информацию, не читая бумагу, это видео должно помочь:

Так все это имеет значение?

Помимо интересных результатов, что индивидуальный стиль развивается с опытом и переживает многие преобразования в машинный код, существует также вопрос судебной экспертизы. Если вы планируете написать какое-либо вредоносное ПО, убедитесь, что вы не оставили скомпилированный код там, где он может быть использован для вашей идентификации. Точно так же идентификация программиста может быть полезна в спорах о том, кто чем занимается в успешной компании. Можно ли использовать стиль кода для ответа на такие вопросы, как «остались ли в Facebook какие-либо блоки кода, написанные Марком Цукербергом?» и доказать, кем был Сатоши Накамото, анонимный изобретатель Биткойна? Наверное, не на практике.

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

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

Ясно, что было бы интересно еще поработать.


Добавить комментарий