Нарушение лексического контекста для предотвращения поиска всех ссылок - PullRequest
0 голосов
/ 02 мая 2020

Помимо методов преобразования текста в код, таких как eval / Function, или добавления дополнительных сценариев, существуют ли еще способы скрыть лексическую область видимости, которая аннулирует базовый c лексический поиск для объявления идентификатора и все ссылки?

Это связано, например, с «переименованием» vs-кода (по умолчанию F2), точнее, с реализацией аналогичной функциональности. Другими словами, локальное наблюдение за фрагментом из более крупной программы и переименование идентификатора - не в обычной ситуации «наилучшей практики», а в том, что обфускатор намеренно пытается саботировать вас.

Пример проблемного c случай с eval будет следующим:

function f() {
  try { v; } catch(_) { console.log("weewoo"); }
}
{
  let v = 1;
  function g() {
    v; // entering here, trying to rename this "v"
  }
  eval(`(${f.toString()})()`);
}

В vs-коде переименование помеченного v семантически изменит код, который может быть обнаружен.

Если есть eval / Function не должно использоваться во всем коде, и несомненно, что никакой дополнительный код не загружается, всегда ли лексическое переименование безопасно? Есть ли еще такие подводные камни?


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

  • , используя тот факт, что глобальные переменные области видимости добавляются в глобальный объект:

    var v = 1;
    v; // renaming here
    if (!window[String.fromCharCode(118)])
      console.log("weewoo");
    
  • устаревший оператор строгого режима with (который vs-code обнаруживает!):

    var v = 0;
    with({ v: 1 }) {
      v; // renaming here
      if (!v) console.log("weewoo");
    }
    
...