Поделиться через


Переименование с использованием метода индукции перегрузки

ms227210.ce(ru-ru,VS.90).jpgms227210.pro(ru-ru,VS.90).jpg В средстве Dotfuscator использована патентованная технология для переименования под названием «индукция перегрузки» (Overload-Induction™). В то время как большинство других систем переименования выполняют обычную замену каждого старого имени на новое (то есть, getX() заменяется на a(), getY() заменяется на b()), метод индукции перегрузки максимально использует возможности перегрузки. Исходная идея состоит в том, что алгоритм выполняет присвоение одинакового имени как можно большему числу методов. Значительная часть пользователей сообщает о замене 33% имен всех методов на имя a(). Во всех этих случаях это целых 33% методов, которые можно переименовать подобным образом. Термин «можно переименовать» используется в связи с тем, что многие методы не могут быть переименованы. Сюда входят конструкторы, конструкторы классов и методы, которые вызываются во время выполнения.

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

Оригинальный исходный код до запутывания
private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}
Декомпилированный исходный код после использования индукции перегрузки
private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

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

Данная методика имеет ряд явных преимуществ.

  1. Переименование долгое время являлось способом для внесения неопределенности в декомпилированный код. Использование при переименовании непечатных символов (или имен, которые не соответствуют стандартам исходного языка) не имеет смысла, поскольку декомпиляторы имеют средства для переименования таких идентификаторов. Принимая во внимание тот факт, что в результате использования метода индукции перегрузки три разных метода будут носить одинаковое имя a(), анализ декомпилированного кода, по меньшей мере, представляет собой довольно сложную задачу.
  2. Метод индукции перегрузки не имеет ограничений, которые есть в других системах переименования. (Такие ограничения будут рассмотрены позже.)
  3. Поскольку метод индукции перегрузки стремится использовать один и тот же символ как можно чаще, длинные имена появляются значительно позже (например, aa, aaa и т.д.). Это также способствует экономии места.

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

© 2002-2007 PreEmptive Solutions. Все права защищены.