elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  C++ y registro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: C++ y registro  (Leído 3,153 veces)
xAnubiSx

Desconectado Desconectado

Mensajes: 28


Ver Perfil
C++ y registro
« 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
En línea

tena


Desconectado Desconectado

Mensajes: 668



Ver Perfil
Re: C++ y registro
« Respuesta #1 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
En línea

xAnubiSx

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: C++ y registro
« Respuesta #2 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/
En línea

tena


Desconectado Desconectado

Mensajes: 668



Ver Perfil
Re: C++ y registro
« Respuesta #3 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
En línea

xAnubiSx

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: C++ y registro
« Respuesta #4 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

« Última modificación: 30 Noviembre 2007, 20:27 pm por xAnubiSx » En línea

Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: C++ y registro
« Respuesta #5 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..
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
xAnubiSx

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: C++ y registro
« Respuesta #6 en: 4 Diciembre 2007, 18:39 pm »

mil gracias a los dos! de a poco voy casando este arte :D
me fascino ! :D


salu2

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines