
Reconstrucción de Aritmética Basada en Coeficientes — un simplificador de expresiones de Aritmética Booleana Mixta (MBA) para desofuscación
Reconstrucción Aritmética Basada en Coeficientes — un simplificador de expresiones booleanas-aritméticas mixtas.
CoBRA desofusca expresiones que intercalan operaciones aritméticas (+, -, *) con operaciones bit a bit (&, |, ^, ~) y desplazamiento (<<, >>) — una técnica comúnmente usada en ofuscación de software.
$ cobra-cli --mba "(x&y)+(x|y)"
x + y
$ cobra-cli --mba "((a^b)|(a^c)) + 65469 * ~((a&(b&c))) + 65470 * (a&(b&c))" --bitwidth 16
67 + (a | b | c)
$ cobra-cli --mba "((a^b)&c) | ((a&b)^c)"
c ^ a & b
$ cobra-cli --mba "(x&0xFF)+(x&0xFF00)" --bitwidth 16
x
$ cobra-cli --mba "(x ^ 0x10) + 2 * (x & 0x10)"
16 + x
$ cobra-cli --mba "x << 3"
8 * x
$ cobra-cli --mba "~x"
~x
$ cobra-cli --mba "(x^y)*(x&y) + 3*(x|y)"
(x ^ y) * (x & y) + 3 * (x | y)
$ cobra-cli --mba '-357*(x&~y)*(x&y)+102*(x&~y)*(x&~y)+374*(x&~y)*~(x^y)
-306*(x&~y)*~(x|y)-17*(x&~y)*~(x|~y)-105*~(x|~y)*(x&y)+30*~(x|~y)*(x&~y)
+110*~(x|~y)*~(x^y)-90*~(x|~y)*~(x|y)-5*~(x|~y)*~(x|~y)+34*(x&~y)*~x
-85*(x&~y)*~y+10*~(x|~y)*~x-25*~(x|~y)*~y'
22 * (x & y) + -17 * x + -5 * y
CoBRA utiliza un orquestador basado en listas de trabajo para simplificar expresiones. Cada entrada ingresa a la lista de trabajo como un elemento etiquetado con un tipo de estado. Un planificador selecciona el siguiente pase a ejecutar según el estado del elemento, las dependencias previas y una caché de intentos que evita trabajo redundante.
36 pases discretos se organizan en familias: procesamiento de AST, técnicas basadas en firmas, técnicas semilineales, descomposición y elevación. Algunos pases generan alternativas locales o soluciones hijas que se resuelven mediante grupos de competencia; fuera de esos grupos, la lista de trabajo devuelve el primer candidato de nivel superior completamente verificado. Todos los resultados se verifican mediante comprobaciones aleatorias (por defecto) o prueba de equivalencia Z3 (--verify).
Expresión de entrada
|
[Planificador de lista de trabajo]
|
Los elementos fluyen a través de tipos de estado:
|
kFoldedAst ──> Pases de procesamiento de AST
| (clasificar, reducir, reescribir)
|
+──> kSignatureState ──> Técnicas de firma
| (coincidencia de patrones, CoB, ANF, recuperación polinómica)
|
+──> kSemilinearNormalizedIr ──> Técnicas semilineales
| (normalizar, recuperar estructura, refinar, reconstruir)
|
+──> kCoreCandidate / kRemainderState ──> Descomposición
| (extraer núcleo, clasificar residual, resolver)
|
+──> kLiftedSkeleton ──> Elevación
| (sustitución de variable virtual, resolución externa)
|
+──> kCandidateExpr ──> Verificación
(comprobación aleatoria o prueba Z3)
|
Expresión simplificada
Técnicas basadas en firmas: evalúan la expresión en todas las entradas booleanas para obtener un vector de firma. Una transformación mariposa CoB recupera los coeficientes de la base de productos Y. La coincidencia de patrones, ANF y la recuperación polinómica manejan diferentes niveles de complejidad.
Técnicas semilineales: manejan expresiones con máscaras constantes (ej., x & 0xFF). La expresión se descompone en átomos bit a bit ponderados; luego, la recuperación de estructura y el refinamiento de términos simplifican la representación intermedia, y el ensamblado OR particionado por bits reconstruye el resultado final.
Descomposición: apunta a expresiones mixtas con productos de subexpresiones bit a bit. Se extrae un núcleo polinómico, luego se clasifican y resuelven los residuales (polinómico, booleano-nulo/fantasma o respaldo por plantilla).
Elevación: reemplaza subexpresiones complejas con variables virtuales, resuelve el esqueleto externo simplificado y luego sustituye hacia atrás.
k * f(vars) + c con descomposición de Shannon para expresiones booleanas de 4-5 variables<< se desazucara a multiplicación, >> se simplifica mediante técnicas semilinealesConsulte BUILD.md para obtener detalles completos, incluyendo dependencias opcionales (LLVM, Z3).
# Dependencias de compilación (Abseil, Highway; opcionalmente GoogleTest, LLVM, Z3)
cmake -S dependencies -B build-deps -DCMAKE_BUILD_TYPE=Release
cmake --build build-deps
# Compilar CoBRA
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCMAKE_BUILD_TYPE=Release
cmake --build build
# (Opcional) Compilar y ejecutar pruebas
cmake -S dependencies -B build-deps -DCMAKE_BUILD_TYPE=Release -DCOBRA_BUILD_TESTS=ON
cmake --build build-deps
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCMAKE_BUILD_TYPE=Release \
-DCOBRA_BUILD_TESTS=ON
cmake --build build
ctest --test-dir build --output-on-failure
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCOBRA_BUILD_LLVM_PASS=ON \
-DCMAKE_BUILD_TYPE=Release
cmake --build build
# Simplificación básica
cobra-cli --mba "(x&y)+(x|y)"
# Especificar anchura de bits
cobra-cli --mba "(x&0xFF)+(x&0xFF00)" --bitwidth 16
# Habilitar verificación de equivalencia Z3
cobra-cli --mba "(a^b)+(a&b)+(a&b)" --verify
# Salida verbose (mostrar pasos intermedios de la tubería)
cobra-cli --mba "(x&y)+(x|y)" --verbose
| Bandera | Por defecto | Descripción |
|---|---|---|
--mba <expr> | Expresión a simplificar | |
--bitwidth <n> | 64 | Anchura de la aritmética modular (1-64) |
--max-vars <n> | 16 | Número máximo de variables |
--verify | desactivado | Comprobación de equivalencia Z3 |
--verbose | desactivado | Mostrar internos de la tubería |