Título: Ayuda (mis primeros pasos con ollydb para intentar registrar un programa) Publicado por: chuky666 en 22 Septiembre 2010, 18:01 pm Hola, saludos a todos y muchas gracias de antemano. Me estoy iniciando en este mundillo de la ingeniería inversa y después de leerme unos cuantos tutos y crackmes me decidí por intentar registrar este programa:
http://sp.financessoftware.com/downloads/PersonalFinancesPro.zip (http://sp.financessoftware.com/downloads/PersonalFinancesPro.zip) Es un programa portable que no necesita instalación. No es el típico con nombre/número de serie. Sólo pide un número de serie. El problema es que no da mensaje de si es válido o no. Lo sabes al reiniciar el programa porque te vuelve a salir una ventana con el aviso de que no está registrado. Hay otra cosa que lo diferencia de los típicos y es que si no está registrado no permite (en teoría) más de 200 transacciones. Digo en teoría porque a mí a veces me sale el límite a 270 a veces a 290 (es un poco confuso eso). Bueno comienzo mirándolo con el PEid y veo que está compilado con Borland C++ 1999. Creo que no pinta mal la cosa. Me voy al Olly y aqui empiezan los problemas: 1) Imposible localizar las cadenas de texto chico bueno chico malo, por lo menos en el módulo principal (dependen del idioma escogido y están almacenas en un fichero de texto en la carpeta LANG) 2) Lo intento a través de las funciones GetWindowTextA, MessageBoxA y GetDlgItemTextA pero tampoco hay suerte parece que utiliza APIs diferentes. 3) Intento tracear el programa e ir colocando BP a ver si consigo localizar la rutina "manualmente" pero se hace muy complejo (hay demasiados saltos y a la mínima me paso de la rutina de comprobación) Alguien puede echarle un vistazo y ayudarme un poquito, o al menos orientarme sobre qué otras opciones tengo? Saludos y gracias de nuevo PD.: 4) He intentado otro camino: colocar un BP on WinProc para que pare al pulsar el botón del OK (202) pero tampoco ha habido suerte. Alguna idea? Título: Re: Ayuda (mis primeros pasos con ollydb para intentar registrar un programa) Publicado por: MCKSys Argentina en 22 Septiembre 2010, 19:54 pm Cuando los programas cargan las cadenas de archivos externos, normalmente usan identificadores para ubicarlas (a menos que lo hagan en forma binaria).
Puedes intentar ubicar esos ids con el fin de tratar de parar el proggie cuando carga cadenas "criticas" como unregistered, etc, etc y a partir de ahi, atacar la rutina de registracion. Tambien puedes buscar el momento en que se inicializa la variable que lleva el conteo de las transacciones. Buscando, por ej.: MOV MEM32, 0C8 o PUSH 0C8 o algo por el estilo. Si el valor lo recupera en tiempo de ejecucion (no utilizando variables) puedes buscar algo asi como CMP R32, 0C8. Puedes buscar el lugar donde guarda los seriales (registro, archivo, etc) y tratar de parar cuando lo comprueba (usando APIs: RegQueryValue, CreateFile, etc) asi puedes ver que variables cambian cuando el serial es bueno o malo. En fin, hay miles de posibilidades, la cuestion es empezar a descartar... Saludos! Título: Re: Ayuda (mis primeros pasos con ollydb para intentar registrar un programa) Publicado por: chuky666 en 24 Septiembre 2010, 21:04 pm Buenas de nuevo, he estado investigando un poco más el tema y esto es lo que he encontrado:
1) He encontrado una serie de cadenas de texto un poco curiosas (puede que no sean nada): ASCII "CFxEbcO3L97KueEyods0xOO4j9x9knUtIc5SQl7NvroJxs8PD9tOhaP48FtKrNDHGAkIxnlY3R1OGGtAT0mA36dcOx1WnJMKh58KIbw2liNWLAyGOBtKzEPYq7OuJVjnK7qs1HnFCyLeCjT97HW9N24hXMBaMjkMgW3wt5DPX75mJySLxUYapIugXsw7l5HraJ0aAhGFZh5KnLr1ZXH7jNW4aai2ecGdvecvd3Im2n1gM"... UNICODE "WERTYUPASDFGHKZXCVBNM23456789weryupasdfghkzxcvbnm" UNICODE "GIVEAWAYOFTHEDAYXXXXPFH7K" UNICODE "hmXsC8mWHsCc6eggh9h5PFH7K" ASCII "-PFH8K" ASCII "-PFH9K" ASCII "c9adbf8d-9980-450c-8f92-e8320eb609f4" 2) los mensajes del fichero de texto se cargan en memoria a partir de la dirección 16e0000 y cuando se va a mostrar uno (estoy no estoy seguro de que sea siempre asi) se copia a la dirección 17c1dfc (por lo menos eso ocurre con el mensaje "parece una licencia de Personal Finances Home") 3) Lo de buscar la variable de conteo lo veo un poco complicado MCKSys. Además el número de transacciones es variable, a veces es a 273, a veces a 297... es un poco raro) 4) Buscando las APIs CreateFileW y CreateFileA (gracias MCKSys), colocando BP, teniendo como referencia la clave de prueba que introduzco (56814) y traceando un poco he localizado dos rutinas que creo que comprueban mi número. Una desde 5daf6f a 5db459 y otra desde 581b1e a 581cc3. La primera la hace si ya hemos introducido un serial previamente y se ha generado el fichero key.dat (supongo que es la comprobación inicial que hace el programa). La segunda la hace justo después de introducir el serial y antes de mostrar el mensaje "parece una licencia de Personal Finances Home". En ámbas la llamada CALL 8562e4 carga en el registro EDX nuestro serial. 4) He analizado un poco las rutinas y creo que hacen la comprobación de la siguiente forma: (usan un bucle que se repite en función de la longitud del número introducido) Mí serial: 56814 ronda 1- elimina la primera cifra para hacer unas operaciones (6814) ronda 2 - elimina las 2 primeras cifras (814) ronda 3 - elimina las 3 primeras cifras (14) ------- ultima ronda La rutina me parece un poco complicada de entender en detalle así que si alguien puede echarle un vistazo y orientarme un poco se lo agradecería. Esta es la rutina: CPU Disasm Address Hex dump Command Comments Código
Título: Re: Ayuda (mis primeros pasos con ollydb para intentar registrar un programa) Publicado por: chuky666 en 25 Septiembre 2010, 12:55 pm Dentro de esta rutina después de cargar en EDX nuestro serial (mediante el CALL 8562E4) hace una llamada a otra rutina más sencilla que también hace una serie de operaciones similares (en las que está involucrado nuestro serial), es ésta:
Código
¿Alguién le ve algún sentido? En la rutina anterior después de hacer varias operaciones hace una comparación (005DB0CD) y hay varios casos posibles, ¿que situaciones representan? Saludos y gracias de nuevo Título: Re: Ayuda (mis primeros pasos con ollydb para intentar registrar un programa) Publicado por: LSL en 30 Septiembre 2010, 23:23 pm partiendo del lugar donde coge una de las cadenas que calificastes como curiosas
00581734 |> \BA A0078D00 MOV EDX,008D07A0 ; ASCII "hmXsC8mWHsCc6eggh9h5PFH7K"; Default case of switch 00581538 subimos en el código para ver si con un poco de suerte nos encontramos algo interesante y vemos lo siguiente: 0058152D |. 84C9 TEST CL,CL 0058152F |. 74 07 JE SHORT 00581538 00581531 |. C683 D2030000 00 MOV BYTE PTR [EBX+3D2],0 00581538 |> 83EF 01 SUB EDI,1 ; Switch (cases 0..2) 0058153B 72 0E JB SHORT 0058154B 0058153D |. 74 2E JE SHORT 0058156D 0058153F |. 4F DEC EDI 00581540 |. 0F84 CB000000 JE 00581611 00581546 |. E9 E9010000 JMP 00581734 0058154B |> 807D 97 00 CMP BYTE PTR [EBP-69],0 ; Case 0 of switch 00581538 0058154F |. 75 10 JNZ SHORT 00581561 00581551 |. B0 01 MOV AL,1 00581553 |. 8B16 MOV EDX,DWORD PTR [ESI] 00581555 |. 64:8915 00000000 MOV DWORD PTR FS:[0],EDX 0058155C |. E9 73030000 JMP 005818D4 00581561 |> C683 D3030000 01 MOV BYTE PTR [EBX+3D3],1 00581568 |. E9 C7010000 JMP 00581734 0058156D |> B2 01 MOV DL,1 ; Case 1 of switch 00581538 0058156F |. 8B83 A8030000 MOV EAX,DWORD PTR [EBX+3A8] 00581575 |. 8B08 MOV ECX,DWORD PTR [EAX] 00581577 |. FF51 74 CALL DWORD PTR [ECX+74] 0058157A |. 66:C746 10 2400 MOV WORD PTR [ESI+10],24 00581580 |. BA 85078D00 MOV EDX,008D0785 ; ASCII "LaunchCount" 00581585 |. 8D45 EC LEA EAX,DWORD PTR [EBP-14] 00581588 |. E8 5B4A2D00 CALL 00855FE8 0058158D |. FF46 1C INC DWORD PTR [ESI+1C] 00581590 |. E8 0347FFFF CALL 00575C98 00581595 |. 8BF8 MOV EDI,EAX 00581597 |. 6A 00 PUSH 0 00581599 |. 8D4D EC LEA ECX,DWORD PTR [EBP-14] 0058159C |. 51 PUSH ECX 0058159D |. BA 92078D00 MOV EDX,008D0792 ; UNICODE "Main" que parece interesante "LaunchCount", umm parece una referencia del programador para contar los lanzamientos demos del programa, mas abajo tambien el texto "Main", que hace referencia al formulario principal del programa, y que hay un "Switch" con tres opciones que dependen del valor existente en el registro EDI, Hasta aquí en version trial llego con el valor 1 en EDI, y salta a la opcion 1 del Swich con el LauncCount gracioso, pero como yo tambien soy gracioso le cambio el valor de EDI a 0 y continuo por el Swuich case 0, y no me sale la ventana de registrar, pero me sigue saliendo en el menu la opción "Buy now.." para comprar. Asi que tenemos que profundizar un poco mas, para encontrar donde se le da al registro EDI, el valor 1 de versión trial, para cambiarlo por el de valor 0 que ya suponemos que es el de registrado, porque no nos sale la nag de compra. Subiendo más en el código hasta donde comienza dicho proceso, vemos (y vamos comprobando parando en las call reiniciando varias veces por si toma el valor de los procesos de las call intermedias), que a EDI le pasa el valor 1 el registro EDX, al comienzo del procedimiento 00581428 |. 8BFA MOV EDI,EDX por lo que ahora tenemos que buscar donde coge EDX el valor 1 antes de entrar en el procedimiento de marras. Para esto, al principio del procedimiento 0058141C /$ 55 PUSH EBP la hacemos un Control+R, y obtenemos todas la call donde se llama al procedimiento, para saber en cual de ellas tenemos que fijarnos, le ponemos un BP (F2) a cada una, reiniciamos y ya caemos en la call que se encarga del proceso. Estando parado en esa Call de llamada en 005904D2, tenemos que subir para encontrar donde coge EDX el valor 1, 005904BE |. 52 PUSH EDX 005904BF |. 8B0A MOV ECX,DWORD PTR [EDX] 005904C1 |. FF91 D4000000 CALL DWORD PTR [ECX+D4] 005904C7 |. 59 POP ECX 005904C8 |. 8BD0 MOV EDX,EAX 005904CA |. 33C9 XOR ECX,ECX 005904CC |. 8B85 ECFDFFFF MOV EAX,DWORD PTR [EBP-214] 005904D2 |. E8 450FFFFF CALL 0058141C vemos que a EDX se le mueve el valor de EAX, ya tenemos un nuevo objetivo, buscar donde se mueve a EAX el valor 1, para esto vemos que un poco antes hay una CALL a otro procedimiento, ¿será la llave?. Vamos a ponerle a esta call un BP con F2 porque no podemos entrar directamente, y vamos a reiniciar de nuevo el programa, ahora paramos en la call, y con F7 entramos en ella y vemos lo siguiente: 005D992C /. 55 PUSH EBP 005D992D |. 8BEC MOV EBP,ESP 005D992F |. B8 01000000 MOV EAX,1 005D9934 |. 5D POP EBP 005D9935 \. C3 RETN Ya tenemos donde coge EAX el valor 1, ¿y si lo cambiamos por un cero de los que nos calificaban cuando estabamos en el colegio?, ya corremos el programa sin mas paradas y no aparece la nag de compra ni la misma opción en el menú, por lo que es de suponer que el resultado es definitivo. Pero podemos y debemos profundizar un poco más ya que si estuviesemos registrado seguramente no pasariamos por dicho lugar, así que vamos a ver porqué se llega a este código de la version TRIAL, y mirando de donde procede el que se llame a dicho lugar, vemos que llegamos dependiendo de que se produzca el salto JE de 005DB5CA. 005DB56A |. 8985 9CFEFFFF MOV DWORD PTR [EBP-164],EAX 005DB570 |. 8B8D 9CFEFFFF MOV ECX,DWORD PTR [EBP-164] 005DB576 |. 898D E8FDFFFF MOV DWORD PTR [EBP-218],ECX 005DB57C |. 8B4B 28 MOV ECX,DWORD PTR [EBX+28] 005DB57F |. 898D 98FEFFFF MOV DWORD PTR [EBP-168],ECX 005DB585 |. 8B85 98FEFFFF MOV EAX,DWORD PTR [EBP-168] 005DB58B |. 8985 D8FDFFFF MOV DWORD PTR [EBP-228],EAX 005DB591 8B95 D8FDFFFF MOV EDX,DWORD PTR [EBP-228] 005DB597 |. 3B95 E8FDFFFF CMP EDX,DWORD PTR [EBP-218] 005DB59D |. 0F94C1 SETE CL 005DB5A0 |. 83E1 01 AND ECX,1 005DB5A3 |. 84C9 TEST CL,CL 005DB5A5 |. 75 29 JNZ SHORT 005DB5D0 005DB5A7 |. 8B85 E8FDFFFF MOV EAX,DWORD PTR [EBP-218] 005DB5AD |. 8985 94FEFFFF MOV DWORD PTR [EBP-16C],EAX 005DB5B3 |. 8B95 94FEFFFF MOV EDX,DWORD PTR [EBP-16C] 005DB5B9 |. 8B4A 0C MOV ECX,DWORD PTR [EDX+C] 005DB5BC |. 3B8D A0FEFFFF CMP ECX,DWORD PTR [EBP-160] 005DB5C2 |. 0F97C0 SETA AL 005DB5C5 |. 83E0 01 AND EAX,1 005DB5C8 84C0 TEST AL,AL 005DB5CA |. 0F84 BE000000 JE 005DB68E y para que el salto JE se produzca depende que en 005DB5C2 el SETA AL de un resultado verdadero "true", por lo que deducimos que si la comparación diese un resultado falso no se produciria el salto que nos lleva al bit indicativo de versión trial (así que lo cambio SETA por un SETBE que es lo opuesto, y además el salto que hay un poco antes que evitaria el pasar por ahí, lo NOPeo, vaya ser que en un futuro se produzca el salto por vaya usted a saber porqué, y ya nos mete la gamba). 005DB56A 8985 9CFEFFFF MOV DWORD PTR [EBP-164],EAX 005DB570 8B8D 9CFEFFFF MOV ECX,DWORD PTR [EBP-164] 005DB576 898D E8FDFFFF MOV DWORD PTR [EBP-218],ECX 005DB57C |. 8B4B 28 MOV ECX,DWORD PTR [EBX+28] 005DB57F 898D 98FEFFFF MOV DWORD PTR [EBP-168],ECX 005DB585 |. 8B85 98FEFFFF MOV EAX,DWORD PTR [EBP-168] 005DB58B |. 8985 D8FDFFFF MOV DWORD PTR [EBP-228],EAX 005DB591 8B95 D8FDFFFF MOV EDX,DWORD PTR [EBP-228] 005DB597 |. 3B95 E8FDFFFF CMP EDX,DWORD PTR [EBP-218] 005DB59D |. 0F94C1 SETE CL 005DB5A0 |. 83E1 01 AND ECX,1 005DB5A3 |. 84C9 TEST CL,CL 005DB5A5 90 NOP 005DB5A6 90 NOP 005DB5A7 8B85 E8FDFFFF MOV EAX,DWORD PTR [EBP-218] 005DB5AD |. 8985 94FEFFFF MOV DWORD PTR [EBP-16C],EAX 005DB5B3 |. 8B95 94FEFFFF MOV EDX,DWORD PTR [EBP-16C] 005DB5B9 |. 8B4A 0C MOV ECX,DWORD PTR [EDX+C] 005DB5BC |. 3B8D A0FEFFFF CMP ECX,DWORD PTR [EBP-160] 005DB5C2 0F96C0 SETBE AL ; false 005DB5C5 |. 83E0 01 AND EAX,1 005DB5C8 84C0 TEST AL,AL 005DB5CA |. 0F84 BE000000 JE 005DB68E ; saltar llegado aqui tambien pueden decir que lo mas seguro es poner un JMP, pero no me gusta machacar :D P.d. tambien se puede estudiar los valores que se mueven y comparan en dicho procedimiento, que quizas sean interesantes ????. probar si funciona, que a mi me da la F1ACA meter 200 transaciones ... |