Capitulo 1 Para empezar se necesitarían unas nociones básicas sobre ASM (Ensamblador) cuando digo nociones básicas me refiero a 4 instrucciones que tendremos que aprender, ya que este articulo no trata sobre ASM. - Saltos condicionales Todo aquel que sepa mínimamente
sobre programación sabrá lo que son los saltos condicionales,
ya que en todo los lenguajes de programación son necesarios. SI (Numero_Serie==123456) ENTONCES { {
A simple vista la manera mas fácil de registrar el programa seria adivinar cual es el numero de serie. Entonces se tendría que recurrir al método "Harcoded".Los "harcoded" son algo excepcional. Ya que hoy en día no se usan o lo usan los programadores que no quieren programar un gran sistema de protección a Software. Para encontrar el código, tan solo haría falta abrir el programa con el Desensamblador y mirar de encontrar el Numero de serie. Para explicar esto haremos una practica, para ello miraremos el programa CrackMe1.exe. Para empezar deberemos destripar el programa
usando un desensamblador como por el ejemplo el Win32Dasm que es el que
utilizaremos. Una ves desensamblado el programa, veremos en el Menú Refs la función String Data Reference. Esto nos mostrara todos los datos de Cadenas (a partir de ahora Strings) que hay en el programa. Es decir nos mostrara las cadenas de texto que salen en pantalla. Como podemos ver entre otras, sale una cadenas de texto que nos interesa : - "ABCD1234567"
Si nos fijamos bien tiene 12 caracteres, y el el programa nos pedía un numero de serie que tuviera 12 caracteres. Pues bien como no hay otra cadena de texto que tenga 12 caracteres, lo que haremos sera comprobar si este es el código valido. Como veis si que era este el código correcto. Hay que matizar que hoy en día los programadores no suelen utilizar esta técnica tan primitiva a la hora de registrar programas, ya que como es visto, es muy fácil. Aún así en el mercado existen varios programas que siguen usando esta técnica. Capitulo 2 Proseguiremos explicando una técnica que se usa todavía hoy en día en muchos programas llamada la técnica del 74/75. Para explicar está técnica nos hará falta un poco mas de material técnico y aprender un poco sobre Ensamblador y tener unas nociones básicas. Como todos sabéis el Ensamblador
(En adelante ASM) es un lenguaje de bajo nivel. Que quiere decir un lenguaje
de bajo nivel? Que cuanto mas largo es el programa, mas pierde el control
de el. Instrucción : MOV MOV AX,10h
Movería el valor de AX a BX Ahora pongamos un ejemplo fácil de comprender. : MOV AX,2 En la primera instrucción vemos
como AX coje el valor de 2 (Si no lleva ninguna letra es que es en base
decimal) Instrucción CALL Vamos a poner un ejemplo para que se vea claramente lo que es la instrucción CALL : MOV AX,2h
Y son las siguientes : CODIGO_HEX Aquí tenemos una tabla, donde nos
muestra el nombre del salto en ensamblador,lo que significa y su CODIGO
EN HEXADECIMAL, que mas adelante nos ayudara. 014F:00401DB 3BC7 Cmp eax,edi NOTA : el primer valor que hay pj 014F:00401DB es la dirección de memoria, el segundo es el código en HEXADECIMAL y el tercero en ASM En este ejemplo , vemos que compara eax con edi, y la instrucción Jne nos indica que saltaría a la dirección 00401DF de memoria si eax y edi no son iguales entonces ejecutaría la rutina NO_REGISTRO. Si son iguales entonces lo que haría seria seguir su rumbo y registrase. Como vemos en la tabla Jne significa que
si eax y edi no son equivalentes saltaría a la Entonces... que pasaría si cambiaremos
ese Jne por un Je? Pues que seria todo Supongamos que tenemos un programa que
haya que poner un Serial, entonces el programa compararía el Serial
introducido con el serial que tendría que ponerse. Si es correcto
el serial, pues el programa estaría registrado. Para ello haremos un caso practico con el crackme2. Este simple programa lo que hace es pedir
un código. Si acertamos nos dirá que hemos acertado , y
si no pues no dira que no... mm lógico no? xDDD Para empezar ejecutamos el programa para ver lo que nos dice :
Al primer vistazo parece que es el mismo programa antes. Pero si hacemos un desensamblador veremos con no encontramos el código como en el otro programa. Habrá que recurrir a lo que os he explicado antes. Hacerle creer al programa que el código incorrecto es el correcto. Para hacerlo, primero de todo hay que localizar la parte del código donde comprueba si el numero es correcto o no lo es. Para ello nos vamos al String Data reference, y veremos entre otras, estas dos cadenas de texto. Pulsaremos encima de la de "Código correcto" donde nos llevará a la parte del código donde se muestra esta cadena de texto. Esto nos llevara a la dirección 00401037. Si nos fijamos en la dirección 00401035 veremos que hay un salto condicional el JNE, este nos dice que salte a la dirección 00401055 si no es equivalente. Es decir si el código no es el correcto salta a esa dirección. Si miramos en esa dirección lo que hay, es la parte donde nos dice que el código es incorrecto. Entonces cual sería la solución? La solución estará en cambiar ese salto condicional por otro. En este caso tendríamos que decir si el código es incorrecto no saltes y sigue con tu camino. Es decir habría que cambiar el JNE por JE. Con esto conseguiríamos que al colocar el código correcto el programa saltaría a la dirección donde el programa no se registra,y viceversa, colocando el código incorrecto, nos registraría el programa. Ahora bien, como cambiamos ese JNE por el JE? Para ello tendremos que usar un Editor Hexadecimal. Una vez abierto el fichero con el editor hexadecimal, tendremos que ir a la parte del código que hay que cambiar. Para ello en el W32Dasm colocaremos el cursor justo donde esta el salto en este caso el JNE 00401055, y en la barra de estado (abajo) veremos que nos pone el OFFSET de donde esta esa parte del código. Con el editor hexadecimal, buscamos en el menú "Ir a la dirección" o "ir al offset" y colocamos el offset, en este caso 000001035h. Donde nos mandará directamente a la parte del código a modificar. Solo veremos muchos números y caracteres ya que esto es todo código maquina. Pero si nos fijamos en el W32Dasm entre la dirección de memoria (00401035) y el código en ASM (jne 00401055) tenemos unos números en hexadecimal (751E) que coinciden justo donde estamos en el editor hexadecimal. Si miramos la tabla de Saltos condicionales veréis que la instrucción JNE su código en hexadecimal es el 75, y la instrucción JN su código enhexadecimal es el 74. Tan solo tendríamos que cambiar con el editor este 75 por un 74 y grabar el programa. Ahora lo ejecutaremos para ver si funciona correctamente.
Si por casualidad pusiéramos el código correcto, nos daría el error de que el código es incorrecto. Si se quiere probar el código que en principio era el correcto es : 1631985. Ahora ya sabemos dos maneras diferentes de des proteger un programa. Así sabremos a la hora de programar nuestro Soft que no hay que hacer, para que nos lo des protejan. Aun qué parezca mentira mucho software que corre por el mercado, tienen muy poca seguridad y es muy fácil saltarse las medidas de seguridad del programa. No son tan fáciles, pero si del mismo estilo. Capitulo 3 Espero haber podido transmitir lo que he querido transmitir y intentéis hacer un software que sea lo mas seguro posible. Escrito por |RooT| #include <Programer_at_work.h>
|