domingo, 16 de octubre de 2011

Fac sapias et liber eris

Hace ya mas de 15 años que +ORC nos dijo: "the only way to hack and crack correctly is to be more a software historian than a programmer" (lección 8.1). Yo lo recuerdo porque me enseñó que vale la pena reversar versiones viejas de una aplicación para entender mejor una versión actual.

Como corolario, puedo hoy agregar que tambien se justifica reversar parches viejos... he visto que alguna gente reversa los parches de microsoft para escribir gusanos... y he oido historias de grupos de reversers que se roban los proyectos entre ellos... :P asi son los niños...

Escenario: Se tiene licencia sobre un software. La licencia permite instalar en dos equipos. Durante la instalacion, cada maquina genera dos codigos de instalacion que el usuario debe enviar a la casa desarrolladora. La casa verifica el numero de licencias en uso y envia dos codigos nuevos que permiten activar el software. Si ya se ha instalado en dos equipos no te envian los codigos de activacion y debes desinstalar una de las copias. Al desinstalar se generar dos codigos de desactivacion. Los codigos de desactivacion se envian a la casa desarrolladora. La casa verifica la desactivacion y libera un cupo de licencia. El ciclo empieza de nuevo.

El sistema no es seguro, desde luego, creo que bastaria con instalar en una maquina virtual y sacar copias de la misma... pero mas importante aun... revela algunas cosas sobre el desarrollador, y la mas importante es que piensa de forma rara.. para que dos codigos en lugar de uno (mas largo si se quiere)?

Problema: uno de los equipos se estropea. tan estropeado que es necesario formatear y ese cupo ya no es usable, ni es posible generar codigos de desinstalacion. la casa debe tener un protocolo para resolverlo. seguramente no es un problema. pero tomara un par de dias...

el software es usado por un estudiante de posgrado a quien le quedan solo un par de dias para entregar. el estudiante habla con su profesor. el profesor le presta su portatil que tiene la otra licencia y todos felices... pero, si el profesor esta fuera del pais, el estudiante debe llamar a su reverser de confianza...

La meta es rehabilitar una instalacion en el menor tiempo posible... y bajo esa premisa preferimos buscar en la red si alguien ya ha resuelto de alguna forma el problema. hay un ejecutable crackeado para la version 1.09, necesitamos portalo a la 1.12.0070 o talvez el instalador de la 1.09... buscando en la pagina de la casa encontramos que puede descargarse la 1.11 o la 1.12, las demas no estan listadas... pero nadie puede culparnos por intentar, asi que copiamos la ruta de la 1.11 y cambiamos el link para buscar una hipotetica 1.10... funciona... buscamos la 1.09 y funciona.... que algo no este listado en la pagina de descargas no significa que no este disponible para descarga....

se instala la 1.09 en maquina virtual, se prueba el binario crackeado y el sistema funciona... pero seria algo irresponsable ejecutarlo en una maquina real sin analizar el crack, no? vamos a comparar cambios cuando nos encontramos con una diferencia significativa de tamaño... desde luego... en algun momento alguien decidio que era mejor suministrar binarios parchados que suministrar parches... y si el binario pesa pues se empaqueta, no? fue una mala decision, no hay duda... es en parte entendible si lo que se quiere parchar es un binario empaquetado, pero desde luego existen tecnicas para hacerlo directamente... recuerdo que lo hice hace mas de 10 años (y hoy con este proyecto descubri que ya hay herramientas automaticas)... en fin... descargar un identificador de firmas... es aspack 2.12... buscar unpackers... probar algunos... aspackdie parece ser el unico capaz de reconstruir correctamente la iat... y tenemos un _unpacked.exe funcional

uhmm... aun hay diferencias de tamaño... unos pocos miles de bytes... no importa... comparamos los volcados hexadecimal... aspackdie firmo el unpacked para confunfir mas... pasando la firma un par de cambios inocuos... valores donde habia antes ceros... mas firmas? uhm finalmente... tres bytes aqui... otros dos alla... en el hexadecimal reconozco un xor eax, eax... buena señal... otros tres bytes... otros dos... y termina el bloque de cambios,,, un buen tramo de binario sin cambios y luego un tramo de miles de bytes cambiados... voy a centrarme en estos 10 bytes... apunto el offset desensamblo y comparo listados... efectivamente, en estos bytes pasa algo, cambian los retornos de una funcion... reconozco un parche de principiante... puedo hacer los mismo en la mitad de bytes sin problemas... y dependiendo del valor de eax al entrar a la funcion, podria hacerlo solo en solo dos bytes... uhmm... no importa... no es un concurso... es claro que soy el mejor... triz me lo dijo...

edito el original de la 1.09... monto el parche de 10 bytes... funcional! optimizo el parche... 5 bytes... funcional! 2 bytes? uhm... no... si aparece como registrado pero las funciones no se habilitan... regreso a los 5... no es un concurso despues de todo...

5 bytes... portar el parche a la 1.12 y funciona... es valido esperar que funcione para la 1.11 y la 1.10 pero no vamos a descargarlo solo por probar... ya esta resuelto el asunto... no es un concurso, verdad? uhmm.. descargando...

bien.., una tecnica para un parche multiversion, necesito escribirlo... ya resolvimos la emergencia... porque necesito escribir el parche? y aun alcanzo a llegar al toque de las almas.... porque necesito escribirlo? es claro que no puedo hacerlo publico... nunca... descargando dUP2... generando parche via search & replace... uhmm... probando en cada version... pienso en todos los pobres estudiantes de posgrado con una fecha limite, un profesor ausente y una maquina estropeada... recuerdo lo que dijo la señora simpson sobre los estudiantes de posgrado "they're not bad people, they just made terrible life choices"... uhm...


[descargar crack para hydrus 1.xx] jajaj... no... no... me decido :P

pero si de verdad es una situacion de emergencia, lo que estas buscando es este patron:

75 15 8B 81 08 04 00 00 33 C9 8A 50 05 84 D2 0F 94 C1 8A C1 C2 04 00 83 F8 01 75 13 8B 91 08 04 00 00 33 C0 8A 4A 06 84 C9 0F 94 C0 C2 04 00 83 F8 02 75 15 8B 81 08 04 00 00 33 C9 8A 50 07 84 D2 0F 94 C1 8A C1 C2 04 00 83 F8 03 75 13 8B 91 08 04 00 00 33 C0 8A 4A 08 84 C9 0F 94 C0 C2 04 00 B0 01

y los cinco bytes que necesitas son estos:

EB ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? EB ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? EB ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? EB ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00


No hay comentarios:

Publicar un comentario