
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
lib/core/ Motor de simplificación principal (~50 archivos fuente)
Orchestrator Planificador de lista de trabajo, máquina de estados, bucle principal de simplificación
OrchestratorPasses Registro de 39 pases con planificación consciente del DAG
CompetitionGroup Carrera de múltiples técnicas y selección de ganador
ContinuationTypes Datos de recombinación diferida para composición de pases
JoinState Seguimiento de unión de múltiples operandos para reescrituras estructurales
SignatureSimplifier Técnicas basadas en firmas (CoB, coincidencia de patrones, ANF)
SignatureVector Evaluar expresión en entradas {0,1}^n
AuxVarEliminator Reducir número de variables detectando cancelaciones
PatternMatcher Reconocer patrones bit a bit (tablas 2-var/3-var, escaladas)
CoeffInterpolator Interpolación mariposa para recuperación de coeficientes
CoBExprBuilder Reconstruir expresiones a partir de coeficientes CoB
AnfTransform Conversión a Forma Normal Algebraica
AnfCleanup Absorción, factorización, reconocimiento de OR
CoefficientSplitter Separar contribuciones bit a bit vs. aritméticas
ArithmeticLowering Reducir fragmento aritmético a IR polinómico
PolyNormalizer Forma canónica para expresiones polinómicas
SingletonPowerRecovery Detectar términos x^k mediante diferencias finitas
DecompositionEngine Bucle extrae-resuelve: núcleo polinómico + resolución de residuales
GhostBasis Biblioteca de primitivas fantasma (mul_sub_and, mul3_sub_and3)
GhostResidualSolver Clasificación booleana-nula y resolución de residuales fantasma
WeightedPolyFit Ajuste lineal ponderado 2-ádico para cocientes polinómicos
MixedProductRewriter Expandir productos bit a bit en sumas lineales
TemplateDecomposer Coincidencia de plantillas acotada para expresiones mixtas
ProductIdentityRecoverer Recuperar identidades de suma de productos
SemilinearNormalizer Descomponer en átomos bit a bit ponderados
SemilinearSignature Evaluación de firma por bit y atajo lineal
StructureRecovery Recuperación de XOR, eliminación de máscaras, coalescencia de términos
TermRefiner Reducción de máscaras de bits muertos, fusión de mismo coeficiente
BitPartitioner Agrupar posiciones de bits por perfil semántico
MaskedAtomReconstructor Reensamblaje con reescritura OR para máscaras disjuntas
Evaluator Evaluador de expresiones compilado
lib/llvm/ Plugin de pase LLVM (CobraPass, MBADetector, IRReconstructor)
lib/verify/ Verificación de equivalencia basada en Z3
include/cobra/ Cabeceras públicas
tools/cobra-cli/ Interfaz de línea de comandos y analizador de expresiones
test/ 1195 pruebas en ~63 archivos de prueba
CoBRA tiene 1195 pruebas que cubren benchmarks unitarios, de integración y de conjuntos de datos:
# Ejecutar todas las pruebas
ctest --test-dir build --output-on-failure
# Ejecutar un conjunto de pruebas específico
ctest --test-dir build -R test_simplifier --output-on-failure
# Ejecutar con salida detallada
ctest --test-dir build -V
Los benchmarks de conjuntos de datos validan contra expresiones ofuscadas del mundo real de múltiples fuentes independientes. Consulte DATASETS.md para el informe completo de benchmarks: 75,126 expresiones en 35 archivos de conjunto de datos de 7 fuentes independientes.
{0,1} pero incorrectos a ancho completo (base de productos Y vs. multiplicación aritmética). Estos se detectan y se informan correctamente como fallos de verificaciónGracias a Bas Zweers y al equipo de Back Engineering por la inspiración y guía que ayudaron a dar forma a este proyecto. Visualización recomendada: su charla re//verse 2026 Deobfuscation of a Real World Binary Obfuscator.
Agradecimientos adicionales a Jack Royer, Matteo Favaro, Arnau Gàmez y otros contribuyentes anónimos por la continua revisión y pruebas.
Apache-2.0. Los conjuntos de datos de prueba en test/datasets/ se redistribuyen de proyectos de investigación de terceros bajo sus licencias originales (principalmente GPL-3.0). Consulte THIRD_PARTY_LICENSES para más detalles.
| 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 |