Consejos y trucos a la hora de hacer un keygen

Iniciado por ANTRAX, Febrero 20, 2010, 02:58:33 AM

Tema anterior - Siguiente tema

0 Miembros y 4 Visitantes están viendo este tema.

Hola pues hace bastante que no aporto algo al foro asi que ahora voy a postear algunos consejos y trucos a la hora de hacer keygens... como uso el vb6 explicare con codigo en ese lenguaje ja... Esto no es un manal sino mas bien una explicación basica de como tomar un programa y hacer el keygen...


Bueno empecemos...

Como primer cosa hay que revisar siempre que error nos da cuando intentamos registrarnos con un serial malo, ya que la mayoria busca una comparación del serial con otra cosa y muchas veces se da contra una muralla ja.. pues no siempre se compara XXXX-XXXX-XX con loqueingresamos asi de lleno... es muy bobo el programador que hace eso... pues bien y por que ver que error me da.. simple, para saber donde buscar... msgbox, beep... o lo que sea

en caso de un msgbox identificamos que tipo de msgbox utiliza.. muchas veces no son los tipicos, no por su función sino que a veces los compiladores a una misma rutina se la llama distindo MessageBox, rtcMessageBoxA, MessageBoxA... y asi hay variantes... muchas ... yo los llamo msgbox porque es mas cortito ja.
Bueno es mas facil identificar la rutina del serial... que no es lo mismo que encontrarla... tan solo por ejemplo si nos da error con un MessageBoxA que mas que poner un bp MessageBoxA (asi se hace con la command bar en olly) y tratar de registrarnos y cuando salta le damos a Ctrl + F9 para que salga de la libreria que hace esto nos deja el programa en run hasta que le damos a aceptar... luego salimos de las librerias hasta llegar al programa principal o sospechoso, con Ctrl + F9 y asi llegar a una rutina que por lo general tiene esta estructura... aunque no siempre ... sino la mayoria.... :


call XXXXXXX
cmp eax, 0
jne XXXXXXX
.......
.......
Call MessageBoxA
.....
retn

donde pararíamos nosotros es justo debajo del call MessageBoxA, entonces buscando para arriba encontramos por lo general un salto, en este ejemplo  je XXXXXXXX .... si vemos hay una call XXXXX pues aqui es donde generalmente se debe comprobar el serial... pues muchas veces es asi... pues cuando se llega a este punto hay varias formas de emparchar el programa... A mi punto de vista lo ideal es entrar en la call y en el final de la misma asignar el valor que debe tener eax para que lo tome por registrado.... la mayoria queda aqui porque es mas comodo... y es mas ni siquiera entra a la call... solo invierte el salto... pero que pasa si la call que comprueba el serial es llamada de otro lado??
Invertis el salto y si el programa abre, pero no todo funciona bien... y si emparcho dentro de la call?? pues si anda todo perfecto... pero no puedo actualizar el sistema je... pues a sacar el serial correcto cheeeee !! no hay que ser tan vagooo..

Pero como lo hacemos??? es mucho codigo me saco los ojos debugueando..
En la mayoria de los casos si .. uno agarra y le da duro al F7... ja.. pues usemos la cabeza... olly tiene muchas funciones.... entre las cuales tenemos el trace....
Que pasa si entro en la call le pongo un bp al inicio y uno al final.. y lo pongo a correr, ingreso el serial invalido y le doy aceptar... salta donde puse mi primer bp... o sea al inicio de la rutina de comprobación... pero alli no sigo con f7... simplemente me voy a view run trace y lo abro, corroboro que este limpio, sino lo esta, lo limpio, luego hago que me vuelque el log a un archivo... boton derecho click sobre la ventana de run trace elegimos log to file y listo ahora nos queda ir al menu debug y alli le damos a trace into... para que no se saltee nada.. o mas facil Ctrl + F11, nos va a recorrer hasta llegar al final.... ojo no por ello va a hacer todos los pasos.. quizas entre en la primer call y de alli salte al final.. y nos tire al msgbox... pues si .. porque siempre hay varias subrutinas dentro la primera siempre o la mayoria de las veces comprueba el largo del serial que sea de x caracteres.. despues se comprueba a veces que sean solo X tipo de caracteres.. y por ultimo se calcula el codigo... pues a medida que vamos acomodando nuestro serial, y corriendo el programa.. con ese metodo, el trace se ira agrandando.. y les ira recorriendo y entrando en toda la rutina... por lo general en 2 o 3 pasadas acomodas el largo , el formato y los caracteres válidos del serial y el trace que conseguiremos te mostrará todos los calculos con los que se hace el serial....

Pues cuando veas el trace ... de seguro te horrorizaras ja.. a mi tambien me pasa.. ver mas de 200 lineas que mueven xorean restan suman y demass.. je
Pues simple llegado el punto que tenes en un log la rutina que te comprueba el serial ... que mas... la imprimis y a leer se a dicho , lapicera en mano y empezas primero lo lees de arriba para abajo.. por lo general a la derecha te va mostrando los registros que va modificando y alli si has identificado bien la rutina.. veras como va desglosando o convirtiendo tu serial y haciendo distintas operaciones con parte o todo el serial...

Para que lo esntiendas debes armarte de mucha paciencia.. y empezar a identificar variables... como lo haces pues simple por ejemplo lo primero que hace una rutina es cargar el serial o un pedazo en XXX registro y le aplica alguna operación como por ejemplo un Xor luego guarda el resultado en XXXXXXX y asi toma de vuelta otro segmente o el serial completo y va haciendo operaciones... a veces toma el resultado y lo reusa y asi.. Pues aqui debes hacer una lista en una hoja aparte donde anotas cada variable y su contenido... entonces en otra hoja vas graficando lo que va haciendo la rutina algo asi es lo que hago yo:


Identifico si me segmenta el seria y en cuantos pedacitos, por ejemplo en cuatro, entonces empiezo a hacer lo siguiente:

  segmento 1                  segmento 2                 segmento 3              segmento4
       |                                 |                               |                            |
       |                                 |                               |                            |
xor seg1, XXXXX        add seg2, XXXX                      |
       |                                  |                              |
       |_____________________|_______________mul seg1, seg2, segmento 3

Por un decir este es un ejemplito de lo que voy haciendo en papel... aqui utilizo mi notación... que puede ser mucho mejor o distinta a la que ustedes utilizan... es solo para entender una función.. en este caso tengo que generar siete variables... y tengo 2 constantes:
tengo los 4 Segmentos del serial , luego tengo seg1 y seg2 que son el resultado de el xor y el add que les hago al primer y segundo segmento del serial luego a estos dos resultados los multiplico junto con el tercer segmento del serial... entonces en una hoja voy anotando las variables con sus respectivos valores... por que anotarlos aparte???
Pues es simple... intenta hacer el diagrama sin llevar la cuenta de las variables y sus valores... a ver como te va ja.. yo por lo menos ... no puedo jejeje...
una vez terminado de diagramar la función.. pues te queda hacerle el reversing....
como es eso???
Simple empiezas de atras para adelande... buscando lo opuesto si tu sabes el resultado final por ejemplo:
Xor eax, ebx   -------------> aca xorea dos valores
cmp eax, AF456E00 ----> compara el resultado contra AF456E00
je XXXXXX
xor eax, eax
......

Sabemos que nos compara eax con un valor y suponiendo que el resultado final de la rutina que calcula el serial esta en eax... listo partimos de ese valor hacia atras... Pues como??? De la siguiente forma:

sabemos que en el pedazito de codigo anterior tenemos 2 variables y una constante, eax ebx y  AF456E00 ... pues bueno el reversing de ese pedazito quedaría asi(en codigo vb):


dim constante, valorx, valorx2 as long

constante= 2940562944   ----> tomo AF456E00 ya convertido a decimal :P es mas facil je
randomize
valorx= Round(rnd * constante - 1)---> guardo un valor X generado aleatoriamente
valorx2 = constante xor valorx   ----->  xoreo el valor random con la constante
                                                      y asi obtengo el segundo valor

si se fijan bien las operaciones lógicas no tienen operación inversa propiamente dicho. Pues si uno hace un xor, or o and de x contra y nos dara z y si hacemos un xor, or o and de z contra x nos dara y
No asi las operaciones aritméticas donde - es la inversa de + y / la de *

Para entender bien las operaciones lógica pues revisen sobre sus propiedades y sus respectivas tablitas de valores.

Estas 7 operaciones son las mas utilizadas (Xor, Or, And, Add, Sub, Mul, Div), pero hay muchas mas, que incluyen variantes de las anteriores.

Pues cabe destacar que cuando se trabaja con decimales... la mayoria de los compiladores pasa los valores a los stacks para hacer alguna operación aritmetica de coma flotante o sea.. hay que trabajar con los registros del FPU en el caso de olly (st1, st2, st3, etc).Pues comento esto para que sepan donde buscar je.... porque muchos programas trabajan con decimales y algunos compiladores como clarion, en estos casos te pasan los valores a dichos registros y muchos se pierden sin saber que hace o al tener activado los registros 3dnow o los debug register no nos fijamos y nos perdemos y trabamos alli...


Bueno es todo lo que se me ocurre ahora.. pues si sale algo lo agrego che :P.... Y tengan en cuenta que en vb6 si bien no se puede usar codigo asm... seimpre se puede emular je....