Título: C++ y registro Publicado por: xAnubiSx en 28 Noviembre 2007, 18:50 pm Hola, estoy viendo como saltar el registro de un soft, pero me la esta complicando un poco, logro hacer que me registre satisfactoriamente, parcheándolo, no puedo conseguir el serial. pero una vez registrado, vuelve a hacer la comprobación por otro lado y me tira que no estoy registrado, y se abre la ventana de registro.
yo quería saber como puedo hacer para ver desde donde se llama para que aparezca la ventana de registro. para ver de donde me tira que mi serial es incorrecto :S gracias Título: Re: C++ y registro Publicado por: tena en 29 Noviembre 2007, 01:42 am Hola xAnubisx
-- Para hacer que caiga justo debajo de la llamada a la ventana de registro intenta hacer esto: ** En el oly ejecutas el programa hasta que te salga la ventanita de registro, una vez que te salga la ventanita te vas al oly y lo pones en pausa con F12, luego presiona ALT+F9 para que se ejecute hasta que encuentre codigo del exe.. ** Despues de esto te vas a la ventanita de registro (posiblemente va a tener un retraso en aparecer) y le das al boton "seguir" para que aparezca el programa.. ** Ollydbg deberia saltar justo debajo de la llamada a la ventana... SAludos tena Título: Re: C++ y registro Publicado por: xAnubiSx en 29 Noviembre 2007, 18:22 pm Gracias por tu respuesta, segui los pasos, pero me queda haciendo un loop no se si infinito o casi, en una dll.
te dejo el nombre del programa y la url por si me puedes dar una mano, ya he tratado de crackear varios programas echo en C++ y siempre me quedo en la misma cosa. tienen varias comprovaciones de serial y yo solo encuentro uno :S salu2 y gracias Programa: Super DVD Ripper Link: http://www.dvdtodivx.net/ Título: Re: C++ y registro Publicado por: tena en 30 Noviembre 2007, 00:07 am Bueno lo estuve viendo, y la nag de registro te sale porque se fija en el registro de windows si esta registered, como no es asi te sale la ventanita.
Bueno si solo quieres eliminar esa nag, pues hice lo que te indique, y a mi me paro en el lugar correcto, justo aca: 00410AB1 JNZ sdvdrip.00410B58 ==> Cambiar a JMP 00410AB7 PUSH ESI 00410AB8 LEA ECX,DWORD PTR SS:[ESP+1A4] 00410ABF CALL sdvdrip.00404E70 00410AC4 MOV EAX,DWORD PTR DS:[ESI+388C] 00410ACA MOV DWORD PTR SS:[ESP+12E8],0 00410AD5 TEST EAX,EAX 00410AD7 JNZ SHORT sdvdrip.00410AFD 00410AD9 LEA ECX,DWORD PTR SS:[ESP+1A0] 00410AE0 CALL <JMP.&MFC42.#2514> ; Ventana de Registro Solo cambias el salto a Jmp y chau nag.... Pero ya que estaba lo parche para que quede full.... 1- Le puse un bp conditional log a la api TranslateMessage con la condicion MSG==202 para que al presionar el boton de registrar pare en el olly.. 2- Busque mi serial en memoria con ctrl+b y le puse un bpm 3- Siguiendo el serial llegue aqui: 00405111 MOV EAX,DWORD PTR DS:[EDI+120] ; <=== DEBE SER 1 00405117 MOV ECX,EDI 00405119 CMP EAX,1 0040511C JNZ SHORT sdvdrip.00405138 0040511E PUSH 40 00405120 PUSH sdvdrip.004C55B8 ; ASCII "Thanks" 00405125 PUSH sdvdrip.004C5594 ; ASCII "Thank you for buying the software!" Aqui busque referencias a esa constante [edi+120] Address Disassembly Comment 00405249 MOV DWORD PTR SS:[EBP+120],1 <===UUUUUUUUUUUUUUUUU 004052D4 MOV DWORD PTR SS:[EBP+120],0 <=== Malo y les puse bps... 4- Al dar registrar caigo en: 004052D4 MOV DWORD PTR SS:[EBP+120],0 ; <=== malo y veo que aqui se llega desde: 00405218 CALL sdvdrip.00407070 0040521D ADD ESP,24 00405220 TEST EAX,EAX 00405222 JE sdvdrip.004052D4 ; salta a malo 00405228 LEA ECX,DWORD PTR SS:[ESP+10] 0040522C LEA EDX,DWORD PTR SS:[ESP+C] 00405230 PUSH ECX ; /pDisposition 00405231 PUSH EDX ; |pHandle 00405232 PUSH 0 ; |pSecurity = NULL 00405234 PUSH 0F003F ; |Access = KEY_ALL_ACCESS 00405239 PUSH 0 ; |Options = REG_OPTION_NON_VOLATILE 0040523B PUSH 0 ; |Class = NULL 0040523D PUSH 0 ; |Reserved = 0 0040523F PUSH sdvdrip.004C54D4 ; |Subkey = "Software\x2VCD" 00405244 PUSH 80000002 ; |hKey = HKEY_LOCAL_MACHINE 00405249 MOV DWORD PTR SS:[EBP+120],1 <=UUUUUUUUUUUUUUUUU Entro al call y me fijo que hay dos referencias a ella, pues nada, lo parcheo asi mov eax,1 retn y guardo los cambios... Con eso ya esta registered y no salen las nag... Saludos tena Título: Re: C++ y registro Publicado por: xAnubiSx en 30 Noviembre 2007, 19:13 pm Bueno lo estuve viendo, y la nag de registro te sale porque se fija en el registro de windows si esta registered, como no es asi te sale la ventanita. Bueno si solo quieres eliminar esa nag, pues hice lo que te indique, y a mi me paro en el lugar correcto, justo aca: 00410AB1 JNZ sdvdrip.00410B58 ==> Cambiar a JMP 00410AB7 PUSH ESI 00410AB8 LEA ECX,DWORD PTR SS:[ESP+1A4] 00410ABF CALL sdvdrip.00404E70 00410AC4 MOV EAX,DWORD PTR DS:[ESI+388C] 00410ACA MOV DWORD PTR SS:[ESP+12E8],0 00410AD5 TEST EAX,EAX 00410AD7 JNZ SHORT sdvdrip.00410AFD 00410AD9 LEA ECX,DWORD PTR SS:[ESP+1A0] 00410AE0 CALL <JMP.&MFC42.#2514> ; Ventana de Registro Solo cambias el salto a Jmp y chau nag.... Lo Volvi a hacer, y estaba haciendo unas cositas mal, no sabia como funcionaba. gracias. Mil Gracias !!! Yo Habia llegado la llamada de 00405218 CALL sdvdrip.00407070 pero no sabia que modificar para que quede full el path ! gracias !!! poner mov eax,1 retn que le hace al programa ? (se que pone el registro eax en 1 y retn sale de la funcion, pero que hace ese 1 para que quede pathcheado ?) salu2 Título: Re: C++ y registro Publicado por: Shaddy en 1 Diciembre 2007, 11:55 am Por regla general los flujos de programas siempre se resumen en una operacion booleana, por defecto:
0 - NO REGISTRADO. 1 - REGISTRADO. Un método tradicional es buscar ese byte de la memoria que estando siempre a 1 todas las comparaciones booleanas digan que está registrado, en el caso de como ya dijo TENA, si ves una estructura con éste símil: 00405111 MOV EAX,DWORD PTR DS:[EDI+120] ; <=== DEBE SER 1 00405117 MOV ECX,EDI 00405119 CMP EAX,1 0040511C JNZ SHORT sdvdrip.00405138 0040511E PUSH 40 00405120 PUSH sdvdrip.004C55B8 ; ASCII "Thanks" 00405125 PUSH sdvdrip.004C5594 ; ASCII "Thank you for buying the software!" Aqui busque referencias a esa constante [edi+120] Address Disassembly Comment 00405249 MOV DWORD PTR SS:[EBP+120],1 <===UUUUUUUUUUUUUUUUU 004052D4 MOV DWORD PTR SS:[EBP+120],0 <=== Malo y ves que el JNZ es evaluado por la anterior instrucción CMP y que utiliza como comparador el registro EAX, entonces pasas a ver de donde viene EAX, si miras más arriba ves la línea: 00405111 MOV EAX,DWORD PTR DS:[EDI+120] es decir, ese "1" o "0" (lo llamaremos Byte de Registro o "RegByte"), lo obtiene de la direccion de memoria EDI+120. según leí (hice una lectura rápida ya me perdonareis :D) tena busco todas las referencias en el código de instrucciones tipo: MOV EAX, DWORD PTR DS:[EDI+120] y salieron algunas y todas las parcheo (creo). el caso es que tu tambien puedes quedarte con la direccion absoluta, es decir, poner un BreakPoint en esa línea y esperar a que pare, ver que valor tiene EDI y sumarle 120 (o ir al dump y hacer CTRL + G y escribes "EDI + 120"), y te quedas con ese valor, reinicias (probablemente al reiniciar esté vacío o ni siquiera exista, pero tu le metes un BreakPoint o on access o hardware on access byte (recuerda que el hardware parará una línea despues de que se haya ejecutado la violación de acceso de memoria) (un punto de ruptura on access es simplemente un cambio en las propiedades de la sección para que genere una excepcion y la devuelva así puede pararlo en esa zona), una vez lo pongas corres el programa y ves quienes lo van chafafando con 0s y tu les metes 1os. Salu2.. Título: Re: C++ y registro Publicado por: xAnubiSx en 4 Diciembre 2007, 18:39 pm mil gracias a los dos! de a poco voy casando este arte :D
me fascino ! :D salu2 |