Funcionamiento del OllyDBG ""Bueno como había prometido, aquí comenzaremos a investigar el funcionamiento del OllyDBG, para llevar adelante nuestros fines. Como ya había explicado este programa es un desensamblador debugeador, que a mi gusto es de lo mejor por el sencillo interfaz intuitivo que tiene. Como me imagino que ya habrás bajado el programa, y habrás probado lo que te dije el capítulo anterior, no???? jajaja, si que eres vago. Bueno ha llegado la hora asi que bájate el programa e instálalo de una vez ;). Bueno comenzaremos descargando algún programa, busquen algún crackme en lo posible, para empezar a experimentar. Incluiré ahora un gráfico para utilizarlo para tomar referencias, para explicar lo que estamos viendo.
Como podrán notar, si es que no se han quedado ciegos de pasar mucho tiempo delante de la PC ;) , he remarcado las diferentes areas del programa con distintos colores para poder distinguirlas y de esta manera
poder explicar más sencillamente a qué hacen referencia. ROJO: En este lugar podemos ver la dirección que se le ha asignado a la orden, esto nos servirá para poder orientarnos dentro del programa, y una vez ubicado el de nuestro interés, simplemente anotándolo no tener que repetir todo el proceso una y otra vez. AZUL: Es el valor hexagesimal. Este es un sistema de numeración en base 16, que utiliza hasta el número 9 luego del cual comienza a utilizar letras hasta completar la escala, para que lo vean más claramente incluiré una tabla de conversión de los primeros valores para que lo vean: DEC-->1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ....... HEX-->1 2 3 4 5 6 7 8 9 A B C D E F 10 ....... VERDE: Aquí observaremos el area donde se hallan las órdenes en lenguaje ASM , como anteriormente he dicho para nuestros fines no será necesario conocerlas todas, aunque si muy útil para entender la rutina que realiza el programa, especialmente cuando nos avoquemos a obtener un serial. NARANJA: Se verán los registros, para qué nos interesa eso?, a diferencia de otros lenguajes en ASM no se pueden definir variables indefinidas, si no que los valores se transpasan entre las que pueden ver en el gráfico, por lo tanto podremos ver allí el valor que toma, que como me imagino que ya habrán pensado en algún momento será nuestro objetivo el que se halle allí almacenado. AMARILLO: Podremos ver la "Dump" o basura en castellano, he leído en repetidas ocasiones que es útil personalmente no me ha sido de gran ayuda hasta ahora, pero nunca se sabe por cierto. Debemos saber que estos programas llaman a ciertas funciones que ya se hallan predefinidas en los módulos, para clarificar esto hagan lo siguiente en el programa que tienen debugeado en el OllyDBG, hagan click con el botón derecho del mouse y si posan sobre al opción VIEW, se desplegarán todos los modulos que se utilizan durante el programa. Para ver con mayor exactitud cuales son las funciones que se llaman (API para decirlo más concretamente), haremos de nuevo click con el botón derecho pero iremos a SEARCH FOR... , y una ves posados allí a NAME (LABEL) IN CURRENT MODULE, además de verlas se nos especificará la dirección la sección y el tipo que es si de importación o de exportación.
Otra opción que nos ocupará será SERCH FOR.... > All REFERENCES TEXT STING , que como imagino ya habrán descubierto por su nombre hace que se busquen todas las cadenas de texto existente dentro del módulo.
Si ampliamos la solapa DEBUG veremos varias opciones, a continuación lo que haré será, explicar qué opciones nos ocuparán y sus respectivos atajos para poder trabajar más cómodamente en nuestro ordenador, pudiendo independizarnos relativamente del mouse durante el manejo del programa para hacerlo de forma más agil, si bien al comienzo tomará más tiempo, con el acostumbramiento agilizará mucho el proceso. Estas son: VIEW >Breakpoint // DEBUG >RUN // DEBUG >Restart // DEBUG >Step Intro // DEBUG >Step Over // Estas serán principalmente las opciones que nos ocuparán, existen otras útiles, pero las veremos más adelante cuando sean necesarias.
BREAKPOINT: Antes que nada explicaré lo que significa esto. Como el nombre lo indica es un punto de ruptura, es decir, cuando apliquemos un breakpoint a alguna parte del programa tendrá como resultado que la ejecución del mismo se detendrá allí. Existen varios tipos de breakpoint, utilizaremos el toogle cuya tecla de atajo en F2 , y lo que hace es poner un punto break fijo, a diferencia de otro caso como podría ser el breakpoint que se ejecuta solo una vez o de memory access, etc. Esta opción concretamente en sí, nos permitirá ver todos los breakpoint utilizados sobre el programa para poder visualizarlos más fácilmente y poder de esta manera manipularlos. RUN: Como su nombre lo indica esto hará que corra el programa, su tecla de atajo es F9.
Restart: Esta opción limpiará la pantalla y desensamblará el programa de nuevo, su tecla de atajo es Ctrl+F2. Step Over: Esta opción avanzará paso por paso dentro de las ordenes de ejecución del programa, nos servirá para realizar lo que se llama proceso de traceado o simplemente "tracear". Cuando traceamos lo que estamos haciendo es seguir paso por paso la ejecución del programa pero no simplemente para visualizarlo, si no por ejemplo si el programa realiza una comparación y luego hay un salto lo que hará es según el resultado tomar el salto o no y en caso de tomarlo arrojarnos a la zona del programa hacia donde estaba orientado dicho salto. Su tecla de Atajo es F8. Step Into: Esta es similar a la anterior con la diferencia de que con esta ingresaremos en las llamadas (CALL), es decir podremos ver el proceso que realiza esta. Por ejemplo en un call se da la generación de una frase, si seguimos con F8 (recordemos, se los acabo de decir ;) , que es para Step Over) , pasaremos al siguiente paso viendo el resultado, sin entrar en la llamada, en cambio con F7 (tecla de atajo de Step Into) , ingresaremos al proceso que se realiza dentro de la llamada. Debemos ser muy cuidadosos cuando utilizamos esta opción al treacear, ya que algunas llamadas nos llevan a otro módulos (recordemos las API) , lo que podría despistar completamente al nuevo usuario. Conjuntamente con esta herramiento aprovecharé la oportunidad para referirme al W32Dasm. Esta herramienta es a mi entender un desensablador pero tiene la paticularidad que pondrá las cosas más claras para poder realizar una mejor lectura del funcionamiento del programa, ya que dentro del mismo desensamblado se hace la referencia a desde que lugares son llamadas las funciones y por ejemplo en ciertos programas las referencias a las cadenas de texto son visibles desde este y no desde el olly por ejemplo. Les recomiendo simplemente que se lo descarguen y le echen una ojeada , con lo explicado para el OllyDBG no tendrán el menor problema para entender el funcionamiento del mismo.
""El Crackme puede bajarse de la zona de descargas de indaya en Seguridad >Cracking Bueno gente, siendo consciente de la impaciencia que los ocupa, y a riesgo de aburrirnos comenzaremos en este capítulo a acercarnos al primer programa :) .El objetivo será un crackme V1.0 de cruehead que obtuve con el curso de Ricardo Narvaja (muy recomendado para aquellos que se decidan por el Softice en lugar del OllyDBG), creo que el autor no se molestará, ya que este curso es con fines educativos y siempre es bueno aprender ;). Lo primero que haremos será, claro está, registrarnos, al menos que seas de esas personas que se ganan la lotería me imagino que es altamente probable que te salte el siguiente mensaje "No Luck there,mate!". Entonces tomaremos lápiz y papel y anotaremos este mensaje que es el que nos dá el programa cuando nos registramos
incorrectamente. Ahora pensemos lo siguiente, hemos ingresado un serial y nos ha retornado un mensaje donde nos dice que el serial es incorrecto, momento... cómo diablos lo sabía?, luego de pensarlo un rato llegamos a la conclusión lógica, nuestro serial en algún momento ha tenido que ser comparado con el primero para que el crackme llegue a saber que no era válido. Entonces nos queda después de pensar un poco más el siguiente esquema: El programa captura nuestro serial >lo compara con el original >llego a la conclusión que no es igual >Salta a la zona del Mensaje de error. Escribo este esquema en mi hoja justo debajo del mensaje de error y en mi hoja miro toda la información que junte y me queda algo como lo siguiente: Nombre del Programa: CrackMe v1.0 Autor:Cruehead Msg de Error: "No Luck there,mate! El programa captura nuestro serial >lo compara con el original >llego a la conclusión que no es igual >Salta a la zona del Mensaje de error. Me quedo un rato mirando la hoja mientras fumo un cigarrillo, y se me enciende la lamparita ;), qué pasaría si pudiese evitar que el programa luego de comparar los serial saltara a la zona de error... mmmmm, entro al Wdasm y lo desensamblo y luego de borrar el salto que hay después de la comparación...BUUUUUUUUUUUUUUUUUU, lo único que he conseguido es que el programa se me cuelgue al intentar registrarme, evidentemente la cosa es por ahí pero esa no es la solución. Pienso un poco más y digo, y si cambio el salto para que salte si son iguales, por lo tanto si son diferentes saltaría a la parte del programa donde estaremos registrados, interesante , interesante.... Desensamblo mi objetivo con el Wdasm y busca las referencias de cadenas de texto (el botón de la derecha de todo al lado del de print, "String Data References") y veo algo así:
O por dios! si está allí ni más ni menos que el mensaje de error que salta al ingresar un serial falso, mmmm... haremos doble click sobre él a ver donde está y me arroja a la posición de la memoria 004013B4, así que aquí está la zona de "mal chico". Apuntamos está dirección en nuestra hoja como más nos guste llamarla, yo por ejemplo puse, Posición de Msg de Error 004013B4. Ahora a continuar... comienzo a mirar para arriba para ver desde donde han llamado al mensaje de error, paso por el lugar que hace referencia a una string que dice "No Luck!", me huele que busca despiertarno, seguiremos con lo que tenemos hasta ahora, seguimos subiendo un poco más y veremos algo así: Referenced by a (U)nconditional or (C)onditional Jump at address : 0040138B (C) Esto quiere decir que la zona de error fue llamada desde esa dirección, así que como con todo descubrimiento, a la hojita. Inmediatamente iremos a esa dirección a ver que diablos ocurre por esos lados. Vamos en las opciones del Wdasm a goto >Goto code location o tocamos Shift+F12 e iremos a esa dirección. Nos deposita allí y estamos sobre una orden que dice Jb , y la zona de la memoria de donde venimos . Bueno este Jb ( no no, no está hablando de la marca de whisky, significa Jump if Below), es muy bonito pero no lo queremos dentro de nuestro programa ya que nos está llevando donde no queremos ir. Ahora que tenemos la dirección cerramos el Wdasm y nos vamos al
OllyDBG y desensamblamos el Crackme. Hacemos click sobre la pantalla ya vamos a GO TO >Expression, e ingresamos a la dirección de la memoria que queremos ir. Pero que le haremos a este pobre JB , lo modificaremos para que salte si los serial son iguales por lo tanto si son diferentes....ejemmm , pensemos que pasará. Nos situamos sobre el salto y hacemos un click con el botón derecho del mouse y vamos a la opción assemble.
Aquí modificamos el JB por un JE (Las modificaciones realizadas en ollyDBG son provisorias, más adelante veremos como hacerlas permanentes), asi saltará si son iguales y vamos a Debug >RUN e intentamos registrarnos Y........BUUUUUUUUUUU.... agua, no ha pasado nada ese tedioso mensaje sigue en el mismo lugar, pero por más pesada que sea la piedra siempre hay una forma de moverla ;), así que volvemos al Wdasm y volvemos a las cadenas de texto y vemos el mensaje de error, hacemos doble clic y estamos en la misma zona de la memoria de siempre, si le damos otro doble click sobre el mensaje.... O DIABLOS, está en otra parte también el mensaje o sea que el programa solo buscaba despistarme....maldito, caí en la trampa pero te he pillado igual. Esta vez caemos sobre 401370, asi que a la hoja y lo anotamos y escribimos que lo anterior era un engaño para recordarlo. Y ahora igual que antes nos interesa ver desde donde
se llama esta posición y vemos que es llamada desde 401245, así que anotamos y allá nos vamos. A ver que hoy, justo encima de esa posición vemos un JE siguiendo a una comparación, demasiado sospechoso para mi gusto jeje. Así que anotamos la posición del JE 401243 y me posiciono encima del salto y lo sigo con el botón Jump To a ver a donde nos lleva. Si alguien se molestó en mirar bien y no se dedica unicamente a hacer lo que aquí les digo ;) habrá notado que en las referencias de cadenas había un mensaje que decía "Great Work,mate!" , y si alguno milagrosamente por curiodad le hizo doble click y ya por gracia divina miró desde donde era llamado.... BINGOOOOOOOOOOOO estamos en el mismo lugar o sea que ESE es nuestro salto muchachos. Ahora entonces nos vamos a toda velocidad al OllyDBG y nos posicionamos sobre el salto y en assemble lo cambiamos por un JNE , para que salten si no son iguales y le damos RUN (F9) e intentamos registrarnos y lo tenemos nos sale un mensaje de felicitaciones :). Lo hemos logrado. Bueno espero que se hayan divertido, ha sido un capítulo bastante fructifero, ya hemos crackeado nuestro primer programa. Escríbanme para decirles si les ha gustado, cualquier duda o sugerencia.""
""En este capítulo veremos como crackear el mismo Crackme, pero si no pudiésemos ver las string references, es decir, imagínense que cuando lo desensamblamos con el wdasm o miramos las referencias de texto en el OllyDBG y no encontramos nada, qué hacemos?. Bueno para resolver esta preguntra, aclararemos lo siguiente, además de poder situar lo Breakpoint en ciertos lugares del programa como hemos hecho en el capítulo anterior, existen las llamadas funciones API, que son funciones que existen en Windows y el programa utiliza para no escribir funciones que ya puede utilizar tomándolas de otro lado. La idea será utilizar estas funciones para que nos guíen a la zona deseada, para poder encontrar el salto condicional que deseamos cambiar. En este caso la función API que utilizaremos es una llamada MESSAGEBOXA , que es la que dibuja las ventanitas con mensajes, así que pensaremos que si podemos ubicar cuando el programa llama a esta función para dibujarnos la ventanita de NO LUCK THERE MATE, podremos ubicar desde donde se realiza la comparación, ya que antes de dibujarla checkeará si nuestro serial es correcto. Dicho esto, ponemos manos a la obra. Como siempre lo primero que haremos será irnos a nuestro querido OllyDBG, y desensamblaremos el Crackme. Hecho esto le daremos a F9 (para que corra el debugeador y se ejecute el programa), y luego haremos click derecho sobre el programa desensamblado e iremos a SEARCH FOR >Name (label) in current module, o simplemente pulsaremos CTRL+N, lo que es equivalente y obtendremos algo como lo siguiente.
Bueno aquí estamos delante de los módulos que se utilizan. Lo que haremos será localizar el que nos interesa MESSAGEBOXA. Aquí veremos una diferencia, mientras que con el Softice bastará poner BPX MESSAGEBOXA, para poner un breakpoint en la función, aquí lo que haremos será seguirla para ver desde donde se utiliza, ya que con un Breakpoint no llegaremos a nada :) . Entonces lo siguiente, ubicada la función nos situaremos sobre ella y le daremos al botón derecho del mouse, y lo que nos ocupa a nosotros es ver desde qué lugares es llamada, así que iremos a la opción FIND REFERENCES TO IMPORT y allí nos salen 4 direcciones 40135C, 401378, 4013BC, 40143A . Si hacemos doble click sobre la primera (para que nos lleve al programa desensamblado, a la posición desde donde se llama) veremos que se trata de la ventana de que hemos ingresado el serial correcto, es claro que esta no nos interesa, ya que si ingresamos el serial incorrecto no utilizará dicho mensaje :p . Así que seguimos, si hacemos doble click sobre el segundo y el tercero, veremos que ambos hacen referencia a la ventanita de error, mmmmm... por aquí debe ser el asunto. Pero miro y digo "son dos", algo no está bien, y es allí donde usando la memoria me acuerdo que ya en el capítulo anterior, el programa me había engañado
llevándome por un camino falso, así que procederé con cautela. Hago doble click sobre la que se llama desde 401378 y debajo de la posición en la que me arroja, hay un RETN (return, es decir que utiliza la función y me devuelve mediante esa orden, debajo de la posición desde la cual fue llamada para dibujar la ventana), así que pondremos con F2 un Breakpoint en ese RETN, he intento registrarme, esta vez lo hemos pillado, ya que el programa nos arroja el error inmediatamente luego de intentar registrarnos, lo que nos está diciendo que nuestro Breakpoint no ha detenido el programa, por lo que el programa no utiliza la zona donde pusimos con F2 el Break, por lo tanto este es el mensaje de error que nos había engañado en el capítulo pasado. Así que sabiendo esto hacemos doble click sobre 4013BC, e igual que con el anterior vemos que debajo de donde nos arroja, hay un RETN, al que le pondremos un Breakpoint , y luego intentaremos registrarnos. En esta ocasión el programa se ha detenido ;), así que le daremos a F8 para que nos devuelva, y nos arroja sobre la posición 401232, hasta aquí vamos bien pero, mmmm.... este lugar me resulta familiar,aaaaaa....como no? si no es más ni menos que donde la otra vez habíamos hallado el salto a modificar la última vez jajaja ;), si miramos 5 y 6 órdenes hacia abajo respectivamente veremos la comparación y el salto, modificaremos el salto igual que la vez anterior posicionándonos sobre él , le damos a la barra espaciadora, para que nos lleve a la opción Assemble y allí modificamos el salto JE por un JNE, y ... BINGO , lo hemos logrado una vez más y no hemos precisado las referencias de texto ;). Escríbanme para decirles si les ha gustado, cualquier duda o sugerencia.""
Bienvenidos a este nuevo capítulo del curso de cracking, en esta oportunidad lo que haremos será registrarnos en el conocido programa de chat Mirc. Para esto lo que haremos será bajarnos de http://www.mirc.com/ www.mirc.com el programa, si es que ya no lo tienen, y lo instalamos en nuestra PC. Una vez que hicimos esto, lo abriremos y nos aparecerá una ventana que dice que nos quedan unos días para que venza el periodo de prueba....mmmmm...interesante, ya que nos indica que hay una rutina para checkear los días que faltan para que expire el programa, la cual podriamos atacar, pero primero a lo primero. Si vamos a la pestaña HELP del programa encontraremos una opcion que dice REGISTER... , allí lo que haremos será como siempre intentar registrarnos claro está, y aparece un mensaje diciéndonos, "THE REGISTRATION NAME AND NUMBER YOU HAVE ENTERED ARE NOT VALID.PLEASE MAKE SURE YOU ARE ENTERING THE REGISTRATION USING THE CORRECT CAPITALIZATION AND SPACING". Ok , ya tenemos el mensaje de error que nos arroja al registrarnos como para buscar por donde viene el asunto ;). Lo que haremos será como siempre hoja y lapicera en mano y anotar este descubrimiento, y de inmediato (si es que ya no lo hicieron como sospecho que algunos ya han adelantado ;) ), lo desensamblamos con el Wdasm... Allí iremos a las referencias de cadena de texto y lo que haremos será encontrar el mensaje de error que nos arroja al registrarnos incorrectamente. La encontraremos en String Resource ID=1909:"...", si hacemos doble click nos arrojara sobre la zona que se corresponde a este mensaje 004C7D34 , le haremos doble click de nuevo para ver si no es llamada desde otra parte, nada solo desde ahí :). Pero aquí lo que haremos será encontrar el que dice que nos hemos registrado correctamente, que se halla una o dos cadenas por encima de la anterior mencionada, y al hacer doble click nos arrojará sobre la dirección de la memoria 004C7C5B . Con estos datos (que de más está decir que me imagino que todos hemos tomado nota jaja), cerramos el Wdasm y nos vamos a nuestro amado OllyDBG. Una vez que abrimos el programa con F9 lo echamos a andar y con el
botón derecho vamos a Go To > Expression, y allí vamos a la zona anteriormente indicada. Una vez allí para ver si nos hallamos en lo correcto ponemos sobre esa posición un Breakpoint con F2 , y lo que tiene que ocurrir es que el programa se detendrá??..... NOOOOO, no han prestado atención NO PASARA NADA, porque estamos poniendo un breakpoint en el mensaje de registración correcta y lo que nos arrojará (a menos que tengáis mucha suerte) es el mensaje de error de registración incorrecta :) jajaja. Entonces que hacemos esto supuestamente detendría el mensaje de registración correcta... pero de nada nos ayuda, lo que haremos entonces es comenzar a mirar el código más arriba, hasta donde aparezca un return, lo que indica el final de la rutina anterior y el comienzo de ésta que estimamos será donde checkeara mi serial.... Vamos subiendo y vemos aproximadamente que en la dirección 004C7BD2 aparece el serial que intentamos ingresar seguido de nuestro usuario, de lo que deducimos que en el próximo salto ya tendrá comprobado nuestro serial y nos arrojará hacia la zona de error, por lo que inmediatamente lo ubicamos y vemos sin mayores problemas que se halla en la dirección 004C7BE3, entonces nos situaremos sobre ésta y tocaremos la barra espaciadora (o assemble con el botón derecho del mouse como más gusten ;) ) y cambiaremos como hemos aprendido el JE , por un JNE (saltar si son diferentes), e intentamos registrarnos :).
Bueno eso ha sido todo espero que les haya gustado y hayan aprendido algo. Claro está que los cambios se irán al cerrar el OllyDBG pero de eso hablaremos más adelante, ya que me imagino que nadie quiere hacer nada indebido jajaja.... Escríbanme para contarme si les ha gustado.
7 - Cómo matar los bytes Curso gratis creado por JaMaikito . Extraido de: http://www.indaya.com Bueno, con demoras pero henos aquí. Bienvenidos al capítulo número 7 de este cursillo de cracking. Hasta ahora hemos visto como desensamblar un programa, reconocer los saltos necesarios, etc...
En este capítulo veremos como matar los bytes, es un tema extremadamente sencillo, así que ser á breve :D. Como recordaremos el salto JE se correspondía con el valor hexagesimal 84 / 74 y el JNE con el valor 85 / 75 , qué significa entonces esto de "matar los bytes", quiere decir r ealizar el cambio que habíamos hecho en el ollydbg de forma permanente.
Para esto utilizaremos un editor hexagesimal, aquí utilizaremos el Hiew, lo puedes descargar de la zona de descargas de indaya-->seguridad-->cracking o haciendo click aqui http://www.indaya.com/modules/mydownloads/singlefile.php?cid=23&lid=158 Hiew, tiene un entorno gráfico al estilo del softice, o sea que lo manejaremos con el teclado. Las funciones que nos interesarán son:
~- F4: Mode--> aquí cambiaremos en como queremos ver e l programa Text, Hex (hexagesimal), Decode. ~- F7: Search--> nos servirá para ubicar la cadena que querramos cambiar. ~- F3: Edit --> Para realizar la edición. ~- F9:Update-->para que se mantengan los cambios realizados. ~- F10:Quit --> mmmmmmm.......
Bueno teniendo todo esto desensamblaremos el Crackme v1.0 que tenemos desde el capítulo 3, buscamos donde se hallaba el salto, como no soy tan malvado como para hacerlos hacer todo el tr abajo de nuevo jajaja, les recordaré que el salto se hallaba en la dirección 401243 , allí veremos que al costado se halla el valor hexagesimal que es 74 07, lo que haremos es lo siguiente, tomaremos una hoja y un papel y anotaremos este valor hexagesimal seguido de algunos más consecutivos para poder encontrar la cadena en el Hiew.
Ej. nos quedaría algo así: 74 07 E8 18 01 00 00 EB 9A
Una vez que tenemos esto corremos e l Hiew y abrimos el Crackme1.exe . ~- Una vez que lo tenemos allí presionamos F4 y elegimos el modo Hex, ~- luego F7 e insertamos la cadena que queremos, nos posicionamos sobre el 74 (JE) , ~- le daremos al F3 y lo cambiaremos por un 75 (JNE) , ~- tocaremos F9 para que se actualice y luego F10 para salir ~- Ahora abran el programa e intenten registrarse ;) . jajajajja. Espero que les haya gustado, escríbanme si tienen dudas o comentarios: mailto:
[email protected] [email protected]