Está en la página 1de 40

Ingeniería Reversa

Expositor: Lic. José Antonio Flores Martínez


Ingeniería Reversa
Disclaimer

La presentación se brinda con fines educativos, para desarrollar la cultura en


seguridad informática y ayudar a prevenir los delitos informáticos en el país.

Expositor: Lic. José Antonio Flores Martínez 2


Ingeniería Reversa
La ingeniería reversa (cracking) se puede describir como el
grupo de técnicas empleadas para codificar, analizar y estudiar los principios de un
programa sin disponer de su código fuente. Con un caso práctico quedará mucho
más clara esta breve definición. Cuando un desarrollador crea un programa,
comienza escribiendo el código fuente en el lenguaje de programación que haya
elegido para acabar compilándolo (en un programa ejecutable). Llegado este punto,
nadie podría editar el programa sin disponer del código fuente y realizar una nueva
compilación. Esto es falso, y en ello es precisamente en lo que se basa el cracking.

La técnica de ingeniería inversa constituye la piedra angular del cracking, se basa en


la descompilación, o compilación inversa, de un programa a un lenguaje de
programación, generalmente el más básico, esto es, ensamblador. Existen
descompiladores capaces también de descompilar un programa a un lenguaje de
programación de alto nivel.

Expositor: Lic. José Antonio Flores Martínez 3


Ingeniería Reversa
Aunque parezca que el objetivo principal del cracking consista en alterar el software
con ciertas modificaciones de su funcionalidad original (normalmente cambios
relativos a la seguridad o a las propiedades de la protección), excede la sencilla
actividad de editar el código del programa. Puede llegar a anularse una buena parte
de los sistemas de protección sin practicar ninguna modificación al programa:
hallando la contraseña, el número de registro, etc., e incluso simplemente
estudiando el código del programa.

Herramientas de cracking elementales


Depurador (debugger): Son programas originalmente creados para corregir
errores en otros programas informáticos, pudiendo abrir cualquier ejecutable (.exe)
en el lenguaje ASM indistintamente de cual haya sido el lenguaje original del
programa (entienden ahora la importancia del ASM, hay que aprenderlo). Con este
programa podemos ejecutar cada instrucción del programa y detenernos en
cualquier momento o en el momento en que el programa toma la decisión de estar
registrados o no y poder cambiar el código a nuestro beneficio.

Expositor: Lic. José Antonio Flores Martínez 4


Ingeniería Reversa
Desamblador (disassembler): Programa que te permite ver cualquier ejecutable en
lenguaje ASM así como referencias de texto entre otras. La principal diferencia con un
debugger es que el desamblador podemos ver el código en ASM y el debugger podemos
interactuar con el (ejecutar, modificar). Un desamblador bastante útil es W32dasm
que también es debugger, pero se usa mas que nada solo como desamblador ya que si
queremos un buen debugger esta ollydbg que lo supera ampliamente.

Editor hexadecimal: Programas que te permite editar cualquier archivo de forma


hexadecimal. Todo el código ensamblador tiene su correspondiente en hexadecimal,
los debugger y desensambladores traducen esto a las instrucciones que vemos
normalmente. Podemos hacer una modificación en el ejecutable de dos formas. La
primera es con un editor hexadecimal y la otra es con el mismo ollydbg.

La desventaja de hacerlo con un editor es que si queremos modificar una instrucción en


ensamblador tenemos que saber el correspondiente en hexadecimal y si lo hacemos
con olly lo modificamos directamente por la instrucción que queremos.

Algunos editores son el Ultraedit y el hex workshop.


Expositor: Lic. José Antonio Flores Martínez 5
Ingeniería Reversa
Monitor del registro: Programa que sirve para vigilar el registro de Windows. En
ocasiones los programas guardan datos en el registro, datos como seriales, nombres
de usuario, fecha de instalación entre otros. Por lo tanto hay que tener en cuenta este
tipo de programas que les puede servir mucho. Un ejemplo monitor de registro es
Regmon.

Monitor de archivos: Programa que sirve para vigilar posibles vínculos con archivos.
Algo parecido al monitor de registro con la diferencia obvia en que este monitorea
archivos ya sea del tipo dato .txt lo que sea. Este tipo de programas es menos útil que
el monitor de registro ya que casi siempre los programas guardan los datos en el
registro de Windows.

Descompresores: Algunos programas utilizan distintos tipos de compresiones sin


que estos varíen la extensión .exe lo que hace más difícil crackear, ya que al estar
comprimidos no estamos analizando un ejecutable normal.

Expositor: Lic. José Antonio Flores Martínez 6


Ingeniería Reversa
Los compresores más famosos son UPX, Asprotect, ASPack, armadillo,
PECompressor, etc.

Los descompresores tienen multitud de nombres casi todos incluyen el mismo


nombre del compresor Ej. Aspackdie.

Expositor: Lic. José Antonio Flores Martínez 7


Ingeniería Reversa
Clasificación básica de los tipos de protección
disponibles
Duración limitada
Número limitado de ejecuciones
Otras restricciones
Número de registro o contraseña-número de serie
Fichero clave
Programas limitados
Clave hardware(“dongle”)
Comprobación de la presencia del CD
Protección contra la copia del CD
Protección comercial
Compresores y codificadores para formato PE
Programas en Visual Basic

Expositor: Lic. José Antonio Flores Martínez 8


Ingeniería Reversa
Registros de propósitos generales del CPU de Intel
x86
EAX: acumulador. Usado para cálculos y usado para almacenar valores de retorno de
llamadas (CALL´S) a funciones. Las operaciones básicas tales como : sumar, restar y
comparar usan este registro.

EBX: base. No tiene nada que ver con el puntero base. No tiene propósito general y
puede ser usado para almacenar datos.

ECX: contador. Usado para iteraciones (loops)

EDX: datos. Esta es una extensión de EAX. Permite cálculos más complejos como
multiplicar, dividir permitiendo almacenar datos extras para facilitar estos cálculos.

ESP: Puntero al Stack

Expositor: Lic. José Antonio Flores Martínez 9


Ingeniería Reversa
EBP: puntero base

ESI: índice de origen. Guarda la ubicación de los datos de entrada

EDI: índice de destino. Apunta a la ubicación a donde se almacena el resultado de los


datos de la operación.

EIP: Instruction Pointer o ocntador del programa

Expositor: Lic. José Antonio Flores Martínez 10


Ingeniería Reversa
Instrucciones básicas en ensamblador
LEA
Descripción: esta instrucción guarda la dirección de “fuente” en “destino”.
Sintaxis: LEA destino, fuente
Ejemplo: LEA EAX, variable – guarda la dirección de la variable en el registro EAX.
Operación: variable_destino = &variable_fuente

MOV
Descripción: esta instrucción guarda el contenido de “fuente” en “destino”.
Descripción: MOV destino, fuente
Ejemplo: MOV EAX, EDX – guarda el valor del registro EDX en el registro EAX.
MOV EAX, 123h – guarda el valor 123h en el registro EAX.
Operación: variable_destino = variable2_fuente

Expositor: Lic. José Antonio Flores Martínez 11


Ingeniería Reversa
MOVSX
Descripción: esta instrucción guarda el contenido de “fuente” en “destino” con
extensión de signo. Esto es, los bits que no se hayan utilizado de “destino” en la copia
toman el valor del bit de signo de “fuente”.
Sintaxis: MOVSX destino, fuente
Ejemplo: MOVSX EAX, 123h almacena el valor 123h en el registro EAX y guarda en los
bits restantes el bit de signo del valor 123h.

MOVZX
Descripción: esta instrucción guarda el contenido de “fuente” en “destino” con
extensión cero. Esto es, los bits que no se hayan utilizado de “destino” en la copia
toman el valor de cero.
Sintaxis: MOVZX destino, fuente
Ejemplo: MOVZX EAX, 123h – guarda el valor 123h en el registro EAX y cambia a cero
los bits no utilizados en la operación.

Expositor: Lic. José Antonio Flores Martínez 12


Ingeniería Reversa
MOVSB/MOVSW/MOVSD
Descripción: esta instrucción guarda un byte (MOVSB), palabra (MOVSW), o doble
palabra (MOVSD) de la dirección DS:ESI a la dirección ES:EDI. Los registros ESI y EDI
se extienden o reducen según la longitud de los datos transmitidos y del “flag” DF.
Sintaxis: MOVSB/movsw/movsd
MOVSW – guarda una palabra de la dirección DS:ESI en la dirección ES:EDI.
MOVSD – guarda una doble palabra de la dirección DS:ESI en la dirección ES:EDI.

LODSB/LODSW/LODSD
Descripción: esta instrucción guarda un byte (LODSB), palabra (LODSW), o doble
palabra (LODSD) de la dirección DS:ESI en la parte correspondiente del registro EAX.
El registro ESI se extiende o reduce según la longitud de los datos transmitidos y del
“flag” DF.
Sintaxis: LODSB/LODSW/LODSD
Ejemplo: LODSB – guarda un byte de la dirección DS:Esi en el registro AL.
LODSW – guarda una palabra de la dirección DS:ESI en el registro AX.
LODSD – guarda una doble palabra de la dirección DS:Esi en el registro EAX.

Expositor: Lic. José Antonio Flores Martínez 13


Ingeniería Reversa
STOSB/STOSW/STOSD
Descripción: esta instrucción guarda el contenido del registro AL (STOSB), del
registro AX (STOSW), o del registro EAX (STOSD) en la dirección ES:EDI. El registro
EDI se extiende o reduce según la longitud de los datos transmitidos y del “flag” DF.
Sintaxis: STOSB/STOSW/STOSD
Ejemplo: STOSB – guarda un byte de la dirección DS:EDI en el registro AL.
STOSW – guarda una palabra de la dirección DS:EDI en el registro AX.
STOSD – guarda una doble palabra de la dirección DS:EDI en el registro
EAX.

REP
Descripción: prefijo de instrucción aplicable a las instrucciones con caracteres
(STOSB, W, D, LODSB, W, D, MOVSB, W, D). Si el prefijo se define antes de una
instrucción, esta instrucción se repetirá y el registro ECX funcionará como contador.
El valor del registro ECX disminuye en uno con cada repetición. La repetición finaliza
cuando el valor del registro ECX llega a cero. En caso de una instrucción REP
condicionada (REPZ, REPNZ), también se comprueba el “flag” ZF.

Expositor: Lic. José Antonio Flores Martínez 14


Ingeniería Reversa
Sintaxis: REP instrucción
Ejemplo: MOV ECX,5
REP STOSB – repite cinco veces (ECX) guardando el valor del registro AL, en
la dirección ES:EDI; el valor de EDI cambia con cada repetición (véase la instrucción
STOSB).

LOOP
Descripción: esta instrucción permite la construcción de ciclos (también
condicionados utilizando instrucciones LOOP especiales); el registro ECX se utiliza
como contador del número de ciclo. El valor del registro disminuye en uno cada vez
que se ejecuta la instrucción LOOP y, excepto cuando sea cero, realice una bifurcación
a la dirección indicada (en el caso de la instrucción LOOP condicionada, también se
comprueba la condición específica). Cuando el registro ECX sea cero, el proceso
continúa en la instrucción siguiente a LOOP.
Sintaxis: LOOP dirección
Ejemplo: MOV ECX,5
Address: MOV [EAX], ECX

Expositor: Lic. José Antonio Flores Martínez 15


Ingeniería Reversa
INC EAX
LOOP dirección – se repetirá cinco veces (ECX) aquella parte del código
entre la instrucción LOOP y la etiqueta de dirección (esto es, instrucción MOV [EAX],
ECX y INC EAX).

NOP
Descripción: la instrucción NOP (“No Operación”) no ejecuta cierta operación.
Sintaxis: NOP

AND
Descripción: esta instrucción realiza una conjunción lógica (Y lógico) entre “fuente” y
“destino”, bit a bit y guarda resultado en “destino”.
Sintaxis: AND destino, fuente
Ejemplo: AND EAX, EDX – realiza una conjunción lógica entre los valores de los
registros EAX y EDX y almacena el resultado en el registro EAX.
AND EAX, 3Ah – realiza una conjunción lógica entre el valor del registro
EAX y el valor 3Ah; guarda el resultado en el registro EAX.

Expositor: Lic. José Antonio Flores Martínez 16


Ingeniería Reversa
Operación: variable_destino = variable_destino & variable2_fuente

OR
Descripción: esta instrucción realiza una suma lógica (O lógico) entre “fuente” y
“destino”, bit a bit y guarda resultado en “destino”.
Sintaxis: OR destino, fuente
Ejemplo: OR EAX, EDX – realiza una suma lógica entre los valores de los registros
EAX y EDX y almacena el resultado en el registro EAX.
OR EAX, 3Ah – realiza una suma lógica entre el valor del registro EAX y el
valor 3Ah; guarda el resultado en el registro EAX.
Operación: variable_destino = variable_destino | variable2_fuente

XOR
Descripción: esta instrucción realiza la función lógica de no equivalencia (sum mod
2) entre “fuente” y “destino”, bit a bit y guarda resultado en “destino”. Esta función se
utiliza frecuentemente al codificar datos.

Expositor: Lic. José Antonio Flores Martínez 17


Ingeniería Reversa
Sintaxis: XOR destino, fuente
Ejemplo: XOR EAX, EDX – realiza la función lógica de no equivalencia entre los
valores de los registros EAX y EDX y almacena el resultado en el registro EAX.
XOR EAX, 3Ah – realiza la función lógica de no equivalencia entre el valor
del registro EAX y el valor 3Ah guarda el resultado en el registro EAX.
XOR EAX, EAX – realiza la función lógica de no equivalencia entre dos
valores idénticos (en este caso los valores guardados en el registro EAX); el resultado
de esta operación será siempre cero.
Operación: variable_destino = variable_destino ^ variable2_fuente

NOT
Descripción: esta instrucción realiza la inversión de todos los bits de “destino” y
guarda resultado en “destino” (constituye su propio complemento).
Sintaxis: NOT destino
Ejemplo: NOT EAX – realiza la inversión del valor de registro EAX y guarda el
resultado en este registro.

Expositor: Lic. José Antonio Flores Martínez 18


Ingeniería Reversa
CMP
Descripción: esta instrucción resta la “fuente” del “destino” y define los “flags”
adecuados según el resultado, permitiendo así la comparación de dos valores. Los
“flags” definidos pueden utilizarse posteriormente en una instrucción condicionada,
como una bifurcación. Esta instrucción no altera los valores de “fuente” ni de “destino”.
Esta instrucción goza de gran popularidad entre los crackers
Sintaxis: CMP destino, fuente
Ejemplo: CMP EAX, EDX – comparación entre los valores de los registros EAX y EDX.
CMP EAX, 3Ah – comparación del valor de registro EAX y el valor 3Ah.
JNZ 00402000 – si los valores no fueran iguales, el control pasaría a la
instrucción en la dirección 00402000.
Operación: Por ejemplo: if (variable_destino == variable2_fuente)…

TEST
Descripción: al igual que sucedía con AND, TEST realiza una conjunción lógica entre
“fuente” y “destino”. Sin embargo, esta instrucción no guarda el resultado en ninguna
parte (esto es, los valores de “fuente” y “destino” no varían), sólo se utilizan para definir
los “flags” apropiados.
Expositor: Lic. José Antonio Flores Martínez 19
Ingeniería Reversa
A esta instrucción le suele seguir frecuentemente la instrucción de una bifurcación
condicionada.
Sintaxis: TEST destino, fuente
Ejemplo: TEST EAX, EDX – realiza una conjunción lógica entre los valores de los
registros EAX y EDX, también define los “flags” correspondientes según el resultado.

PUSH
Descripción: esta instrucción guarda un valor en la pila
Sintaxis: PUSH valor
Ejemplo: PUSH EAX – guarda el valor de EAX en la pila

POP
Descripción: esta instrucción guarda un valor de la pila en “destino”
Sintaxis: POP destino
Ejemplo: POP EAX – guarda el valor de la pila en el registro EAX

Expositor: Lic. José Antonio Flores Martínez 20


Ingeniería Reversa
ADD
Descripción: esta instrucción añade “fuente” a “destino” y guarda el resultado en
“destino”.
Sintaxis: ADD destino, fuente
Ejemplo: ADD EAX, EDX – añade el valor del registro EAX a EDX y almacena el valor
en el registro EAX.
ADD EAX, 3Ah – añade el valor del registro EAX al valor 3Ah y almacena el
valor en el registro EAX.
Operación: variable_destino = variable_destino + variable2_fuente

SUB
Descripción: esta instrucción resta “fuente” a “destino” y guarda el resultado en
“destino”.
Sintaxis: SUB destino, fuente
Ejemplo: SUB EAX, EDX – resta el valor del registro EAX a EDX y almacena el valor en
el registro EAX.
Operación: variable_destino = variable_destino – variable2_fuente

Expositor: Lic. José Antonio Flores Martínez 21


Ingeniería Reversa
CALL
Descripción: esta instrucción desplaza el control a un subprograma (llama a una
función) en la dirección indicada y al mismo tiempo guarda el valor de la dirección
siguiente (esto es, la dirección de la instrucción que sigue inmediatamente a la
instrucción CALL) en la pila. La instrucción RET se encarga de devolver el control
desde el subprograma.
Sintaxis: CALL dirección del subprograma (función)
Ejemplo: CALL 00402000 – invocación a la función con dirección 00402000
CALL EAX – invocación a la función en la dirección indicada por el valor de
registro EAX.

JMP
Descripción: instrucción de bifurcación no condicionada que desplaza el control a la
instrucción de la dirección indicada.
Sintaxis: JMP dirección
Ejemplo: JMP 00402000 – desplazamiento del control a la instrucción indicada en la
dirección 00402000.

Expositor: Lic. José Antonio Flores Martínez 22


Ingeniería Reversa
JMP EAX – desplazamiento del control a la instrucción indicada por la
dirección definida en el valor del registro EAX.

Bifurcaciones condicionadas
Estas bifurcaciones condicionadas comprueban el valor de uno o más atributos
(“flags”) del registro EFLAGS y según el resultado saltarán o no a una dirección
específica. De estas instrucciones aparecerá detrás de aquellas que definan los
atributos (es decir, CMP). A continuación se enumera una lista de las bifurcaciones
condicionadas básicas:

Instrucciones Bifurcación si…


JE/JZ igual/cero
JNE/JNZ no igual/no cero
JB/JNAE por debajo/no por encima ni igual
JAE/JNB por encima o igual/no por debajo
JBE/JNA por debajo o igual/no por encima
JA/JNBE por encima/no por debajo ni igual

Expositor: Lic. José Antonio Flores Martínez 23


Ingeniería Reversa
Instrucciones Bifurcación si…
JL/JNGE inferior/no mayor ni igual
JGE/JNL mayor o igual/no inferior
JLE/JNG inferior o igual/no mayor
JG/JNLE mayor/no inferior ni igual
JS signo
JNS no signo
JP/JPE paridad/paridad par
JNP/JPO no paridad/paridad impar

Expositor: Lic. José Antonio Flores Martínez 24


Ingeniería Reversa
Prácticas
En este laboratorio el alumno aprenderá las técnicas
básicas necesarias que le permitan conocer información
del software que se analizará para poder registrarlo
investigando los números de serie.

Herramientas a utilizar:
RDG Packer Detector v0.7.0
OLLyDbg SND

Expositor: Lic. José Antonio Flores Martínez 25


Ingeniería Reversa
A continuación paso a redactar cada uno de los pasos necesarios para poder obtener el
número de serie que me permita registrar el programa.

Lo primero que hare es analizar este software con la herramienta RDG Packer
Detector v 0.7.0 2013 para que obtenga información referente al lenguaje de
programación utilizado para el desarrollo de esta aplicación, así mismo conocer si
cuenta este ejecutable con alguna medida de protección para que en base a la
información devuelta por la herramienta tome el procedimiento más adecuado.

Expositor: Lic. José Antonio Flores Martínez 26


Ingeniería Reversa

Imagen de la herramienta RDG Packer Detector v0.7.0

Ahora abriré el ejecutable con la herramienta RDG Packer Detector, pulsando el


botón Open y seleccionando el archivo ejecutable que en este caso se llama
CheetahDVDBurner.exe y activo la opcón M-B en la ventana de la herramienta,
procedo hacer click en el botón Detect.

Expositor: Lic. José Antonio Flores Martínez 27


Ingeniería Reversa

Observo en la ventana de la herramienta la información devuelta por ella, que el


software, fue desarrollado en el lenguaje de programación visual Basic 6.0 y que no
cuenta con ninguna medida de protección. Con esto ya puedo cerrar el RDG Packer
Detector .

A continuación abriré el debugger Ollydbg para desensamblar el ejecutable y pueda


empezar analizar el flujo de funcionamiento del ejecutable.

Expositor: Lic. José Antonio Flores Martínez 28


Ingeniería Reversa

Imagen de la herramienta OllyDbg v1.10


Expositor: Lic. José Antonio Flores Martínez 29
Ingeniería Reversa
Después de la instalación del software CheetahDVDBurner.exe en mi computadora,
presento a continuación la ventana que aparece al ejecutar el programa.

Observo que tengo 15 dias a partir del dia en que se realizó la instalación del software,
para utilizarlo antes que caduque y por el momento me permite utilizarlo como un
programa de prueba con la opción Try.
Expositor: Lic. José Antonio Flores Martínez 30
Ingeniería Reversa
Teniendo abierta la herramienta OllyDbg, procedo abrir el ejecutable
CheetahDVDBurner .exe para su análisis y poder localizar el número de serie que me
permita registrar el programa. Para ello pulso el menú File elijo la opción Open y
selecciono el programa en la carpeta donde se instaló y presiono el botón Abrir.

Una vez desensamblado el ejecutable del software en el OllyDbg, pulso el botón


derecho del mouse en una área obscura libre de texto, y del menú contextual que
aparece selecciono la opción Search for y hago click en la opción All referenced text
strings
Expositor: Lic. José Antonio Flores Martínez 31
Ingeniería Reversa

Expositor: Lic. José Antonio Flores Martínez 32


Ingeniería Reversa
Ahora solo falta localizar el lugar exacto donde se encuentra el o los números de serie
para registrar este software en la ventana de los Strings references (diversos mensajes
que utiliza el software para las diferentes funciones que realiza el programa), que
utiliza la aplicación.

Y woalá, he encontrado los números de serie del programa que permiten registrar el
programa de forma permanente y con todas las funciones completas del mismo, como
si hubiera comprado una licencia de la aplicación.

Expositor: Lic. José Antonio Flores Martínez 33


Ingeniería Reversa
Nada mas resta, copiar uno de
los números de serie e
introducirlos en la ventana de
inicio del programa en el
apartado Enter the
Registration Key here y
pegarlo ahí y pulsar el botón
Register y listo el software ha
quedado registrado.

Expositor: Lic. José Antonio Flores Martínez 34


Ingeniería Reversa
Ejercicios:

1) Encontrar el número de serie para registrar el software Super Screen Recorder


2) Encontrar los números de serie para los programas que se encuentran
comprimidos en el archivo rar appz.rar
3) Realizar el keygen que permita registrar los programas que se encuentran en el
archivo comprimido appz.rar.

Expositor: Lic. José Antonio Flores Martínez 35


Ingeniería Reversa
Soluciones:
1)

Expositor: Lic. José Antonio Flores Martínez 36


Ingeniería Reversa
2)

Expositor: Lic. José Antonio Flores Martínez 37


Ingeniería Reversa
3)

Expositor: Lic. José Antonio Flores Martínez 38


Ingeniería Reversa
Conclusiones
Como pudieron darse cuenta en esta ocasión no realice ningún crackeo al software
original, simplemente fue analizar e identificar en que lugar se guardan cierta
información que permita descubrir los números de serie para registrar el software; por
lo tanto no fue modificado el condigo original del mismo. Así mismo con esto
demuestro que hay que tener seguridad en las aplicaciones para aquellas personas que
piensan dedicarse al desarrollo de sottware para que consideren protecciónes y
medidas de seguridad para protegerlos.

Recordar que el objetivo de esta presentación fue con fines didácticos y de aprendizaje
en ningún momento exhorto a los alumnos, catedráticos y público en general a
crackear software y venderlos, puesto que esto es un delito grave castigado con prisión,
puesto que esta penado por la ley, por derechos de autor.

Expositor: Lic. José Antonio Flores Martínez 39


Ingeniería Reversa

¡¡¡ Gracias !!!

Expositor: Lic. José Antonio Flores Martínez 40

También podría gustarte