Dmitry Brant, un ingeniero de software, detalló el proceso técnico para desactivar un dongle de protección de copia de hardware que databa de hace cuatro décadas, esencial para ejecutar un paquete de software de contabilidad archivístico. El desafío surgió mientras ayudaba a una firma contable a migrar desde este sistema legado, que corría en una máquina con Windows 98, utilizando un lenguaje de programación RPG (Report Program Generator) adaptado a MS-DOS.
El software requería obligatoriamente el dongle conectado al puerto paralelo de la PC para funcionar, una práctica común en el software empresarial antiguo para prevenir el uso no autorizado. Aunque la etiqueta del dispositivo estaba desgastada, se identificaron pistas que apuntaban a la empresa “Software Security Inc.” de Stamford, CT, y la palabra clave “RUNTIME”, sugiriendo que la protección estaba integrada en el tiempo de ejecución del programa.
Tras obtener una imagen del disco, Brant descubrió que el compilador RPG II, desarrollado por Software West Inc., era el componente que implementaba la verificación del dongle, inyectando esa lógica en todos los ejecutables generados. Al intentar ejecutar el editor de código fuente, SEU.EXE, sin el dongle, el programa intentaba comunicarse con el puerto paralelo durante varios segundos antes de fallar con un mensaje de error explícito.
Utilizando la herramienta Reko para desensamblar el ejecutable, se buscaban las instrucciones IN/OUT típicas de comunicación con puertos de E/S, encontrando la rutina crítica de protección en el segmento de código 0800. Esta rutina era notablemente corta, solo 0x90 bytes, y terminaba con una instrucción RETF, indicando que el resultado de la verificación se almacenaba en el registro BX, aunque la rutina no parecía aceptar parámetros de entrada.
La clave del éxito residió en deducir que el resultado en BX era constante, independientemente de las interacciones con el dongle. Brant parcheó inicialmente los primeros bytes para forzar un valor de salida arbitrario en BX, lo que hizo que el programa fallara inmediatamente en lugar de esperar la comunicación fallida. Esto confirmó que el valor de retorno era el único punto de control necesario para eludir la seguridad.
Un análisis más profundo del ensamblador reveló que el registro superior, BH, siempre se establecía en el valor constante 76h al finalizar la rutina. Esto redujo el problema a encontrar el valor de 8 bits para el registro BL, dejando solo 256 posibilidades para probar. El ingeniero implementó un guion automatizado para lanzar el ejecutable parcheado en DosBox, iterando sistemáticamente todos los valores posibles para BL.
La fuerza bruta fue rápida, y el valor correcto que permitió la ejecución exitosa del software fue el número seis para BL, resultando en el valor mágico 7606h para el registro BX. Al parchear el código para que siempre devolviera este valor, el software de contabilidad legada se pudo ejecutar sin necesidad del hardware físico, facilitando la extracción de datos para la modernización de los sistemas de la firma contable.