Деобфусцированный JavaScript с помощью машинного обучения


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

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

Возможность отменить минификацию была бы действительно полезной, но обфускация — это другое дело. Большая проблема с интерпретируемым или JIT-кодом заключается в том, что вы должны предоставить исходный код или что-то очень близкое к исходному коду во внешний мир. В случае с JavaScript нет возможности сохранить исходный код при себе, и обфускация — ваша единственная надежда скрыть его. Обфускация переводит минификацию на следующий этап. Он не только удаляет все вещи, которые делают код понятным для человека, но даже изменяет поток управления для создания спагетти-кода, за которым очень трудно следовать. В этом случае возможность отменить обфускацию — это то, что вы не приветствовали бы, но почти все остальные!
Первый шаг в деобфускации или разминировании прост — вы просто восстанавливаете некоторое форматирование — разрывы строк, пробелы и отступы. Большая проблема — восстановить имена переменных. Возможно, вы назвали переменную totalCost, но после преобразования она принимает вид A1 или что-то подобное.
Как можно восстановить значимое имя?
Ясно, что люди могут это сделать. Мы читаем программу и видим, что переменная используется определенным образом и откуда она получает свое значение, и в конечном итоге мы можем догадаться, что ее следует назвать чем-то вроде totalCost. Может ли это быть сделано с помощью машины?
JSNice — это механизм статистической деобфускации и деминификации для JavaScript, созданный Лабораторией надежности программного обеспечения в ETH Zurich. Вы даете JSNice программу, и она дает вам удобочитаемую версию. Он работает, определяя тип переменной, а затем используя машинное обучение на основе 10 000 проектов JavaScript из GitHub, чтобы определить, для чего используется переменная, и, следовательно, возможное имя. Он определяет вероятность имени для каждой переменной и применяет наиболее вероятное. Вы также можете попросить показать раскрывающийся список других возможных имен, из которых вы можете выбрать, если он ошибается.

Авторы заявляют, что для предложенных идентификаторов вероятность успеха составляет 60%, что помогает понять, что делает код, и найти хорошие имена для оставшихся 40%.
Также предлагается использовать его для улучшения вашего собственного кода, заставляя его выполнять анализ в удобочитаемой форме и видеть, какие имена переменных он предлагает. Лично я был бы немного расстроен, обнаружив, что статистический метод может называть мои переменные лучше, чем я, но я попытался бы проглотить свою гордость.
Вывод имен переменных на основании того, как они используются, кажется интересным методом, который может иметь дополнительные применения. На данный момент мало подробностей о том, как работает машинное обучение, например, какие функции оно использует. Также существует вероятность того, что из корпуса программ JavaScript на GitHub можно будет узнать гораздо больше — функции, стандартные блоки кода, алгоритмы и так далее.
Делает ли это обфускацию бесполезной?
Простой ответ — нет, потому что есть разница между тем, чтобы дать миру посмотреть на свою работу, и заставить их работать на нее. Всегда есть простой момент: обфускация — это гонка вооружений. Как только вы узнаете, что JSNice может отменить, вам будет достаточно легко скрыть шаблоны кода, которые он использует для присвоения имен переменным. Вы даже можете изменить подпись, чтобы totalCost был переименован во что-то совершенно вводящее в заблуждение.


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