У вас есть основная идея: у вас есть partially-evaluate программа и прекомпопуйте все постоянные вычисления. В вашем случае постоянными вычислениями, представляющими основной интерес, являются шаги конкатенации по значениям, которые не изменяются.
Для этого вам понадобится program transformation system (PTS). Это инструмент, который будет считывать/анализировать исходный код для указанного языка и строить абстрактное синтаксическое дерево, позволяя вам определять преобразования и анализы по AST, и запускать их, а затем снова выливать модифицированный AST в качестве исходного кода.
В вашем случае вы, очевидно, хотите, чтобы PTS был подключен, чтобы знать JavaScript из коробки (редко) или готов принять описание JavaScript, а затем прочитать JavaScript (более типичный) с надеждой на то, что вы можете создать или легко получить описание JavaScript. [Я создаю PTS, где есть описания JavaScript, см. Мою биографию].
С, что в руках, вам нужно:
- код анализатор, который проверяет каждую переменную найденную в выражении, чтобы увидеть, если это выражение является постоянным (например, «WF6»). Чтобы продемонстрировать, что он постоянный, вам нужно найти определение переменной и проверить, что все значения, используемые в определении переменной, сами являются константами. Если существует более одного определения переменной, вам может потребоваться проверить, что все определения производят одно и то же значение. Вам нужно проверить наличие побочных эффектов на переменную (например, нет вызовов функций «foo (..., wf6, ...)», которые позволяли бы изменять значение переменной). Вам нужно беспокоиться о том, существует ли команда eval для достижения такого побочного эффекта [это практически невозможно сделать, поэтому вам часто приходится просто игнорировать оценки и предполагать, что они не делают таких вещей]. Многие ПТС будут иметь возможность позволить вам создавать такие анализаторы; некоторые из них легче других.
- Для каждой переменной с постоянной величиной подставьте значение этой переменной в код
- Для каждого константнозначного подвыражения после таких подстановок «сверните» (вычислите) результат этого выражения и замените это значение для этого подвыражение и повторение до тех пор, пока не будет больше сгибания. Очевидно, вы хотите сделать это, по крайней мере, для всех операторов «+».[OP только что изменил свой пример; он захочет сделать это для операторов «eval», когда все его операнды будут постоянными].
- Вы, возможно, придется повторять этот процесс, так как складной выражение может сделать это очевидным, что переменная теперь имеет постоянное значение
Описанный выше процесс называется «постоянная распространения» в литературе компилятора и является функцией многих компиляторов.
В вашем случае вы можете ограничить постоянное складывание только строковыми конкатенациями. Однако, как только у вас будет достаточный механизм для постоянного распространения значений, делать все или большинство операторов по константам не так сложно. Вам может понадобиться это, чтобы отменить другие запутывания, связанные с константами, так как кажется стилем обфускации, используемым в коде, над которым вы работаете.
Вам нужно специальное правило, которое трансформирует
var['string'](args)
в
var.string(args)
как последний шаг.
У вас есть еще одно осложнение: это означает, что у вас есть все JavaScript, связанные с созданием константных переменных. На одной веб-странице может быть много включенных фрагментов JavaScript; вам понадобятся все они, чтобы продемонстрировать отсутствие побочных эффектов для переменной. Я предполагаю, что в вашем случае вы уверены, что у вас есть все.
Что касается получения значений известных констант, возможно, вы беспокоитесь о сложном случае: выражении, которое создает постоянные значения из непостоянных операндов. Представьте себе, затемненное выражение было:
x=random(); // produce a value between 0 and 1
one=x+(1-x); // not constant by constant propagation, but constant by algebraic relations
teststring['st'[one]+'vu'[one+1]+'bz'[one]+...](4,11)
Вы можете видеть, что всегда вычисляет «подстроки» как свойство. Вы можете добавить правило преобразования, которое понимает трюк, используемый для вычисления «одного», например, правила для каждого алгебраического трюка, используемого для вычисления известных констант. К сожалению, для вас существует бесконечное число теорем алгебры, которые можно использовать для изготовления констант; сколько из них действительно используется в вашем примере кода? [Добро пожаловать в проблему обратной инженерии с умным противником].
Нет, ни один из этих «легких». Предположительно именно поэтому был выбран метод обфускации .
Вы можете связаться с инструментом, который вы написали? Могут ли это делать то, что здесь задают? – Bergi
Если вы можете выполнить анализ констант вручную (что обычно просто, поскольку обфускаторы в основном используют только константы), вы можете часто выполнять «оценку» вручную [делать регулярные выражения в коде] (http: // stackoverflow. com/q/30879056/1048572) – Bergi
@Bergi: Инструмент называется «Инструментом для реинжиниринга программного обеспечения DMS». См. Http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html –