passes: add mba scheme to Constants (and+or+add identity)

(a&b)+(a|b) = a+b, documented honestly: falls to the same symbolic
evaluator as xor/add/shift (every sub-expression is a foldable
LDC,LDC,BINOP triple), but defeats a pattern matcher hardcoded to one
opcode ("ldc,ldc,ixor = split constant"). Added to ConstantsConfig
default schemes.

Tests: mba_form_uses_and_or_add_not_a_single_binop, round-trip coverage
in int_forms_round_trip/long_forms_keep_shape.
This commit is contained in:
Loki 2026-10-14 01:30:10 +02:00
parent 550f62e473
commit 2b19ed6096
Signed by: boba
GPG key ID: 253067914055423B
4 changed files with 133 additions and 10 deletions

View file

@ -82,8 +82,14 @@ opaque-предикаты - условия, истинность которых
- Шаблонный opaque-предикат (всегда один и тот же `A+B`) узнаётся
паттерном - отсюда требование нескольких схем.
**Статус: готово** для `int`/`long` (`xor`/`add`/`shift` + opaque-предикаты);
`float`/`double` не трогаются.
**Статус: готово** для `int`/`long` (`xor`/`add`/`shift`/`mba` +
opaque-предикаты); `float`/`double` не трогаются. `mba` (`(a&b)+(a|b)=a+b`,
13.10.2026) не ломает честную оговорку выше - он раскрывается тем же
символьным вычислителем, что и `xor`/`add`/`shift`. Разница в том, что
бьёт: `xor`/`add` сворачиваются одним паттерном «два литерала + одна
операция»; `mba` требует опознать саму тождество `and+or+add`, а не просто
свернуть литералы - отсекает деобфускаторы с жёстко вшитым паттерном на
один опкод, но не символьные вычислители.
## 4. Обфускация контрольного потока (`Flow`)