Un investigador relata el proceso de ingeniería inversa que ha emprendido sobre ionCube Loader, el protector comercial de PHP, animado por la compra de Binary Ninja con motivo de su décimo aniversario. Tras desembolsar 200 dólares, necesitaba un objetivo y eligió terminar de revertir el loader para escribir un desempacador.
El artículo explica la estructura del binario: 2,3 MB de código nativo que incluye LibTomCrypt (AES, Anubis, Blowfish, CAST5, Twofish, DES, SHA, MD5, Murmur…), una reimplementación de la API Reflection de PHP para evitar el desempacado dinámico, un pipeline de deserialización propio y un intérprete de PHP enlazado estáticamente. Como extensión zend, el loader expone el símbolo zend_extension_entry, lo que permite localizar en Binary Ninja los manejadores MINIT, RINIT, MSHUTDOWN y similares.
El núcleo del texto describe la "cebolla criptográfica" del fichero protegido: el payload, codificado en base64 con un alfabeto personalizado, se envuelve en contenedores anidados hasta llegar a un flujo de opcodes. Un valor mágico inicial selecciona el formato de byte y el tipo de PRNG. La clave de descifrado puede proceder de cinco orígenes, entre los que destaca un truco antimanipulación que ejecuta una función designada y aplica un hash al resultado. En los ficheros de evaluación analizados, las cuatro palabras de clave embebidas son cero, por lo que la ruta constante colapsa y el contenido se vuelve descodificable sin conexión.
A partir de la clave se calculan dos semillas de 32 bits con un hash Jenkins (joaat) y un MurmurHash3-32, que alimentan un PRNG MWC de doble carril de 16 bits. El byte de keystream, calculado como (next() >> 8) & 0xff, se aplica XOR sobre el cifrado. El autor advierte de un detalle sutil: ionCube extiende el signo de cada byte, por lo que cualquier valor ≥ 0x80 se trata como negativo y un port ingenuo produce semillas incorrectas.
