Я изучал обфускацию имен и недавно прочитал кое-что о шифровании строк.
В защите от обфускации и оболочке шифрования имеются функции защиты от шифрования строк.
Вообще говоря, шифрование строк можно разделить на две категории:
Первая категория — это технология шифрования строк в защите от обфускации. Основная особенность — изменение пути выполнения кода.
Шифрование строк, используемое большинством инструментов защиты от обфускации, попадает в эту категорию.
Вторая категория — это технология шифрования строк в шифровальных оболочках. Этот метод напрямую шифрует строку в метаданных, не изменяя IL-код.
Эту категорию представляют компании Remotesoft и Maxtocode.
Давайте сначала рассмотрим первую категорию. Реализация шифрования примерно следующая.
До шифрования:
MessageBox.Show("Привет, мир!");
После шифрования:
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
Проще говоря, там, где изначально использовались строки, прямое использование строк меняется на косвенное использование строк.
Здесь программа защиты шифрует строку «Hello World!» и получает результат «A34579dfbbeyu346563345/==".
Helper.Decode — это функция дешифрования, предоставляемая защитным программным обеспечением, которая восстанавливает «A34579dfbbeyu346563345/==" до «Hellow World!».
Поскольку это защита от обфускации, мы можем проанализировать и получить декодированный код. Затем непосредственно используйте код этой функции, чтобы написать небольшой инструмент для восстановления всех зашифрованных строк в сборке. Создайте таблицу соответствия строк. Для облегчения чтения и отладки кода.
Если копнуть глубже, то можно автоматически восстановить строку до исходной сборки.
Давайте посмотрим на IL-код приведенного выше примера.
До шифрования:
ldstr «Привет, мир!»
вызовите MessageBox.Show(string)
после шифрования:
ldstr "A34579dfbbeyu346563345/=="
строка вызова Helper.Decode(строка)
вызов MessageBox.Show(string)
на самом деле очень просто. Мы уже знаем код декодирования и уже можем расшифровать строку. Получается соответствующая таблица строк.
Непосредственно измените
ldstr "A34579dfbbeyu346563345/=="
строка вызова Helper.Decode(строка)
замените его на
ldstr «Hellow World»
. Просто напишите небольшой инструмент, который использует регулярные выражения для поиска и замены.
Второй тип защиты строкового шифрования:
Реализация заключается в прямом шифровании потока String в метаданных.
У этого типа защиты есть недостаток. После запуска программы поток String в метаданных будет расшифрован и полностью восстановлен в памяти. В своей предыдущей статье я представил дамп метаданных. Я не буду повторять это здесь.
Для первого типа защиты шифрования строк существуют и другие формы. Например, функция Helper.Decode может быть встроенной функцией.
Или это смешано с процессом.