{"id":79,"date":"2012-04-03T18:29:46","date_gmt":"2012-04-03T18:29:46","guid":{"rendered":"http:\/\/52.15.227.128\/?p=79"},"modified":"2018-01-03T23:34:06","modified_gmt":"2018-01-03T23:34:06","slug":"introduccion-al-cracking","status":"publish","type":"post","link":"https:\/\/0aps.me\/blog\/2012\/04\/03\/introduccion-al-cracking\/","title":{"rendered":"Introducci\u00f3n al Cracking"},"content":{"rendered":"<p>Este art\u00edculo fue escrito para una colaboraci\u00f3n con un amigo en un esfuerzo de tener una distribuci\u00f3n local parecida a las famosas <a href=\"https:\/\/es.wikipedia.org\/wiki\/Los_Cuadernos_de_Hack_x_Crack\">revistas HackXCrack.<\/a><\/p>\n<p>Huelga decir que ese proyecto no avanz\u00f3 (no recuerdo las razones) pero ya ten\u00eda escrito parte del art\u00edculo sobre el tema que quer\u00eda abordar. A continuaci\u00f3n la versi\u00f3n in\u00e9dita.<\/p>\n<h2 style=\"text-align: center;\"><strong><em>Introducci\u00f3n al Cracking<\/em><\/strong><\/h2>\n<p><strong><em>INDICE:<img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium\" src=\"https:\/\/i.imgur.com\/DiznDBM.png\" width=\"95\" height=\"71\" \/><\/em><\/strong><br \/>\n0x00 Introducci\u00f3n<br \/>\n0x01 Conceptos b\u00e1sicos de Assembler<br \/>\n0x02 Ollydbg<br \/>\n0x03 Ejemplos<br \/>\n0x04 Final<br \/>\n<strong><br \/>\n<\/strong><strong>0x01 Introducci\u00f3n<\/strong><\/p>\n<p>Buenas a todos, en este mini paper se explicar\u00e1 una breve introducci\u00f3n al mundo del cracking y la ingenier\u00eda inversa de modo que el lector que comienza su traves\u00eda por estas calles pueda orientarse de manera \u00a0pr\u00e1ctica y sencilla. Tratare de escribir el contenido lo mas llano y din\u00e1mico posible para que sea f\u00e1cil de entender. Hay que dejar claro que el paper esta enfocado en Windows y las nociones que se explicaran de assembler ser\u00e1n sobre el ensamblador\u00a0 FASM de 32 bits y que trabaja con sintaxis Intel. Si aun no entienden bien esto no se preocupen, mas adelante tratare el tema pero pienso que es oportuno aclarar esto.<\/p>\n<p>Pues nada, comencemos refrescando los conceptos b\u00e1sicos:<\/p>\n<p>Los programas inform\u00e1ticos est\u00e1n escritos en lenguajes de programaci\u00f3n\u00a0 (C\/C++, Visual Basic, Perl, Python, Delphy, etc.) y almacenados en lo que se conoce como <u>c\u00f3digo fuente<\/u>, este es compilado o interpretado (depende del lenguaje) para procrear el ejecutable.<\/p>\n<p>Como estoy seguro que ya todos sabr\u00e1n, nuestro ordenador solo entiende secuencias de ceros y unos, por lo tanto, el c\u00f3digo de cualquier lenguaje de programaci\u00f3n le es indiferente, o sea no lo puede entender as\u00ed tal cual. Aqu\u00ed es donde entra el \u00a0<strong>lenguaje m\u00e1quina <\/strong><strong>que<\/strong> consta de secuencias de estos 0 y 1 que el microprocesador entiende directamente.<\/p>\n<p>El procesador trabaja con c\u00f3digo binario (ceros y unos) ya que se opera con transistores que s\u00f3lo pueden estar de dos formas: abierto o cerrado, 1 o 0 Un bit es una unidad de informaci\u00f3n que s\u00f3lo puede representar dos valores 1 \u00f3 0. Dado que es muy dif\u00edcil e inc\u00f3modo representar cualquier cosa en binario, el sistema m\u00e1s usado para la representaci\u00f3n de datos y valores es el <a href=\"http:\/\/es.wikipedia.org\/wiki\/Sistema_hexadecimal\">Sistema Hexadecimal<\/a>.<\/p>\n<p>Un byte (8bits) es la unidad b\u00e1sica en la que se mide la informaci\u00f3n. Cada una de las celdillas l\u00f3gicas en que se divide la memoria del ordenador, tanto RAM como ROM, tienen capacidad para un byte. Aparte del bit y byte se suelen utilizar a menudo <strong>word <\/strong>y <strong>dword. <\/strong>En resumen:<\/p>\n<p>1 bit\u00a0 = \u00a00 \u00f3 1;\u00a0 1 byte\u00a0\u00a0 =\u00a0\u00a0 8 bits;\u00a0\u00a0 1 word \u00a0= \u00a02 bytes; \u00a0\u00a01 dword \u00a0= \u00a04 bytes.<\/p>\n<p>Ahora, aclaremos conceptos que son muy utilizados en el \u00e1mbito del cracking:<\/p>\n<ul>\n<li><strong>Ingenier\u00eda Inversa:<\/strong> es el arte de <u>examinar <\/u>alg\u00fan programa (del cual no se posee su c\u00f3digo fuente) con el \u00fanico objetivo de <u>conocer su estructura y funcionamiento<\/u> hasta el punto de poder imitarlo a la perfecci\u00f3n. El termino no solo se aplica al \u00e1rea de software, tambi\u00e9n se puede emplear \u00a0a cualquier otra cosa si se posee el mismo fin.<\/li>\n<li><strong>Cracking:<\/strong> consiste en la <u>modificaci\u00f3n<\/u> de alg\u00fan programa\u00a0 con el fin de <u>cambiar<\/u> su comportamiento y obtener un beneficio il\u00edcito. En la mayor\u00eda de los casos esto var\u00eda desde conseguir el n\u00famero serial de un software hasta saltarse un tipo de protecci\u00f3n que implemente un programa.<\/li>\n<li><strong>Depurador o Debugger: <\/strong>es el programa que se utiliza para <u>probar<\/u> de manera detallada (paso x paso) el funcionamiento de un programa. M\u00e1s simple, nos permite saber que esta sucediendo dentro de otro programa mientras se esta ejecutando. Usualmente es utilizado por los programadores para facilitar la correcci\u00f3n de errores en la creaci\u00f3n de alg\u00fan software y en el cracking es la herramienta <u>esencial<\/u> para alcanzar nuestro objetivo. Entre los depuradores m\u00e1s comunes esta: el GDB, Ollydbg, Cheat Engine, Ida Pro y el SoftICE.<\/li>\n<li><strong>Desensambladores: <\/strong>es el programa encargado de <u>traducir<\/u> las instrucciones de un ejecutable de c\u00f3digo maquina (binario [ceros y unos]) a ensamblador (ASM). En ocasiones el c\u00f3digo obtenido puede no estar de la manera esperada ya que puede estar empaquetado o comprimido. Ejemplo de desensambladores: Ollydbg, Cheat Engine, Ida.<\/li>\n<li><strong>Empacadores o Packers<\/strong>: son programas que <u>protegen, ofuscan, comprimen o reducen<\/u> una aplicaci\u00f3n.\u00a0 Ejemplos: UPX, Armadillo, Themida.<\/li>\n<li><strong>Editor Hexadecimal<\/strong>: es un programa que nos permite <u>ver y modificar<\/u> un ejecutable en el sistema <u>hexadecimal<\/u>. Es muy utilizado para tareas sencillas como modificar un n\u00famero espec\u00edfico de bytes. Modificando los bytes tambi\u00e9n se modifican las instrucciones que est\u00e9n asociadas a ellos, influyendo en su comportamiento. Ejemplo: 010 Editor, Hex Editor.<\/li>\n<li><strong>Compilador<\/strong>: programa encargado de <u>traducir<\/u> el <u>c\u00f3digo fuente<\/u> de un lenguaje de programaci\u00f3n al <u>c\u00f3digo maquina<\/u>.<\/li>\n<li><strong>Dumper<\/strong>: es un programa que puede <u>volcar o extraer datos<\/u> de la memoria de un proceso. Tomar rangos o posiciones aleatorias y vertirlos en otro lado para ver y analizar su contenido.<\/li>\n<li><strong>Direcci\u00f3n de memoria: <\/strong>es un identificador para una localizaci\u00f3n de <a href=\"http:\/\/es.wikipedia.org\/wiki\/Memoria_%28inform%C3%A1tica%29\">memoria<\/a>. Las direcciones son asignadas por el <a href=\"http:\/\/es.wikipedia.org\/wiki\/Sistema_operativo\">sistema operativo<\/a> a cada programa en ejecuci\u00f3n. El rango de valores naturales que pueden ser almacenados en un sistema de 32 bits es de 0 hasta 4.294.967.295 direcciones.<\/li>\n<li><strong>Direcci\u00f3n HardCodeada: <\/strong>es usa direcci\u00f3n encontrada a mano, debido a que pude variar dependiendo del sistema operativo o la versi\u00f3n de alg\u00fan software.<\/li>\n<li><strong>Offset: <\/strong>es una direcci\u00f3n dentro de un binario, que indica un n\u00famero de bytes.<\/li>\n<li><strong>Interfaz de programaci\u00f3n de aplicaciones<\/strong><strong> o API<\/strong>: es el conjunto de <a href=\"http:\/\/es.wikipedia.org\/wiki\/Subrutina\">funciones y procedimientos<\/a>\u00a0 que ofrece una librer\u00eda para ser utilizado por otro software.<\/li>\n<\/ul>\n<p>Teniendo esos conceptos claros solo nos falta una breve introducci\u00f3n de la memoria y los procesos. Empecemos por lo m\u00e1s b\u00e1sico:<\/p>\n<p>Un programa, aplicaci\u00f3n, fichero, o ejecutable son los t\u00e9rminos empleados para referirse a\u00a0 un <u>archivo<\/u> con un conjunto de instrucciones compactadas en binario, esto ya lo dejamos claro arriba. En cambio un proceso es un <u>programa<\/u> <u>en ejecuci\u00f3n<\/u> con su espacio de memoria en donde posteriormente se cargaran las instrucciones contenidas en el archivo. Para cada proceso se carga un espacio de memoria diferente.<\/p>\n<p>Ahora <strong>\u00bf<\/strong>qu\u00e9 sucede? Que cuando se coloca un programa en memoria para ejecutarlo, no se coloca de la misma manera en la cual esta en el archivo. Cuando esta cargado en la memoria el contenido del archivo se separa y se alinea en secciones. Esto no sucede en el archivo puesto que todo est\u00e1 m\u00e1s pegado. Uno encima de otro.<\/p>\n<p>Por lo tanto una direcci\u00f3n de memoria y una direcci\u00f3n del archivo son totalmente diferentes. Cuando se habla de memoria f\u00edsica o RAW se esta refiriendo al archivo aun no cargado en memoria, en cambio cuando se habla de memoria virtual es el programa ya cargado en memoria para ejecutarlo.<\/p>\n<ul>\n<li><em>RVA = VA \u2013 ImageBase;<\/em><\/li>\n<li><em>VA\u00a0\u00a0\u00a0 =RVA + ImageBase;<\/em><\/li>\n<li><em>RAW = RVA &#8211; <strong>(<\/strong>VirtualAddress <strong>&#8211; <\/strong>PointerToRawData<strong>)<\/strong><\/em><\/li>\n<li><em>VirtualAddress\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 =\u00a0 direcci\u00f3n en donde comienza la secci\u00f3n en la memoria. <\/em><\/li>\n<li><em>PointerToRawData\u00a0\u00a0 =\u00a0 direcci\u00f3n en donde comienza la secci\u00f3n en el archivo.<\/em><\/li>\n<\/ul>\n<p>Despu\u00e9s de esta larga y tediosa informaci\u00f3n que es vital para entender lo que viene, pasemos a explicar los principios b\u00e1sicos de ensamblador. Creo que con lo que acabo de explicar ya es suficiente para crear una base sobre el tema.<\/p>\n<p><strong>0x01 Conceptos b\u00e1sicos de Assembler<\/strong><\/p>\n<p>El lenguaje ensamblador, assembler \u00a0(o assembly) en ingles o simplemente ASM en siglas, es un lenguaje de bajo nivel que tiene la capacidad de interactuar de manera directa con la arquitectura de el procesador. Al momento de programar en ensamblador se debe tener en cuenta la arquitectura bajo la cual se este trabajando debido a que si el programa se crea para una determinada plataforma (x86)\u00a0 no servir\u00e1 en otra (x64).<\/p>\n<p><strong>\u00bf<\/strong>Por qu\u00e9 es importante ensamblador? Pues por su incre\u00edble potencia, rapidez y versatilidad al momento de realizar tareas que requieran una interacci\u00f3n mas cercana con el procesador. Adem\u00e1s como vimos mas arriba es imprescindible en el cracking y la ingenier\u00eda inversa.<\/p>\n<p>Pues bien, en ensamblador existen lo que se llaman los registros. Los registros son peque\u00f1as zonas en donde se almacenan datos de manera temporal. Son pr\u00e1cticamente las variables del procesador.<\/p>\n<p>Existen diferentes tipos de registros que tienen diferentes prop\u00f3sitos, est\u00e1n:<\/p>\n<p>Registros de prop\u00f3sito general:<br \/>\nRegistro Puntero de Instrucciones (EIP)<br \/>\nRegistro de Estado o de Se\u00f1alizadores (EFLAGS)<br \/>\nRegistros de Segmento<\/p>\n<p><strong>Registros de prop\u00f3sito general:<\/strong> Son 8 registros capaces de trabajar con informaci\u00f3n de 32 bits en su mayor tama\u00f1o. Pueden usarse tanto para almacenar datos como direcciones. Su nombre empieza por &#8220;E&#8221; que significa extendido. Son los siguientes:<\/p>\n<ul>\n<li>EAX: Acumulador.<\/li>\n<li>EBX: Base.<\/li>\n<li>ECX: Contador.<\/li>\n<li>EDX: Datos.<\/li>\n<li>ESP: Puntero de pila.<\/li>\n<li>EBP: Puntero de base.<\/li>\n<li>ESI: \u00cdndice fuente.<\/li>\n<li>EDI: \u00cdndice destino.<\/li>\n<\/ul>\n<p><em>Nota: en la programaci\u00f3n de 64 bits se agregan otra forma para representar los registros: rax, rbx, rcx, rdx, rdi, rsi, rip, rbp, rsp.<\/em><\/p>\n<p>Estos registros, son capaces de trabajar con informaci\u00f3n de 32 bits, pueden manejar datos de 16 bits y cuatro de ellos pueden manejar informaci\u00f3n de 8 bits. Cuando se accede \u00fanicamente a los 16 bits de menos peso, se designan por AX, BX, CX, DX, SP, BP, SI, DI, respectivamente. A los registros AX, BX, CX y DX se puede acceder a sus registros AL, BL, CL y DL cuando se accede al byte de menos peso y AH, BH, CH y DH cuando se accede al byte de m\u00e1s peso.<\/p>\n<p>Ejemplo:<\/p>\n<ul>\n<li><strong>RAX:<\/strong> registro de 64 bits = \u00a08 bytes. Ej. 0000000011223344<\/li>\n<li><strong>EAX<\/strong>: registro de 32 bits = \u00a04 bytes =&gt; Ej. 11223344<\/li>\n<li><strong>AX<\/strong>:\u00a0\u00a0 \u00a0registro de 16 bits = \u00a02 bytes de menor peso de EAX =&gt; Ej. 3344<\/li>\n<li><strong>AH<\/strong>: \u00a0\u00a0\u00a0registro de 8 bits \u00a0= \u00a01 byte de mayor peso de AX =&gt; Ej. 33<\/li>\n<li><strong>AL<\/strong>: \u00a0\u00a0\u00a0registro de 8 bits \u00a0\u00a0= \u00a01 byte de menor peso de AX =&gt; Ej. 44<\/li>\n<li><strong>EAX<\/strong>: (EAX, AX, AH, AL).<\/li>\n<li><strong>EBX<\/strong>: (EBX, BX, BH, BL).<\/li>\n<li><strong>ECX<\/strong>: (ECX, CX, CH, CL).<\/li>\n<li><strong>EDX<\/strong>: (EDX, DX, DH, DL).<\/li>\n<li><strong>ESP (ESP, SP) y EBP (EBP, BP)\n<p><\/strong><\/li>\n<\/ul>\n<p>Estos registros son todos de prop\u00f3sito general porque son usados para desarrollar las tareas m\u00e1s comunes como almacenar datos o realizar las operaciones aritm\u00e9ticas. El de m\u00e1s importancia es el EAX porque la mayor\u00eda de las API tienen su valor de retorno en este registro.<\/p>\n<p>Para entender los \u00faltimos dos registros debemos conocer que es la pila. La pila es una estructura de tipo LIFO (ultimo en entrar, primero en salir) en donde se almacenan todo tipo de datos de manera temporal para luego utilizarse en alguna operaci\u00f3n. Nos podemos imaginar la pila como un mont\u00f3n de libros uno encima del otro. En donde solo puedo tomar el que esta en la cima para leerlo, los que est\u00e1n mas abajo no puedo tomarlos puesto que debo quitar el que esta mas pr\u00f3ximo primero.<\/p>\n<p>A esto hace referencia estos dos registros, al dato que esta en la cima (<strong>ESP) \u00a0<\/strong>y el que esta mas abajo (<strong>EBP).<\/strong><\/p>\n<p><strong>Registro Puntero de Instrucciones (EIP):<\/strong> (EIP IP) Es el registro que apunta a la siguiente instrucci\u00f3n a se ejecutada.<\/p>\n<p><strong>Registro de Estado o de Se\u00f1alizadores (EFLAGS)<\/strong>: Consta de 32 bits, de los cuales la mayor\u00eda son se\u00f1alizadores de estado. Esto se vera bien mas adelante cuando llegemos a la parte del Ollydbg.<\/p>\n<p><strong>Registros de Segmento<\/strong>: son registros que apuntan a una determinada zona de memoria ya sea la pila, el c\u00f3digo o los datos. Para controlar los segmentos, se dispone de varios registros de 16 bits. Estos son:<\/p>\n<ul>\n<li>-CS: Contiene la direcci\u00f3n al segmento de c\u00f3digo, es decir, a las instrucciones.<\/li>\n<li>-DS: Contiene la direcci\u00f3n al segmento de datos del programa.<\/li>\n<li>-SS: Contiene la direcci\u00f3n del segmento de la pila.<\/li>\n<li>-FS y GS: son registros de prop\u00f3sito auxiliar.<\/li>\n<li>-ES: es un segmento extra.<\/li>\n<\/ul>\n<p>En ensamblador existen las instrucciones con las cuales el lenguaje opera y funciona. La mayor\u00eda tiene la siguiente estructura.<br \/>\n<strong>Instruccion<\/strong> <em>destino, fuente.<\/em><\/p>\n<p>Las m\u00e1s comunes son:<\/p>\n<p>MOV, mueve datos de un sitio a otro.<\/p>\n<p>Ejs:<\/p>\n<p>mov eax,0x7.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0Se mueve el valor 7 al registro eax.<br \/>\nmov ebx, [eax]. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Se mueve el <u>contenido<\/u> del valor del registro eax a ebx.<br \/>\nmov [0x1007000],eax\u00a0\u00a0 Se mueve el valor de eax a la direccion de memoria 0x1007000.<\/p>\n<p><em>Nota: no se puede mover un dato entre dos direcciones de manera directa, para eso se debe pasar primero al alg\u00fan registro.<\/em><\/p>\n<p>ADD, suma un n\u00famero a un registro.<\/p>\n<p>Ej: add eax, 3.<\/p>\n<p>SUB, resta un n\u00famero a un registro.<\/p>\n<p>Ej: sub eax, 3.<\/p>\n<p>MUL, multiplica con eax el multiplicando.<\/p>\n<p>Ej: mov eax, 0x3<\/p>\n<p>mul eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;eax valdr\u00e1 0x9<\/p>\n<p>DIV, divide con edx.eax el divisor.<\/p>\n<p>Ej:\u00a0 mov edx, 0x9<\/p>\n<p>mov eax, 0x9<\/p>\n<p>div\u00a0\u00a0 eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;eax valdr\u00e1 0x1<\/p>\n<p>INC, incrementa el operando en 1.<\/p>\n<p>Ej: inc eax<\/p>\n<p>DEC, decrementa el operando en 1.<\/p>\n<p>Ej: dec eax<\/p>\n<p>PUSH, mete un valor a la pila.<\/p>\n<p>Ej: push, eax\u00a0\u00a0\u00a0\u00a0 ;pone el valor de eax en la pila<\/p>\n<p>PUSHPAD, mete todos los registros a la pila.<\/p>\n<p>Ej: pushpad<\/p>\n<p>POP, saca un calor de la pila.<\/p>\n<p>Ej. pop eax\u00a0\u00a0\u00a0\u00a0 ;toma el valor apuntado por esp y lo pone en eax<\/p>\n<p>POPAD, saca los \u00faltimos valores de la pila y los pone en los registros.<\/p>\n<p>Ej. popad\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0;equivale a pop edi,esi,ebp,esp,ebx,edx,ecx,eax<\/p>\n<p>JMP, salta hacia la direccion que se indique.<\/p>\n<p>Ej.\u00a0 mov eax, [0x01005FD2]<\/p>\n<p>jmp eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; se salta hacia 01005FD2<\/p>\n<p>jmp [eax]\u00a0\u00a0\u00a0\u00a0\u00a0 ; se salta hacia el contenido de 01005FD2<\/p>\n<p>A este salto se le conoce como salto incondicional porque procede sin importar nada. En cambio existen algunos\u00a0 saltos que conllevan una condici\u00f3n para poder proceder.<\/p>\n<ul>\n<li>JE \u00a0\u00a0\u00a0\u2013 Salta si los n\u00fameros comparados son iguales.<\/li>\n<li>JNE \u2013 Salta si los valores no son iguales.<\/li>\n<li>JG \u00a0\u00a0\u00a0\u2013 Salta si Valor1 es mayor que Valor2.<\/li>\n<li>JGE \u2013 Salta si Valor1 es mayor o igual que Valor2.<\/li>\n<li>JB \u00a0\u00a0\u00a0\u2013 Salta si Valor1 es menor que Valor2.<\/li>\n<li>JBE \u2013 Salta si Valor1 es menor o igual que Valor2.<\/li>\n<\/ul>\n<p>CMP, compara dos valores y es el complemento para los saltos condicionales y otras instrucciones.<\/p>\n<p>Ej: mov eax, 6<\/p>\n<p>cmp\u00a0 eax,4<\/p>\n<p>je\u00a0 01005FD2 \u00a0\u00a0; Aqu\u00ed si eax es igual a 4 saltar\u00eda a la direccion de memoria<\/p>\n<p>dec eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; pero como no es el caso se ignora el salto y sigue la otra instrucci\u00f3n<\/p>\n<p>CALL, llama a una funci\u00f3n, pr\u00e1cticamente guarda en la pila la pr\u00f3xima direccion a ejecutarse despu\u00e9s del CALL para tener un punto de retorno y luego salta hacia la direccion de la funci\u00f3n, se ejecuta y cuando encuentra un ret, salta hacia la direccion que se hab\u00eda guardado en la pila (que es la direccion pr\u00f3xima desde donde se llamo al CALL).<\/p>\n<p>Cuando se hace uso de la instrucci\u00f3n CALL para llamar a una funci\u00f3n primero se colocan dentro de la pila los par\u00e1metros de la funci\u00f3n.<\/p>\n<p>Ej: push 0<\/p>\n<p>call\u00a0\u00a0\u00a0 ExitProcess\u00a0\u00a0\u00a0 ; con esto se llama a la API ExitProcess y se termina la ejecuci\u00f3n.<\/p>\n<p>Estas son las nociones mas b\u00e1sicas del lenguaje con esto ya est\u00e1n listos para adentrarse en temas m\u00e1s profundos y empezar con el cracking. : )<\/p>\n<p><strong>0x02 Ollydbg<\/strong><\/p>\n<p>Ollydbg es un debugger de <a href=\"http:\/\/es.wikipedia.org\/wiki\/32_bits\">32 bits<\/a> bits para Windows. Es nuestra herramienta crucial para la ingenier\u00eda inversa y el cracking porque es\u00a0 pr\u00e1ctico, f\u00e1cil y vers\u00e1til adem\u00e1s de ser gratis.<\/p>\n<p>&#8230;&#8230;<\/p>\n<p>Hasta ah\u00ed escrib\u00ed.<\/p>\n<p>&nbsp;<\/p>\n<p>Hasta pronto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo fue escrito para una colaboraci\u00f3n con un amigo en un esfuerzo de tener una distribuci\u00f3n local parecida a las famosas revistas HackXCrack. Huelga decir que ese proyecto no avanz\u00f3 (no recuerdo las razones) pero ya ten\u00eda escrito parte del art\u00edculo sobre el tema que quer\u00eda abordar. A continuaci\u00f3n la versi\u00f3n in\u00e9dita. Introducci\u00f3n al [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[41,40,39],"class_list":["post-79","post","type-post","status-publish","format-standard","hentry","category-prog","tag-asm","tag-cracking","tag-introduccion"],"acf":[],"_links":{"self":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/comments?post=79"}],"version-history":[{"count":1,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/79\/revisions"}],"predecessor-version":[{"id":80,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/79\/revisions\/80"}],"wp:attachment":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/media?parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/categories?post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/tags?post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}