Volumen I
Volumen I
Volumen I
AL
CRACK ING
Prologo
Como introduccin a esta serie de artculos que van a comenzar
a publicarse en lalista de crakslatinos, los autores Ricardo
Narvaja y mR gANDALF, hacen una breve entrada de lo que
pretende ser esta coleccin de tutoriales sobre el craking.
Este el comienzo de algo nuevo.
No les voy a mentir si les digo que
este es un proyecto ambicioso que
hemos comenzado mi amigo mR
gANDALF y yo. Creo que lo que
vamos a realizar es algo nico en su
especie.
Muchos dirn que ya hicimos un
curso el cual existe y esta
completito. Dicho curso, al igual
que este, estarn en mi FTP del
cual se dan los datos.
La diferencia entre este curso y el
anterior, es que pensamos hacer de
este algo ms grande, con tutes
mos y de mR gANDALF y con los
mejores tutes de otros autores,
mencionando quien es,
as como traducciones al castellano
de tutes en ingles hechas por
nosotros de los autores que
consideremos los mejores sobre el
tema y tambin con los mejores
tutes del curso anterior corregidos,
actualizados,
modificados,
revisados y puestos lindos para que
tengan una mejor lectura y
comprensin.
As que ser esto distinto.
Tambin, cada varias lecciones
pensamos hacer como una pequea
auto evaluacin, as cada uno puede
ver si hasta all lleg entendiendo
todo y est en condiciones de
seguir adelante, realizando algn
ejercicio que pondremos cuya
respuesta saldr en el comienzo de
la siguiente parte, para que exista
un mtodo de auto-verificacin de
P R L O G O
INTRODU CCIN
AL
CRACK ING
ndice
CAPTUL O
CAPTUL O
ENSAMBLADOR II
Qu es el Hacking/Cracking?
Interrupciones y API
34
38
39
42
44
11
CAPTUL O
CAPTUL O
47
13
14
16
18
20
21
23
26
La pila
29
Subrutinas
31
49
49
50
Imprimiendo/copiando el texto
56
57
59
Single Stepping
60
60
63
65
70
71
CAPTUL O
74
75
75
Configurar el entorno
78
82
83
Vistas
84
86
87
Entrando en materia
106
88
108
88
Bsqueda a lo retro
112
Ejercicios
89
Por prediccin
113
El inevitable parcheo
115
El crack destruible
117
Obtener un serial
119
121
CAPTUL O
Instalacin y descarga
96
Primeros pasos
96
Checksums
97
97
El men
98
Ultra Edit
99
HIEW
10
CAPTUL O
I N T R O D U C C I O N
A L
Captulo
C R A C K I N G
Qu es el Hacking/Cracking?
Se podra definir como un proceso manual o automtico en el cual un
sistema de seguridad que protege un software/hardware es "burlado". El
termino hacking se aplica cuando este proceso tiene lugar en un sistema
remoto, es decir se asalta el sistema de un ordenador ajeno, pudiendo as
acceder a informacin confidencial pudiendo llegar a destruirla, alterarla o
copiarla. Existen los Hackers blancos, que en principio sus intenciones no son
malficas y tan slo buscan fallos de seguridad en el sistema y los Hackers
negros o crackers de redes, los cuales pueden destruir los datos, copiarlos,
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
alterarlos o hacen lo que les plazca cuando llegan a obtener todos los
privilegios de acceso.
Alguien defini una escala bastante absurda en la que digamos se
muestra la evolucin de un hacker. Muchos quedan estancados en alguna fase
de la escala y otros ni tan siquiera logran pasar de la primera etapa.
Lamer -> Wannabe -> Newbie -> Hacker -> Gur o Elite -> Wizard
Por supuesto llegar a hacker no es cuestin de dos das y llegar a
Wizard es algo que casi nadie logra. Entre la lite podemos encontrar a gente
bastante joven pero los Wizards suelen ser ya mayores y debido a su inmensa
experiencia, tanto en la vida misma como en la informtica, poseen un nivel
que ni ellos mismos podran concretar donde acaba. En mi opinin es difcil
distinguir a la lite de los wizards y creo que los Wizards necesitan tener un
carcter especial como persona, por lo que no todo el mundo puede llegar
aqu. Alguien que se jacte de ser lite y vacile con ello nunca llegar a Wizard,
al contrario, descender rpidamente a niveles inferiores.
El termino cracking es aplicable cuando se burla el sistema de
proteccin de algn software que normalmente esta protegido contra copia u
otro tipo de proteccin similar (versiones limitadas por tiempo, por un nmero
de serie, mochilas, etc) pudiendo as obtener una copia funcional de un
software protegido. Cabe diferenciar entre crackers de redes y crackers de
sistemas de proteccin de software. Algunos "gurus" del cracking tambin lo
definen como un estado diferente de la mente, otros como una manera de
expresar su arte, incluso algunos la definen como una ciencia (y resulta cierto).
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
Ultra-Edit 32:
http://www.suddendischarge.com
http://www.hackersclub.com
http://crknotez.cjb.net
http://fravia.org
http://protools.cjb.net
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
comprobaremos las posibles defensas del enemigo. He aqu las defensas que
deberemos tener ms en cuenta:
El software usa tcnicas para detectar nuestra presencia y
evitar as poder ser trazado7. Normalmente intentar detectar la presencia de
un debugger y parar la ejecucin del software mientras este presente.
Anti-Debugging:
MessageBoxA, MessageBox,
DialogBoxParam, DialogBoxParamA
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
Se utiliza
cuando se sospecha que una determinada secuencia de rdenes en
assembler est siendo usada por el sistema de proteccin / defensa.
Conocida la cadena secuencia de cdigos/bytes a buscar se realiza su
bsqueda con editor hexadecimal y se opera segn sea el caso. Muy
usada para la deteccin de trucos Anti-debugging.
Por bsqueda de una secuencia de cdigos de operacin:
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
correspondientes clculos
VOID GetSystemTime(LPSYSTEMTIME
lpSystemTime );
VOID GetLocalTime(LPSYSTEMTIME
lpSystemTime );
wYear;
wMonth;
wDayOfWeek;
wDay;
wHour;
wMinute;
wSecond;
wMilliseconds;
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
Con esto en mente ya podemos deducir cual ser el mtodo a seguir para
burlar el sistema: poner breakpoints (BPX) en cada una de estas funciones y
trazar paso a paso a partir de donde se ejecut la funcin que provoc el BPX.
Tambin podemos usar el mtodo de las referencias a cadenas. Existen casos
en los que estos mtodos no nos servirn de mucho ayuda o simplemente no
nos facilitarn la tarea, estos casos se dan cuando el software est protegido
con algn sistema de proteccin comercial por tiempo como el TimeLock o
VBox. Este tipos de sistemas se basan en DLL's externas, por lo que ser ms
prctico el desensamblado y trazado de estas. En algunos casos simplemente
bastar parchear alguna funcin de la DLL para haber terminado con el
sistema de proteccin, con la ventaja de que todos los programas basados en
esa proteccin estarn automticamente desprotegidos (habremos crackeado
cientos de aplicaciones que ni siquiera conocemos:-) ).
Para ms detalles puedes leer mis tutoriales sobre cracking nmeros 1,5 y 6.
CreateDialogIndirectParamA /
CreateDialogIndirectParam
CreateDialogParamA /
CreateDialogParamW
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
DialogBox
DialogBoxIndirect
DialogBoxParam /
DialogBoxParamA /
DialogBoxParamW
EndDialog
MessageBeep
MessageBoxA / MessageBoxW
MessageBoxExA /
MssageBoxExW
MessageBoxIndirect /
MessageBoxIndirectA /
MessageBoxIndirectW
Estas funciones son las que Windows puede utilizar para crear
un cuadro de dilogo / mensaje, las cinco primeras son las ms
utilizadas, las cuatro ltimas son slo para cuadros de mensaje.
Para ms informacin sobre estas funciones ver la gua de
referencia
del
API
de
Windows.
Una vez localizada la
llamada al cuadro de dilogo/mensaje, procederemos a su
eliminacin, para ello lo ms habitual ser eliminar la llamada al
cuadro de dilogo/mensaje mediante NOP o instrucciones
similares (INC EAX, DEC EAX etc.). Es posible que despus
de la llamada al cuadro de dilogo, este retorne un valor el cual
la aplicacin deber procesar para as continuar su ejecucin,
por eso deberemos tener en cuenta este valor (el valor correcto
para que la aplicacin contine) y hacer que el
registro/memoria que contena dicho valor, siga valiendo igual
al eliminar la llamada al cuadro de dilogo. Esto lo podremos
lograr aprovechando el espacio que nos quede al eliminar la
llamada, o simplemente cambiando el salto que compruebe este
valor.
En ciertas
ocasiones, no podremos eliminar la llamada al cuadro de
dilogo / mensaje debido a que esta llamada est codificada
como una llamada indirecta (p.ej: call [ESI+EBX]) o cuando la
aplicacin usa la misma llamada para que se procese ms de un
cuadro de dilogo. Es de imaginar que si eliminamos esta
llamada, tambin estaremos eliminando otras posibles llamadas
a otros cuadros de dilogo que no sean el molesto "nag", como
un cuadro de dilogo de configuracin etc. La solucin no es
muy compleja: todos los cuadros de dilogo que la aplicacin
pueda generar deben estar identificados por un nmero ID,
o cadena que los identifica inequvocamente, sabemos que
Tcnicas avanzadas de eliminacin de nags:
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
BitBlt
MaskBlt
PatBlt
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
Poniendo BPX en
BOOL GetVolumeInformationA(
LPCTSTR lpRootPathName, //
direccin del directorio raz del sistema
de archivos system
LPTSTR lpVolumeNameBuffer, //
direccin del nombre del volumen
DWORD nVolumeNameSize, //
longitud del buffer
lpVolumeNameBuffer
LPDWORD
lpVolumeSerialNumber, // direccin
del numero de serie del volumen
LPDWORD
lpMaximumComponentLength, //
direccin de la mxima longitud del
nombre del archivo del sistema
LPDWORD lpFileSystemFlags, //
direccin de los flags del sistema de
archivos
LPTSTR
lpFileSystemNameBuffer, //
direccin del nombre del archivo del
sistema
DWORD
nFileSystemNameSize // longitud del
10
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
buffer
);
GetVolumeInformationW
Estas funciones obtienen un puntero a
una cadena conteniendo la etiqueta del
volumen de la unidad especificada, a
partir de aqu es fcil buscar donde se
compara con la etiqueta vlida. La
funcin GetVolumeInformationW
obtiene la cadena en formato wide-char
(o eso creo).
Para ms detalle sobre este tipo de protecciones puedes echar un vistazo a mi
tutorial nmero 6 te aconsejo que te mires tambin la gua de referencia del
API de Windows.
11
G U I A
G E N E R A L
D E
C R A C K I N G
B A J O
W I N 3 2
Debugger o depurador. Herramienta que se utiliza para localizar los fallos de un programa,
sea, para depurarlo. Tambin es la herramienta fundamental del cracker para el que los
fallos del programa lo constituyen sus medios de proteccin.
Las herramientas bsicas del cracking se exponen partir del captulo 4, y todas ellas podrn obtenerse
en los FTP`s asociados al curso.
Algunas de las webs clsicas del cracking. No son las nicas, aunque s algunas de las mejores. Para mi
gusto faltan muchas incluso mejores que estas.
Satlites espa: Se refiere a los llamados analizadores de archivos, que son programas que nos dicen con que
fue compilado un archivo. Se da detallada informacin de esto en el Volumen II.
Trazando: Del ingls Trace, seguir el rastro. Algunos decimos tracear. Significa correr un
fragmento de la aplicacin con un depurador, generalmente el SoftIce, que encontrareis
abreviado como Sice.
10
Manual de Referencia de las API de Windows. Imprescindible para el cracker medio. Viene en ingls y
en formato de ayuda, aunque muchas de estas se encuentran traducidas en las crackers notes en
espaol (Txeli) y actualmente se esta llevando a cabo un importante esfuerzo por parte de algunos para
traducir la mayora de estas (ver la pagina de Karpoff).
11
Banner: Del ingls, estandarte. Se refiere a esos molestos avisos que nos parece al correr una demo
indicndonos que debemos registrarnos. A menudo lo hacen aparentemente al azar, surgiendo de
improviso.
12
I N T R O D U C C I O N
A L
Captulo
C R A C K I N G
Ensamblador I:
Conceptos Bsicos.
Wintermute
De entre los mltiples tutoriales de ensamblador que circulan por la red uno de los
mejores, por su contenido y claridad, es sin duda alguna el del Curso de
programacin de virus de Wintermute, de la pagina underground chatsubo
bar. Tengo que recomendar fuertemente la lectura de estos dos tutoriales de Asm que
para el newbie sern sin duda los ms provechosos de cuantos lea y para el cracker
medio sern tambin una agradable sorpresa si no los conoca. Debo agradecer el
descubrimiento de esta fascinante pgina a numit_or, cuyos continuos trabajos sobre
mR gANDALF
ingeniera inversa merecen el mximo respeto.
13
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
14
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
15
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
16
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
[EBP],1234h
17
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
18
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
19
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
problemas (en la propia web de Intel vienen toda una serie de tablas indicando
cmo se hace esto con todas y cada una de las instrucciones que entienden sus
procesadores).
20
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
XOR
La operacin XOR, operando bit a bit, da como resultado un 1 si uno y slo
uno de los dos bits con los que se opera valen 1, es por ello que se llama OR
exclusivo o exclusive OR:
10001010
XOR 11101010
-------01100000
NOT
Esta operacin slo tiene un operando, puesto que lo que hace es invertir los
bits de este operando que evidentemente ser de destino:
NOT 11101010
-------00010101
Operaciones aritmticas
En los procesadores 80x86, tenemos una buena gama de operaciones
aritmticas para cubrir nuestras necesidades. Estas son, bsicamente:
ADD
ADD significa aadir. Tendremos con esta instruccin las posibilidades tpicas
de operacin; sobre memoria, sobre registros, y con valores inmediatos
(recordando que no podemos operar con dos posiciones de memoria y que el
destino no puede ser un valor inmediato). As, un ejemplo sera:
ADD EAX, 1412h
Algo tan sencillo como esto aade 1412h hexadecimal a lo que ya hubiera en
EAX, conservando el resultado final en EAX. Por supuesto podemos usar
valores decimales (s quitamos la h a 1412h, sumar 1412h decimal... creo que
no lo mencion, pero esto vale siempre, tanto para MOV como para cualquier
otra operacin lgica o aritmtica). Otros ejemplos podran ser ADD ECX,
EDI (sumar ECX y EDI y almacenar el resultado en ECX), ADD dword ptr
[EDX], ESI (coger lo que haya en la direccin de memoria cuyo valor indique
EDX, sumarle el valor del registro ESI y guardar el resultado en esa direccin
de memoria), etc.
SUB
21
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
Esta es la operacin de resta; las reglas para utilizarla, las mismas que las del
ADD. Tan slo cabra destacar el hecho de que si estamos restando un
nmero mayor a uno menor, adems de una modificacin en los FLAGS para
indicar que nos hemos pasado, lo que suceder es que al llegar a 0000 en el
resultado el siguiente nmero ser FFFF. Es decir, que al pasarnos por abajo
del todo el resultado comienza por arriba del todo.
Supongamos que queremos restar 1 - 2. El resultado no es -1, sino el mximo
nmero representable por la cantidad de bits que tuviramos. Vamos, que si
son 8 bits (que representan un valor entre 0 y 255), el resultado de 1 - 2 ser
255. Para los curiosos, este 255 en complemento a 2 equivale al -1, por lo que
s operamos en este complemento a 2 la operacin de resta tiene completo
sentido para los nmeros negativos.
Lo mismo sirve para el ADD cuando sumamos dos nmeros y el resultado no
es representable con el nmero de bits que tenemos. Si hiciramos 255 + 1 y el
mximo representable fuera 255 (o FFh en hexadecimal, usando 8 bits), el
resultado de 255 + 1 sera 0.
Como deca, las posibilidades para usar el SUB son como las del ADD, con lo
que tambin es vlido esto:
SUB EAX, 1412h
Los ejemplos mencionados con el ADD tambin valen: SUB dword ptr
[EDX], ESI va a restar al contenido de la direccin de memoria apuntada por
EDX el valor almacenado en ESI, y el resultado se guardar en esta direccin
[EDX]. SUB ECX, EDI restar al valor de ECX el de EDI, guardando el
resultado en el registro ECX.
MUL
Pasamos a la multiplicacin; aqu el tratamiento es un tanto distinto al que se
haca con la suma y la resta. Slo vamos a indicar un parmetro que va a ser un
registro o una direccin de memoria, y segn su tamao se multiplicar por el
contenido de AL (8 bits), AX (16) o EAX (32). El resultado se guardar
entonces en AX si se multiplic por AL, en DX:AX si se multiplic por AX, y
en EDX:EAX si se multiplic por EAX. Como vemos se utiliza para guardar
el resultado el doble de bits que lo que ocupan los operandos; as no se pierde
informacin si sale un nmero muy grande.
Veamos un ejemplo por cada tamao:
MUL CL: Coge el valor de CL, lo multiplica por AL, y guarda el resultado en
AX.
MUL word ptr [EDX]: Obtiene los 16 bits presentes en la direccin de
memoria EDX (ojo, que el tamao de lo que se escoge lo indica el "word ptr",
EDX slo indica una direccin con lo que aunque sean 32 bits esto no influye,
el tamao, repito, es determinado por el "word ptr"). Una vez coge esos 16
bits los multiplica por AX, y el resultado se va a guardar en DX:AX. Esto
significa, que los 16 bits ms significativos los guarda en DX y los 16 menos
significativos en AX. Si el resultado de la multiplicacin fuera 12345678h, el
registro DX contendra 1234h, y el registro AX, 5678h.
MUL ESI: Coge el contenido del registro ESI, y lo multiplica por EAX. El
resultado es almacenado en EDX:EAX del mismo modo en que antes se haca
con DX:AX, slo que esta vez tenemos 64 bits para guardarlo. La parte de ms
22
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
23
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
24
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
como sucede con CF y OF, este flag es afectado por operaciones aritmticas
(ADD, SUB, etc) y de incremento/decremento (INC/DEC).
- CF (0): Carry Flag o Flag de Acarreo. En ocasiones se da un desbordamiento
en la operacin aritmtica, esto es, que no cabe. Si nos pasamos por arriba o
por abajo en una operacin (p.ej, con 16 bits hacer 0FFFFh + 01h), este
resultado no va a caber en un destino de 16 bits (el resultado es 10000h, lo cual
necesita 17 bits para ser codificado). As pues, se pone este flag a 1. Hay
tambin un flag parecido, OF (11) (Overflow Flag), que acta cuando en
complemento a 2 se pasa del mayor nmero positivo al menor negativo o
viceversa (por ejemplo, de 0FFFFh a 0000h o al revs). Tambin nos
interesar para ello el SF (7) o flag de signo, que estar activo cuando el
nmero sea negativo segn la aritmtica de complemento a dos (en realidad,
cuando el primer bit del resultado de la ltima operacin sea un 1, lo que en
complemento a 2 indica que se trata de un nmero negativo).
Otros, de menor importancia (se puede uno saltar esta parte sin
remordimientos de conciencia), son:
- ID (21): El Identification Flag, seala si se puede modificar que se soporta la
instruccin CPUID
- VM (17): Este flag controla si se est ejecutando en Virtual Mode 8086;
cuando est a 0 se vuelve a modo protegido (el modo virtual 8086 se usa por
ejemplo para ejecutar las ventanas Ms-Dos bajo Win32).
- DF(10): El "Direction Flag", va a indicar en qu direccin se realizan las
instrucciones de cadena (MOVS, CMPS, SCAS, LODS y STOS). Estas
instrucciones, que veremos ms adelante, actan normalmente "hacia
adelante". Activar este flag har que vayan "hacia atrs"; no hace falta
preocuparse ms por esto, ya se recordar. Tan slo aadir, que este bit se
activa directamente con la instruccin STD (Set Direction Flag), y se desactiva
(se pone a 0) con la instruccin CLD (Clear Direction Flag).
- TF (8): Es el "Trap Flag" o flag de trampa; se utiliza para debugging, y
cuando est activo, por cada instruccin que el procesador ejecute saltar una
interrupcin INT 1 (se utiliza para depuracin de programas).
- AF (4): Flag de acarreo auxiliar o "Adjust Flag". Se usa en aritmtica BCD;
en otras palabras, pasad de l ;=)
- PF (2): Es el flag de paridad; indica si el resultado de la ltima operacin fue
par, activndose (ponindose a 1) cuando esto sea cierto.
- VIP (20), VIF (19), RF (16), NT(14): No nos van a resultar muy tiles; para
quienes busquen una referencia, sus significados son "Virtual Interrupt
Pending", "Virtual Interrupt Flag", "Resume Flag" y "Nested Task".
Instrucciones de comparacin
Los flags son activados tanto por las instrucciones de operacin aritmtica
(ADD, SUB, MUL, DIV, INC y DEC) como por otras dos instrucciones
especficas que describo a continuacin:
- CMP: Esta es la ms importante; el direccionamiento (es decir, aquello con
lo que se puede operar) es el mismo que en el resto, y lo que hace es comparar
dos operandos, modificando los flags en consecuencia. En realidad, acta
como un SUB slo que sin almacenar el resultado pero s modificando los
flags, con lo que si los dos operandos son iguales se activar el flag de cero
25
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
(ZF), etc. No vamos a necesitar recordar los flags que modifican, puesto que
las instrucciones de salto condicional que usaremos operarn directamente
sobre si el resultado fue "igual que", "mayor que", etc, destaquemos no
obstante que los flags que puede modificar son OF (Overflow), SF (Signo), ZF
(Cero), AF (BCD Overflow), PF (Parity) y CF (Carry).
- TEST: Tal y como CMP equivale a un SUB sin almacenar sus resultados,
TEST es lo mismo que un AND, sin almacenar tampoco resultados pero s
modificando los flags. Esta instruccin, slo modifica los flags SF (Signo), ZF
(Cero) y PF (Paridad).
26
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
if Zero y Jump if Equal son equivalentes). En cualquier caso hay que tener lo
siguiente en cuenta:
- Las instrucciones de salto condicional ms comunes son JE (Jump if Equal),
JA (Jump if Above) y JB (Jump if Below), as como las derivadas de combinar
estas (por ejemplo, una N entre medias es un Not, con lo que tenemos JNE,
JNA y JNB... por otro lado, tenemos JAE como Jump if Above or Equal o
JBE, Jump if Below or Equal)
- Puede resultar extrao el hecho de que hay dos formas de decir "mayor que"
y "menor que". Es decir, por un lado tenemos cosas como JB (Jump if Below)
y por otro JL (Jump if Less). La diferencia es que Below y Above hacen
referencia a aritmtica sin signo, y Less y Greater hacen referencia a aritmtica en
complemento a dos.
- Hay un tercer tipo de salto condicional, que comprueba directamente el
estado de los flags (como pueda ser el de paridad). Entre ellos incluimos
tambin dos especiales; uno que considera si salta dependiendo de si el valor
del registro CX es 0 (JCXZ) y otro que considera si el valor de ECX es 0
(JECXZ).
Instruccin
Descripcin
Flags
Aritmtica sin signo
JZ, JE
Jump if Zero, Jump if Equal ZF = 1
Jump if Not Equal, Jump if
JNE, JNZ
ZF = 0
Not Zero
JA
Jump if Above
CF = 0 and ZF = 0
Jump if Not Above, Jump if
JNA, JBE
CF = 1 or ZF = 1
Below or Equal
Jump if Not Carry, Jump if
JNC, JNB, JAE Not Below, Jump if Above or CF = 0
Equal
JNBE
Jump if Not Below or Equal CF = 0 and ZF = 0
Aritmtica en complemento a 2
Jump if Not Above or Equal,
JNAE, JB, JC
CF = 1
Jump if Below, Jump if Carry
Jump if Greater or Equal,
JGE, JNL
SF = OF
Jump if Not Less
Jump if Less, Jump if Not
JL, JNGE
SF <> OF
Greater or Equal
Jump if Less or Equal, Jump
JLE, JNG
ZF = 1 or SF <> OF
if Not Greater
Jump if Not Greater, Jump if
JNG, JLE
ZF = 1 or SF <> OF
Less or Equal
Jump if Not Greater or Equal,
JNGE, JL
SF <> OF
Jump if Less
Jump if Not Less, Jump if
JNL, JGE
SF = OF
Greater or Equal
27
E N S A M B L A D O R
JNLE, JG
JNO
JNP
JNS
JO
JP, JPE
JPO
JS
JCXZ
JECXZ
I :
C O N C E P T O S
B S I C O S
28
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
mov edx,eax
Se ve desde lejos que este programa es muy optimizable; el resto quedaba en
EAX, con lo que a no ser que por algn motivo en particular lo necesitemos
en EDX, podramos prescindir de la ltima lnea y hacer que el cociente
residiera en ECX mientras que el resto sigue en EAX. Tambin sera intil, la
lnea "xor edx,edx" que pone EDX a cero, dado que luego es afectado por un
"mov edx,eax" y da igual lo que hubiera en EDX.
Hemos visto, adems, cmo hacer un bucle mediante el decremento de una
variable y su comprobacin de si llega a cero, y en el segundo caso, mediante la
comprobacin entre dos registros; para el primer caso vamos a tener en el
ensamblador del PC un mtodo mucho ms sencillo utilizando ECX como
contador como va a ser el uso de la instruccin LOOP, que veremos ms
adelante, y que es bastante ms optimizado que este decremento de a uno.
La pila
PUSH, POP y dems fauna
La pila es una estructura de datos cuya regla bsica es que "lo primero que
metemos es lo ltimo que sacamos". El puntero que indica la posicin de la
pila en la que estamos es el SS:ESP, y si pudiramos verlo grficamente sera
algo como esto:
Qu significa este dibujo? Que SS:ESP est apuntando a ese byte de valor
91h; los valores que vienen antes no tienen ninguna importancia (y dado que
esta misma pila es utilizada por el sistema operativo cuando se produce una
interrupcin, es improbable que podamos considerar "fijos" estos valores que
hayan en el lugar de las interrogaciones).
La primera instruccin que vamos a ver y que opera sobre la pila, es el PUSH,
"empujar". Sobre el dibujo, un PUSH de 32 bits (por ejemplo un PUSH
EAX) ser una instruccin que mover "hacia atrs" el puntero de pila,
aadiendo el valor de EAX all. Si el valor del registro EAX fuera de
0AABBCCDDh, el resultado sobre esta estructura de un PUSH EAX sera el
siguiente:
29
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
Un par de cosas a notar aqu: por una parte s, el puntero se ha movido slo (y
seguir movindose hacia la izquierda - hacia "atrs" - si seguimos empujando
valores a la pila). Por otra, quiz resulte extrao que AABBCCDDh se
almacene como DDh, CCh, BBh, AAh, es decir, al revs. Pero esto es algo
comn; cuando guardamos en alguna posicin de memoria un dato mayor a un
byte (este tiene cuatro), se van a almacenar "al revs"; este tipo de ordenacin,
se llama little endian, opuesta a la big endian que almacena directamente
como AAh BBh CCh DDh un valor as.
La instruccin PUSH, en cualquier caso, no est limitada a empujar el valor de
un registro: puede empujarse a la pila un valor inmediato (p.ej, PUSH 1234h),
y pueden hacerse referencias a memoria, como PUSH [EBX+12].
Otra instruccin bastante importante es PUSHF (y PUSHFD), que empujan
el contenido del registro de Flags en la pila (un buen modo de que lo podamos
sacar a un registro y lo analicemos). Como se indica en el grfico de los Flags
en su captulo correspondiente, PUSHFD empuja los EFlags (flags extendidos,
32 bits), y PUSHF los Flags (los 16 bits menos significativos de este registro).
Ahora, no slo querremos meter cosas en la pila, estara interesante poder
sacarlas y tal. Para ello, tambin tenemos una instruccin, el POP, que realiza
la accin exactamente opuesta al PUSH. En particular, va a aumentar el
puntero ESP en cuatro unidades y al registro o posicin donde se haga el POP,
transferir los datos a los que se apuntaba. En el caso anterior, volveramos a
tener el puntero sobre el 91h:
30
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
Subrutinas
Introduccin al uso de subrutinas
Es bastante comn utilizar subrutinas al programar; podemos verlas como el
equivalente a las funciones, de tal forma que se puedan llamar desde cualquier
punto de nuestro programa. Supongamos que nuestro programa tiene que
recurrir varias veces a un mismo cdigo dedicado, por ejemplo, a averiguar el
producto de dos nmeros como hacamos en el ejemplo de cdigo anterior
(vale, el ensamblador del 80x86 admite multiplicacin, pero repito que esto es
un ejemplo :P).
La instruccin que vamos a utilizar para "llamar" a nuestra funcin de
multiplicar, es el CALL. CALL admite, como es habitual, referencias directas
a memoria, a contenidos de registros y a contenidos de direcciones de
memoria apuntadas por registros. Podramos hacer un CALL EAX, un
CALL [EAX] o directamente un CALL 12345678h. Al programar,
utilizaremos normalmente un CALL <etiqueta>, que ya se encargar el
compilador de traducir a direccin inmediata de memoria.
Luego, dentro de la propia rutina tenemos que devolver el control al cdigo
principal del programa, esto es, al punto en el que se haba ejecutado un
CALL. Esto se hace mediante la instruccin RET, que regresar al punto en
que se llam ejecutndose despus la instruccin que venga a continuacin.
Como ejemplo con el cdigo anterior:
<cdigo de nuestro programa>
mov eax,<valor1>
mov ebx,<valor2>
call Producto
<resto de nuestro cdigo>
[...]
; Suponemos que EAX contiene N, y EBX, contiene M.
Producto:
xor edx,edx ; Aqu vamos a almacenar el resultado final. La operacin xor
edx,edx hace EDX = 0.
LoopSuma:
; Esto, es una etiqueta
31
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
add edx,eax
; A EDX, que contendr el resultado final, le sumamos
el primer multiplicando
dec ebx
jnz LoopSuma ; Si el resultado de decrementar el multiplicando EBX es cero,
no sigue sumando el factor de EAX.
ret
Cmo funcionan CALL/RET
Cuando llamamos a una subrutina, en realidad internamente est pasando algo
ms que "pasamos el control a tal punto"; pensemos que se pueden anidar
todas las subrutinas que queramos, es decir, que pueden hacerse CALLs dentro
de CALLs sin ningn problema.
Por qu? Pues por la forma en que funcionan especficamente estas
instrucciones:
- CALL, lo que realmente est haciendo es empujar a la pila la direccin de
ejecucin de la instruccin siguiente al CALL, y hacer un JMP a la direccin
indicada por el CALL. As, al inicio de la subrutina la pila habr cambiado, y si
hiciramos un POP <registro>, sacaramos la direccin siguiente a la de desde
donde se llam.
- RET, lo que va a hacer es sacar de la pila el ltimo valor que encuentre
(ntese que no sabe que ese sea el correcto, con lo que si en medio de la
subrutina hacemos un PUSH o un POP sin controlar que est todo al final tal
y como estaba al principio, el programa puede petar), y saltar a esa direccin.
En caso de que no hayamos hecho nada malo, va a volver donde nosotros
queramos.
Jugar con esto nos va a ser muy necesario cuando programemos virus. Hay un
sistema muy standard de averiguar la direccin actual de memoria en que se
est ejecutando el programa (y que es necesario utilizar normalmente, a no ser
que lo hagamos por algn otro mtodo), que funciona como sigue:
call delta_offset
; normalmente este mtodo se llama "delta offset", que
hace referencia a esta direccin.
delta_offset:
pop ebp ; Ahora ebp tiene la direccin de memoria indicada por
"delta_offset" en el momento actual.
No abundar en ms detalles; slo, que esta es la mejor forma de saber cunto
vale el registro EIP, lo cual nos va a ser de bastante utilidad al programar.
Funciones avanzadas en CALL/RET
Para terminar, tenemos que hablar de la existencia de otra forma de RET que
es IRET, retorno de interrupcin; la trataremos en el siguiente apartado junto
con el uso de interrupciones por ser un tanto especial.
Por otro lado, a veces veremos una opcin que puede parecernos "extraa", y
es que a veces el RET viene acompaado de un nmero, por ejemplo, RET 4.
El nmero que viene junto con la instruccin, indica que adems de sacar el
valor de retorno de la pila tenemos que aumentar el valor del puntero de pila
32
E N S A M B L A D O R
I :
C O N C E P T O S
B S I C O S
add edx,eax
; A EDX, que contendr el resultado final, le sumamos
el primer multiplicando
dec ebx
jnz LoopSuma ; Si el resultado de decrementar el multiplicando EBX es cero,
no sigue sumando el factor de EAX.
ret 8
33
I N T R O D U C C I O N
A L
Captulo
C R A C K I N G
Ensamblador II
Wintermute
Esta segunda parte sobre el lenguaje ensamblador versa sobre algunos aspectos ms
avanzados, como son las API`s , las dll`s, las instrucciones de cadena y otros temas
interesantes.
mR gANDALF
Interrupciones y API
Introduccin
La API es la herramienta por la cual nos comunicamos con el sistema
operativo y las funciones que este tiene para hacernos la vida ms fcil. Una
operacin puede ser abrir un fichero, escribir sobre l, cambiar el directorio
actual o escribir en la pantalla.
Hay dos mtodos, que vamos a ver, en que se usan las API del sistema
operativo: Por interrupciones, pasando los parmetros en registros, como hace
Ms-Dos; Por llamadas a subrutina, como hace Win32; y un hbrido con
llamadas a interrupcin y paso de parmetros en pila, en el sistema operativo
Linux.
Interrupciones en MS-Dosi
Vale, lo primero que hay que tener en la cabeza es que en Ms-Dos *todo* se
hace a travs de interrupciones; y que distintas interrupciones llaman a
servicios orientados hacia algo distinto.
34
E N S A M B L A D O R
I I
db
'fichero.txt',0
Bueno, nos hemos encontrado (qu remedio) una cosa nueva de la que no
habamos hablado antes... esto de "db" significa "data byte", vamos, que
estamos indicando datos "a pelo", en este caso el nombre de un fichero. Y s,
hay una coma, indicando que despus de esos datos "a pelo" se ponga un byte
con valor cero (para delimitar el fin del nombre del fichero). DX va a apuntar a
ese nombre de fichero y AX indica la funcin... y voil, fichero abierto.
Destacar otra cosa: existen dos instrucciones que sirven para activar o
inhabilitar las interrupciones (ojo, que inhabilitar no las deshace por completo,
pero s impide la mayor parte; es til por ejemplo al cambiar los valores de
SS/SP para que no nos pete en la cara). CLI (CLear Interrupts) inhabilita las
interrupciones, y STI (SeT Interrupts) las activa.
35
E N S A M B L A D O R
I I
Otra cosa: se puede ver que no estoy usando registros extendidos, que uso AX
y DX en vez de EAX y EDX... en fin, recordad hace cunto que existe el MsDos y as respondis a la pregunta :-)
Y en fin, que esto es el sistema de interrupciones en Ms-Dos, que me niego a
volver a tocar porque es perder el tiempo: a quien le interese que escriba en un
buscador algo as como "Ralf Brown Interrupt List", que es una lista salvaje
que tiene todas las funciones habidas y por haber para interrupciones de MsDos. Las ms importantes estn dentro de la INT 21h, que controla cosas
como el acceso a ficheros (creacin, lectura/escritura, borrado...) y directorios.
La Int80h y Linux
En Linux pasa tres cuartas de lo mismo, pero todas las funciones del sistema
estn reunidas bajo una sola interrupcin, la 80h. Vamos a tener 256
posibilidades, que se indican en AL (bueno, podemos hacer un MOV
EAX,<valor> igualmente).
Hay algunas diferencias bsicas con el sistema de Ms-Dos. La primera es ms
"terica" y hace referencia a la seguridad. Cuando estamos ejecutando
normalmente, el procesador tiene privilegio de "usuario". Cuando llamamos a
la INT 80h, pasamos a estado de supervisor y el control de todo lo toma el
kernel. Al terminar de ejecutarse la interrupcin, el procesador vuelve a estar
en sistema usuario (y por supuesto con nivel de usuario el proceso no puede
tocar la tabla de interrupciones). Con Ms-Dos digamos que siempre estamos
en supervisor, podemos cambiar los valores que nos salga de la tabla de
interrupciones y hasta escribir sobre el kernel... pero vamos, lo importante, que
con este sistema, en Linux est todo "cerrado", no hay fisuras (excepto
posibles "bugs", que son corregidos, a diferencia de Windows).
Respecto al paso de parmetros, se utilizan por orden EBX, ECX, etc (y si la
funcin de interrupcin requiere muchos parmetros y no caben en los
registros, lo que se hace es almacenar en EBX un puntero a los parmetros.
mov eax, 05h
; Funcin OpenDir (para abrir un directorio
para leer sus contenidos)
lea ebx, [diractual]
; LEA funciona como un "MOV EBX, offset
diractual"; es ms cmodo.
xor ecx, ecx
int 080h
diractual:
db
'.',0
directorio actual, o sea, el '.'
Queremos
que
habr
el
36
E N S A M B L A D O R
I I
37
E N S A M B L A D O R
I I
Representacin de datos,
etiquetas y comentarios
Buena parte de lo que voy a explicar ahora ha aparecido irremediablemente en
ejemplos de cdigo anteriores; no obstante, creo que ya es hora de
"formalizarlo" y detallarlo un poco. As pues, hablemos de estos formalismos
utilizados en lenguaje ensamblador (tomar como base los del Tasm, algunos
de los cuales lamentablemente no son aplicables al Nasm de Linux):
Datos
La forma ms bsica de representar datos "raw", o sea, "a pelo", es usar DB,
DW o DD. Como se puede uno imaginar, B significa byte, W word y D
Dword (es decir, 8, 16 y 32 bits). Cuando queramos usar una cadena de texto que encerraremos entre comillas simples -, usaremos DB. As, son vlidas
expresiones como las siguientes:
db
00h, 7Fh, 0FFh, 0BAh
dw
5151h
dd
18E7A819h
db
'Esto tambin es una cadena de datos'
db
'Y as tambin',0
db
?,?,?
; as tambin... esto indica que son 3
bytes cuyo valor nos es indiferente.
Hay una segunda forma de representar datos que se utiliza cuando necesitamos
poner una cantidad grande de ellos sin describir cada uno. Por ejemplo,
pongamos que necesito un espacio vaco de 200h bytes cuyo contenido quiero
que sea "0". En lugar de escribirlos a pelo, hacemos algo como esto:
db
200h dup (0h)
Etiquetas
Ya hemos visto el modo ms sencillo de poner una etiqueta; usar un nombre
(ojo, que hay que estar pendiente con maysculas/minsculas porque para
ensambladores como Tasm, "Datos" no es lo mismo que "dAtos" o que
"datos"), seguido de un smbolo de ":". Cualquier referencia a esa etiqueta
38
E N S A M B L A D O R
I I
(como por ejemplo, MOV EAX,[Datos]), la utiliza para sealar el lugar donde
ha de actuar.
Pero hay ms formas de hacer referencias de este tipo; podemos marcar con
etiqueta un byte escribiendo el nombre y a continuacin "label byte" (etiquetar
byte). Un ejemplo (y de paso muestro algo ms sobre lo que se puede hacer)
sera esto:
virus_init
label byte
<cdigo>
<cdigo>
virus_end
label byte
virus_length equ
virus_end - virus_init
Parece que siempre que meto un ejemplo saco algo nuevo de lo que antes no
haba hablado... pero bueno, creo que se entiende; marcamos con label byte
inicio y fin del virus, y hacemos que el valor virus_length equivalga gracias al
uso de "equ", a la diferencia entre ambos (es decir, que si el cdigo encerrado
entre ambas etiquetas ocupa 300 bytes, si hacemos un "MOV EAX,
virus_length" en nuestro cdigo, EAX pasar a valer 300).
Comentarios
Conocemos en este punto de sobra la forma standard de incluir comentarios al
cdigo, esto es, utilizando el punto y coma. Todo lo que quede a la derecha del
punto y coma ser ignorado por el programa ensamblador, con lo que lo
utilizaremos como comentarios al cdigo.
Hay otro mtodo interesante presente en el ensamblador Tasm, que seala el
inicio de un comentario por la existencia de la cadena "Comment %". Todo lo
que vaya despus de esto ser ignorado por el ensamblador hasta que
encuentre otro "%", que marcar el final:
Comment %
Esto es un comentario
para Tasm
y puedes escribir
lo que quieras
entre los porcentajes.
%
39
E N S A M B L A D O R
I I
Se trata de dos instrucciones que manejan directamente los valores del Carry
Flag. CLC significa CLear Carry (lo pone a cero como es de suponer) y STC
es SeT Carry (ponindolo a 1).
Instrucciones de desplazamiento lateral
Ya hemos visto como podemos operar con un registro o una posicin de
memoria con operaciones aritmticas (ADD, SUB, etc) y lgicas (AND, OR,
etc). Nos faltan pues las instrucciones de desplazamiento lateral, de las que hay
de dos tipos:
- Rotacin: Aqu tenemos ROL y ROR, que significa ROtate Left y ROtate
Right. El modo de funcionamiento es sencillo; si ejecutamos un ROR EAX,1,
todos los bits de EAX se movern un paso a la derecha; el primer bit pasar a
ser el segundo, el segundo ser el tercero, etc. Qu pasa con el ltimo bit, en
este caso el bit 32?. Bien, es sencillo, este bit pasar a ser ahora el primero.
En el caso de ROL, la rotacin es a izquierdas; viendo un caso prctico,
supongamos la instruccin ROL AL,2, donde AL valga 01100101. El resultado
de esta operacin sera 10010101. Se puede comprobar que se han movido en
dos posiciones los bits hacia la izquierda; y si alguno "se sale por la izquierda",
entra por la derecha.
- Desplazamiento aritmtico: Tenemos aqu a las instrucciones SHL y
SHR, es decir, SHift Left y SHift Right. La diferencia con ROL/ROR es
sencilla, y consiste en que todo lo que sale por la izquierda o por la derecha se
pierde en lugar de reincorporarse por el otro lado.
Es decir, si hacemos un SHL AL,2 al AL aquel que decamos antes y que vala
01100101, el resultado ser en esta ocasin 10010100 (los dos ltimos espacios
se rellenan con ceros). Es interesante notar que un SHL de una posicin es
como multiplicar por dos la cifra, dos posiciones multiplicar por 4, tres por 8,
etc.
De cadena
Existe toda una serie de instrucciones en el ensamblador 80x86 dedicadas a
tratar cadenas largas de bytes; en estas instrucciones vamos a encontrar algunas
como MOVSx, CMPSx, SCASx, LODSx y STOSx:
- MOVSx: La x (y lo mismo sucede con el resto) ha de ser sustituida por una
B, una W o una D; esto, indica el tamao de cada unidad con la que realizar
una operacin (B es Byte, 8 bits, W es Word, 16 bits, y D es Dword, 32 bits).
Cuando se ejecuta un MOVSx, se leen tantos bytes como indique el tamao de
la "x" de la direccin DS:[ESI], y se copian en ES:[EDI]. Adems, los
registros ESI y EDI se actualizan en consecuencia segn el "movimiento
realizado".
Es decir, que si tenemos en DS:[ESI] el valor "12345678h" y en ES:[EDI] el
valor "87654321h", la instruccin MOVSD har que en ES:[EDI] el nuevo
contenido sea ese "12345678h".
- CMPSx: En esta instruccin de cadena, se comparar el contenido del
byte/word/dword (dependiendo del valor de "x", segn sea B, W o D)
presente en la direccin DS:[ESI] con el de la direccin ES:[EDI],
40
E N S A M B L A D O R
I I
41
E N S A M B L A D O R
I I
42
E N S A M B L A D O R
I I
43
E N S A M B L A D O R
I I
Procesador
1000
0001
0010
0100
0001
0011
0101
0110
1000
Modelo
Intel DX4
Pentium (60-66 Mhz)
Pentium (75-200 Mhz)
Pentium MMX (166-200 Mhz)
Pentium II
Pentium II, model 3
Pentium II model 5 y Celeron
K6
K6-2
RDTSC
Esta instruccin, significa "ReaD TimeStamp Counter". Su funcin, es la de
devolvernos en el par EDX:EAX el "Timestamp" almacenado por el
procesador. Este contador es almacenado por el procesador y se resetea cada
vez que lo hace el procesador, incrementndose en una unidad cada vez que
sucede un ciclo de reloj. Por lo tanto, es obvia su utilidad como generador de
nmeros aleatorios, aunque por algn motivo que no alcanzo a comprender,
dependiendo de un flag en el registro interno CR4 (el flag TSD, Time Stamp
Disable) esta instruccin puede ser restringida para ser ejecutada en el modo
User del procesador (en la prctica, por ejemplo bajo Windows 98 la
instruccin no devuelve nada pues est deshabilitada en este flag, sin embargo
en Linux s lo da...).
Introduccin
matemtico
al
coprocesadoriv
Conceptos bsicos
El coprocesador matemtico o FPU (Floating-Point Unit) utiliza nmeros
tanto reales como enteros, y se maneja mediante instrucciones integradas en el
grupo comn que utilizamos; es decir, que simplemente tiene sus instrucciones
especficas que l va a utilizar.
44
E N S A M B L A D O R
I I
45
E N S A M B L A D O R
I I
Una referencia completa de las instrucciones utilizadas por la FPU (que son
muchas y permiten coger o guardar en memoria, transferir a un formato que
entiendan los registros del procesador y viceversa y unas cuantas operaciones
como incluso senos y cosenos), recomiendo echarle un vistazo a los manuales
de Intel - aunque son medianamente oscuros con el tema.
Ya prcticamente no se ven aplicaciones escritas para MS-DOS, por lo que esta seccin es meramente
anecdtica.
ii
En muchas ocasiones durante nuestras sesiones de crackeo necesitaremos saber que API`s hacen una
determinada tarea, p.ej, mostrar un cartelito diciendo que la contrasea introducida es incorrecta, e
incluso como lo hacen. Para documentarnos en esta materia disponemos de las Crackers Notes,
traducidas ya al espaol, con las API`s de uso ms frecuente, y la WIN32 SDK Reference help, mucho
ms completa, cuya traduccin se est llevando a cabo actualmente (para los que quieran colaborar
busquen en la seccin traducciones de la pgina de Karpoff).
iii
Muchas de estas instrucciones las veremos solo ocasionalmente. No es necesario conocerlas todas, ni
mucho menos saber como funcionan. Solo cuando se nos presente una duda al respecto de estas
instrucciones menos comunes ser interesante regresar aqu para documentarnos sobre su uso. La
mejor Biblia sobre ensamblador y la referencia ltima que pueden consultar en caso de apuro es la
monumental obra The Art of Assembly (www.webster.cs.ucr.edu/).
iv
En palabras del propio autor, de lectura opcional, ya que a estas alturas ms de uno puede estar
agonizando...
46
I N T R O D U C C I O N
A L
Captulo
C R A C K I N G
Empezando:
Desensamblando
calc.exe
1.1 Abra el w32dasm.
1.2 Seleccione "Disassembler Options" del men de disassembler.
Aparecer una caja de dialogo.
47
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
48
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Guardando el texto
desensamblado y
creando un Project File
En este ejercicio usted guardar el texto desensamblado2 en un
archivo ASCII ".alf" el cual podr ser usado para recuperar
rpidamente el listado de cdigo sin hacer el proceso de
desensamblado (a esto se le denomina Project File). Los archivos
Project son especialmente tiles cuando usted analiza
repetidamente archivos largos que tardan mucho tiempo en
desensamblarse.
2.1 Seleccione "Save Dissassembly Text File and Create
Project File" del men de disassembler o presione el botn
de la barra de herramientas.
2.2 Aparecer la ventana "Guardar Archivo" con el nombre por
defecto para salvar el archivo desensamblado con una
extensin *.alf. El directorio por defecto para salvar estos
archivos
es
DRIVE:\W32DASM
DIRECTORY
NAME\WPJFILES, pero puede cambiarse.
Es recomendable que use la extensin y el directorio por
defecto. Cuando el archivo *.alf es creado, un archivo *.wpj
se crea automticamente. Estos dos archivos siempre deben
estar en el mismo directorio para funcionar correctamente.
Los archivos *.alf y *.wpj no deben ser modificados por el
usuario. Si usted quiere editar el texto desensamblado que
reside en el archivo *.alf, haga una copia y renombre el
archivo.
Presione aceptar para salvar el archivo desensamblado y el
Project file.
Abriendo un archivo
Project existente
En este ejercicio usted abrir el archivo Project "wpj" que fue
salvado en el ejercicio 2.
3.1 Seleccione "Open Project File" del menu Project. El
49
T H E
3.2
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Navegando el texto
Desensamblado
En este ejercicio usted aprender como navegar a travs del texto
desensamblado usando las funciones de Search y Goto del
W32Dasm.
de la barra de
4.1 Goto Code Start: Presionando el botn
herramientas (cuarto desde la izquierda) o seleccionando
"Goto Code Start" del men Goto presionando Ctrl + S,
el listado desensamblado estar al principio del cdigo (Code
Start). La parte sombreada con azul es donde el listado es
enfocado. El usuario podr mover la parte sombreada
haciendo doble click en cualquier lnea de texto o
presionando las teclas arriba y abajo.
Note que el listado de cdigo del principio (Code Start) no
es necesariamente donde el programa empieza la ejecucin.
El punto de entrada de la ejecucin (o sea la del programa)
se llama Program Entry Point.
4.2
4.3
de la
Goto Program Entry Point: Presionando el botn
barra de herramientas (quinto desde la izquierda)
seleccionando "Goto Program Entry Point" del men de
Goto presionando F10, el texto desensamblado se situar
en el Program Entry Point. Este es el lugar donde el
programa empieza su ejecucin. Este es el sitio donde el
debugger automticamente parara cuando sea cargado con
algn programa.
de la barra de
Goto Page: Presionando el botn
herramientas (sexto desde la izquierda) seleccionando
"Goto Page" del men de Goto presionando F11,
aparecer una caja de dialogo donde teclear el numero de
pagina a la que se desea ir en el listado desensamblado.
50
T H E
4.4
4.5
T O O L S
O F
T H E
T R A D E
I :
W D A S M
de la barra
Goto Code Location: Presionando el botn
de herramientas (sptimo desde la izquierda) seleccionando
"Goto Code Location" del men de Goto presionando
F12, aparecer una caja de dialogo donde teclear la direccin
a la que se desea ir en el listado desensamblado.
51
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
52
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
53
T H E
4.8
T O O L S
O F
T H E
T R A D E
I :
W D A S M
4.9
de la barra de herramientas
Presionando el botn
(decimoprimero desde la izquierda) seleccionando
"Return From Call" del men de Execute Text
presionando la Flecha Izquierda del teclado, el texto
desensamblado retornara a la direccin de la ultima Call
ejecutada.
Encontrando Funciones Importadas: Para buscar la lista
de las funciones importadas (imported functions) presione el
de la barra de herramientas (doceavo desde la
botn
izquierda) seleccionando "Imports" del men de
Functions. Aparecer una caja de dialogo:
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
55
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Imprimiendo/Copiando el
texto Desensamblado
5.1
5.2
56
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Cargando una
Aplicacin de 32 bits en
el Debugger
En este ejercicio usted cargara e iniciara calc.exe en el debugger.
6.1 Desensamblar el programa Calc.exe.
6.2 Seleccione "Load Process" del men Debug presione
Ctrl + L. Aparecer una caja de dialogo que tiene la opcin
de introducir un comando adicional en el programa antes de
ser cargado. Por ahora solo presione LOAD. Calc.exe ahora
esta cargado en el debugger y la ventana principal del
W32Dasm se movi y adopt otro tamao mientras dos
nuevas ventanas de debugging (Ver figuras 1 y 2) se crearon.
Estas ventanas son llamadas Ventana inferior izquierda y
Ventana inferior derecha. Despus de inicializar el programa
calc.exe WDasm automticamente se situar en el Program
Entry Point. Para el archivo calc.exe se situar en la
direccin:010119E0. La Ventana inferior izquierda tiene
varias cajas que contienen los Registros, los Flags,
BreakPoints, Active DLLs, Code Segment Registers, Trace
History, Event History, User Set Memory Addresses, y Data
Displays. El Data Display 1 tiene cuatro formatos (Dword,
Word, byte, e Instruction) de los cuales usted podr elegir el
que mas le guste. El Source of Data es seleccionado por los
botones de la izquierda. El Data Display 2 muestra los
cuatro formatos de datos en un solo panel y adems tiene un
botn para seleccionar la direccin de la Data Display 1.
Tambin hay disponibles dos cajas para introducir
direcciones de memoria a las cuales quiere acceder. Esta
ventana tiene ms botones con funciones de debugging que
57
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
58
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Corriendo, pausando y
terminando un
programa
En este ejercicio usted correr calc.exe desde el debugger, lo
pausara, y luego lo terminara.
7.1 Para correr calc.exe desde el debugger, presione el botn
Run en la Ventana inferior derecha presione F9. El
programa calc.exe aparecer normalmente. La Memoria, los
Registros y Flags son mostrados en la Ventana inferior
izquierda con varias opciones de mostrar los datos. La
informacin de los Active DLLs, BreakPoints, Trace
History, Event History y el Estatus del debugger son
mostrados en esta ventana.
Para pausar el programa calc.exe, presione el botn Pause
en la Ventana inferior derecha presione la Barra
espaciadora. Esta accin pausar la ejecucin del programa
donde sea que el programa muestre algn mensaje al tiempo
que usted presione pause. El lugar exacto donde el programa
se detiene depende mucho del programa y de la funcin que
estaba llevando a cabo cuando usted hizo pause. Una vez el
programa es pausado usted puede usar la opcin de seguir
paso a paso la ejecucin del programa (single stepping).
Para terminar el programa calc.exe usted puede usar el
procedimiento normal para cerrar un programa3 puede
presionar el botn Terminate en la Ventana inferior
derecha o Ctrl.-T. Cuando se usa la terminacin normal las
ventanas del debugger permacen abiertas y registran todos
los eventos pertinentes a la terminacin del programa.
Cuando usa Terminate usted recibir un mensaje de
advertencia sobre la terminacin el cual puede cancelar. Si
elige terminar el programa terminar y las ventanas del
debugger se cerraran automticamente.
59
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Single Stepping
En este ejercicio usted usar las cuatro funciones del single
stepping en el debugger4.
8.1 Cargue de nuevo el programa calc.exe en el debugger.
8.2 Despus de que el programa cargue y pare en el Program
Entry Point, usted puede ejecutar cada instruccin del
programa usando los botones Single Step Into Single
Step Over en la Ventana inferior derecha. Las teclas F7 y F8
tambin pueden ser usadas. La diferencia entre Single Step
Into y Single Step Over es que el Single Step Into ejecutara
cada instruccin tal como aparece mientras el Single Step
Over "saltara" las funciones repetidas como REP MOVSB, y
tambin saltara las instrucciones Call (no entrara dentro de
ellas).
8.3 Mientras usted tracea paso a paso a travs del programa,
puede observar los cambios en los registros y en la memoria
cuando cada instruccin es ejecutada.
8.4 Los botones Auto Single Step Into (F5) y Auto Single
Step Over (F6) harn su respectiva funcin
automticamente. Para pararlos usted puede presionar los
botones Pause, Single Step Into, Single Step Over
Run.
Colocando y activando
BreakPoints a un
programa
En este ejercicio usted aprender como colocar un breakpoint y
como activarlo y desactivarlo.
9.1 Cargue el programa calc.exe en el debugger.
9.2 Usando la funcin Goto Code Location coloque la direccin
:01004FAB. Esta localizacin tiene como instruccin MOV
EAX, 0000012E. Usted pudo haber obtenido esta
instruccin usando la funcin Men Reference y haciendo
doble click en Menuid_006a, tem: "acerca de calculadora".
Esta instruccin es parte de la rutina que determina la
60
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
61
T H E
9.3
9.4
9.5
T O O L S
O F
T H E
T R A D E
I :
W D A S M
62
T H E
9.6
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Adjuntando a un
proceso activo (Active
Process)
En este ejercicio usted aprender como adjuntar al debugger un
proceso que esta corriendo actualmente en windows.
63
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Modificar registros,
flags, memoria e
instrucciones
En este ejercicio usted aprender como modificar la registros, los
flags, las instrucciones y la memoria con el debugger.
11.1 Cargue el programa calc.exe en el debugger. No inicie el
programa (F9).
11.2 Presione el botn Modify Data que esta en la Lower Left
Hand Debugger Window. Una caja de dialogo aparecer
11.3 Modificar Flags: Para cambiar el valor de un Flag, hacer
click izquierdo en el flag que se desea modificar. Este
cambiara de 0 a 1 en cada click. Cuando un valor de un flag
no es el mismo que el valor original, este estar sombreado
en azul. Ninguna modificacin se ara mientras no presione el
botn "Modify". Restaurando El Valor Del Flag: En
cualquier momento antes de presionar el botn Modify,
usted puede Restaurar (RESET) todos los Flags al valor
original presionando el botn R en la caja de los Flags.
NOTA: El Flag T no puede ser modificado
11.4
65
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
.
11.5 Modificando Los Valores De Los Registros: Para
cambiar un valor de un registro, teclee el valor deseado en la
caja de "Enter Value". Dependiendo del modo que est
seleccionado en la caja de "Mode", usted tiene la opcin de
cambiar el registro DWORD (ej: eax) el registro WORD
(ej: ax) el registro BYTE (ej: ah, al). Presione el botn
designado para el registro que desea modificar. Los registros
cambiados aparecern sombreados en azul. Ninguna
modificacin se har mientras no presione el botn
"Modify".
Restaurando Los Valores De Los Registros: Cada
registro tiene un botn R para restaurarlo al valor original.
11.6 Modificando Valores En Memoria: Para cambiar un valor
en una localizacin en memoria (DWORD, WORD,
BYTE), introduzca el valor deseado en la caja de "Enter
Value" y teclee la direccin de memoria en la caja de dialogo
de Mem Loc. Despus presione el botn "Mem" para
66
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
67
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
68
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
69
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
70
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
desensamblar el archivo.
71
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
13.3 El debugger ahora estar en Auto Single Step Into hasta que
se encuentre con una funcin API que es __set_app_type
en la direccin :01011A0F. Una caja de dialogo aparecer que
muestra la API con el tipo de informacin y los valores
ingresados por la funcin API. Si se pulsa el botn Get Api
72
T H E
T O O L S
O F
T H E
T R A D E
I :
W D A S M
Eligiendo la opcin Exit del programa si la tiene, p.ej, o pulsando sobre el aspa en la esquina superior
derecha de la ventan principal.
Hasta aqu hemos visto las funciones de listado muerto del Wdasm. Adems incluye utilidades de
traceo o depuracin propiamente dichas, poco usadas gracias al Sice.
Status es la ltima lnea del Wdasm, donde se muestra el offset de la lnea de cdigo sombreada.
73
INTRODUCCIN AL CRACKING
Captulo
74
75
INTRODUCCIN AL CRACKING
Los comandos de la lnea INIT estn separados por ';'. Pareciera que algunos
comandos solo funcionan cuando la consola de SoftICE es cerrada por
primera vez. Si encuentras algunos comandos que no estn siendo aplicados,
intenta ponerlos despus de la "X;" en tu lnea INIT. Puedes agregar otra
"X;" para volver a cerrar SoftICE.
76
77
INTRODUCCIN AL CRACKING
78
79
INTRODUCCIN AL CRACKING
80
NOPIC2=on|off
NOLEDS=on|off (habilita/deshabilita la programacin de capslock y
numlock)
NOPAGE=on|off (habilita/deshabilita el mapeo de pginas no presentes)
NOCONTEXT=on|off
MACROS=number (nmero mximo de macros)
NMI on|off(captura Non-Maskable Interrupt-til con hardware breakout
switch)
VERBOSE=on|off (habilita/deshabilita mensajes de diagnstico)
KBD=on|off (parchea/no parchea el controlador de teclado)
LOWERCASE=on|off (habilita/deshabilita assembly en minsculas)
MOUSE=on|off (habilita/deshabilita el soporte de mouse)
THREADP on|off (habilita/deshabilita pasos especficos del thread)
EXCLUDE (parmetro de rango)
SIWVIDRANGE on|off
TRA=tamao (tamao del buffer de trace)
HST=tamao (tamao del buffer de historia de comandos)
LOAD=archivo (carga smbolos)
LOAD%= archivo
LOADX= archivo
LOADX%= archivo
LOAD32= archivo
LOAD32%= archivo
PHYSMB=tamao (cantidad de RAM del sistema)
PHONE=nmero (nmero telefnico para depuracin serial)
COM1=on|off (habilita el COM1 para depuracin serial; funciona para
COM2 y COM3
DINIT=cadena (DISCA la cadena de inicializacin para depuracin
serial)
ANSWER=cadena (CONTESTA la cadena de inicializacin para
depuracin serial) EXP=archivo (carga exports)
VDD
DDRAW
DRAWSIZE=tamao (tamao de la memoria de video en K)
MONITOR
WDMEXPORTS
DISPLAY=tipo (tipo es VIPE, S3, MACH32,MACH86, 0, o VD)
FAULTS=on|off (captura FPGs - Fallas de Proteccin General)
SYM=tamao (tamao de memoria reservado para smbolos)
LBRECORD=on|off (habilita/deshabilita la coleccin de mensajes de la
ltima rama --last-branch message collection)
Los macros pueden ser definidos en winice.dat ingresando la lnea
MACRO nombre=comandos (por ejemplo, MACRO Qexp="addr
explorer; Query %1"). Finalmente, los comandos de teclas de funcin pueden
ser ajustados usando la sintaxis key_combo="^comando;", como por ejemplo
SF1 = "^watch eax;" (ajusta Shift-F1 a "watch eax");. En esta sintaxis, A
significa ALT, C significa CTRL y S significa SHIFT
81
INTRODUCCIN AL CRACKING
82
nombre del mdulo o del selector a ser capturado, seguido por T (para
Back Trace en ejecucin) o TW (para Back Trace en escritura) y
encapsulado por cualquier condicin para el Breakpoint, se
instalar un Breakpoint de rango de memoria que escribir cdigo al
buffer de trace en lugar de detener la ejecucin (parecer que el
programa no se detiene, sin embargo esto es una ilusin). Este buffer
puede ser visto con el comando SHOW, o traceado con el comando
TRACE. Ten en cuenta que usar la funcin BPRW har mas
lento tu sistema en forma considerable (por ejemplo, intntalo con el
mdulo kernel).
SHOW inicio [l longitud] : El comando SHOW muestra los contenidos
del buffer de trace a partir del nmero de ndice especificado en
inicio para el nmero de instrucciones dado en longitud. Ten en
cuenta que index 1 muestra la instruccin mas reciente en el
buffer. Las instrucciones son mostradas en la ventana de
comandos, y pueden desplazarse usando las flechas hacia arriba y abajo.
ESC sale del modo SHOW.
TRACE off | index : El comando TRACE es usado para tracear pasos a
travs del
buffer de Back Trace comenzando en la instruccin
especificada en index. Ten en cuenta que un valor de index de 1 indica
la instruccin ms reciente en el buffer, mientras que un valor de
index de B (no 0X0B) indica el valor mas viejo en el buffer de
trace. El buffer puede ser traceado usando XT, XP y XG en lugar de los
comandos T (F8), P (F10) y G (Nota: Si usas Back Trace
frecuentemente, sera bueno que configuraras las siguientes teclas:
AF8="^XT;", AF10="^XP;", and AF12="^XP ret;"). El comando
TRACE OFF es usado para salir del modo Back Trace.
83
INTRODUCCIN AL CRACKING
Vistas
Las vistas te permiten mantener la pista de una variable mientras estas
depurando un programa. No es necesario decir que es una funcin importante
en el crackeo y la ingeniera inversa. Para abrir una ventana de vistas, escribe
ww en la lnea de comandos de Soft-Ice. Si escribes watch seguido de un
nombre de variable (Ej: watch user_id) agregas esa variable (y su valor) a la
ventana de vistas. Los registros y desplazamientos de pila (para no
mencionar sus valores de memoria) pueden ser vistos usndolos en lugar del
nombre de variable, por ejemplo watch es:di y watch [ebp 18]. Para
agregar, dado que muchos registros y desplazamientos de pila
simplemente apuntan a una direccin donde se almacenan las variables
reales, puedes ver los valores referenciados por ellos escribiendo un asterisco
antes del nombre del registro o desplazamiento (Ej: watch *es:di). Unas
buenas variables para ver son es:di, *es:di, eax y cualquier [esp ?] o [ebp ?] que
referencia entrada por un usuario.
84
Usando Breakpoints
Es imposible depurar en forma efectiva sin el conocimiento del trabajo de
breakpoints (o puntos de quiebre). Un breakpoint es simplemente una
instruccin a la CPU de detener la ejecucin en el momento de acceder a cierta
rea de memoria o en un evento del programa o del sistema (tales como
mensajes de Windows o instrucciones del programa) y luego entregarle la
ejecucin al depurador. Cuando ajustas un breakpoint en Soft-Ice y corres el
programa en cuestin, Soft-Ice aparecer cuando se encuentre la
condicin para el breakpoint, con su pantalla usual de cdigo, registro y
datos, detenido en la instruccin que caus que se active el breakpoint.
Bc # : Clear Breakpoint--elimina un breakpoint ajustado. Debes
conocer el nmero de breakpoint.
Bd # : Disable Breakpoint--deshabilita pero no elimina un breakpoint
ajustado en Soft-Ice. Debes conocer el nmero de breakpoint.
Be # : Enable Breakpoint-Habilita un breakpoint que ha sido
deshabilitado. Debes conocer el nmero de breakpoint.
Bl : List Breakpoints-Muestra una lista de todos los breakpoints
ajustados actualmente en Soft-Ice, su estado y su nmero de
breakpoint.
Bmsg : Quiebre en mensaje de Windows.
Sintaxis: BMSG window handle L begin-message end-message
Bpint : Quiebre en Interrupcin. Solo funciona con interrupciones
manejadas por el IDT (95/NT).
Sintaxis: BPINT numero-int
Bpio: Quiebre en lectura y/o escritura de un puerto de
Entrada/Salida.
Sintaxis: BPIO puerto [R|W|RW] [EQ|NE|GT|LT|M valor]
[c=cuenta]
Bpm: Quiebre en lectura, escritura o ejecucin de memoria.
Sintaxis: BPM[B|W|DW] direccin [R|W|RW|X]
Bpx : Quiebre en ejecucin.
Sintaxis: BPX direccin/smbolo [c=cuenta] [EQ|NE|GT|LT|M
valor] [c=cuenta]
Bpr : Quiebre en Rango de Memoria.
Sintaxis: BPR direccin-inicio direccin- fin [R|W|RW|T|TW]
[expresin]
Bprw : Quiebre en segmento de programa/cdigo.
Sintaxis: BPRW nombre- mdulo|selector [R|W|RW|T|TW]
[expresin]
CSIP : Calificar breakpoints. Sintaxis: CSIP [off |[not] direccininicio
direccin-fin | nombre-mdulo] Usar not hace que el
breakpoint ocurra solo si el CSIP no es igual a las direcciones de
inicio o mdulos de windows listados. De otra forma, la ejecucin se
detiene solo si los breakpoints especificados por el usuario se
encuentran dentro de la direccin o mdulos especificados. "Off"
deshabilita el control de CSIP.
85
INTRODUCCIN AL CRACKING
86
87
INTRODUCCIN AL CRACKING
88
veas algn patrn) y ver cual es el Jcc (salto condicional, por ejemplo JNZ)
que causa el problema, entonces editar las banderas (R FL Z en Soft-Ice
para cambiar de estado a ON o a OFF la bandera Zero) antes de ese JNZ
particular (Esto me ha funcionado solo una vez, y aun as todo lo que hizo
fue que mi computadora no se quedara colgada; la aplicacin se colg
igual). En el otro caso, puedes (Rezar!, es broma) poner la sentencia
RET usando el comando A del Soft Ice (A direccin, donde direccin
es la lnea con el cdigo FFFFFFFF INVALID) y esperar que se haya
llegado a esta rea de cdigo mediante una llamada (CALL) y no un salto
(esto no me ha funcionado de ninguna forma, pero la teora es ms o menos
correcta; ). A menos que hayas escrito y/o memorizado el cdigo fuente del
Kernel de Windows, vas a tener que vivir con las FGPs (pero debes
caer luchando!).
Ejercicios
Soft-Ice es un programa sumamente poderoso con una interfaz complicada,
en el que lo mejor es aprender por medio de la experiencia. Los siguientes
ejercicios estn hechos para familiarizarse con el Soft Ice.
Ejercicio 1: Depurando una aplicacin existente.
A menudo nos frustraremos cundo usemos un programa escrito por una
tercera persona (tercera persona en este caso significando no tu
mismo, mas que no Microsoft); Soft-Ice es una herramienta excelente
para resolver tales situaciones. Inso Corporation's Quick View Plus, por
ejemplo, tiene un bug o error en la ventana "Register": cuando introducimos
un nmero de serie y pulsamos "Register", el programa nos muestra un
mensaje diciendo que el nmero que hemos introducido es invlido. Por
supuesto, Inso Corp ha calificado este bug como una "medida de
seguridad", pero nosotros estamos aqu para arreglarlo.
Comenzaremos instalando el Quick View Plus Trial edition; El Install
Wizard nos guiar a travs de sus deprimentes pantallas azules y sus
ventanas de dilogo grises. Cuando termina, Quick View Plus se
ejecutar y una pequea ventana gris con tres botones ("Purchase",
"Uninstall", "Continue") aparecer; es aqu cuando el ejercicio
comienza en serio.
1) Haz click en "Purchase", luego en "$49", despus en "Accept", y
finalmente en "Unlock by Phone".
2) Pulsa Ctrl-D para ir al Soft Ice. Vamos a intentar localizar los mensajes
de la ventana de registro ("Register"), y para lograr esto necesitamos
tantear un poco el terreno: BMSG requiere un parmetro hwnd, y la
orden HWND requiere un nombre de proceso. Por tanto primero
escribiremos TASK en la lnea de comando del Soft Ice, el cual nos muestra
lo siguiente:
89
INTRODUCCIN AL CRACKING
Taskname
Order32
SS:SP
0000:0000
StackTop
005ED000
...
Aqu est, arriba a nuestra izquierda: Order32. La sintaxis para
HWND es HWND tarea, entonces ahora pondremos HWND ORDER32,
que dar la siguiente salida:
Window-Handle
07A8(1)
07AC(2)
.......
07DC
hQueue
2EEF
2EEF
SZ QOwner Class_Name
32 ORDER32 #32770 (Dialog)
32 ORDER32
Static
2EEF
32
ORDER32
Edit
Window Procedure
173F:00004757
173F:000052FA
173F:00000BF4
90
OK, esto es que nuestro serial est a punto de ser manipulado. Miramos
detenidamente, qu vemos? Nuestro querido 666111666 (o sus
primeros ocho dgitos, en realidad), siendo cargado en ECX como
parmetro de 004047e2. ValidateUnLockCode(UnlockCode). F10 hasta
llegar al JNZ, paramos ah. Vemos lo que pone en JNZ 00404A29 (NO
JUMP) Ahora cambiaremos el estado del flag Zero, para ponerlo en
estado no-cero, esto lo haremos escribiendo R FL Z. Vemos que el
cdigo ha cambiado a lo siguiente: JNZ 00404A29 (JUMP). En este
momento pulsaremos Ctrl-D para volver al programa y veremos si hemos
acertado... aparece una ventana nueva: Quick View PLus Unlocked Thank
you for purchasing, la-la-li-la-la.... Pulsa "OK", esta leccin ha
terminado!, Para finalizar, presionamos Ctrl-D y escribimos BC *
para quitar todos los breakpoints.
91
INTRODUCCIN AL CRACKING
00001151 CPlApplet
00003f3b PPChangePassword
00003eb9 PPGetPasswordStatus
00004006 VerifyScreenSavePwd
92
Esta vctima esta ponindose cada vez ms interesante puede ser necesario
catalogarlo con dificultad Difcil
3) Mira detenidamente el cdigo:
0137:7C45428F
0137:7C454295
0137:7C454297
0137:7C454299
0137:7C45429C
0137:7C45429F
0137:7C4542A0
0137:7C4542A1
0137:7C4542A6
0137:7C4542A8
0137:7C4542AA
0137:7C4542AF
CALL [7C4582BC]
TEST EDI, EDI
JNZ 7C4542B1
LEA EAX, [EBP-04]
LEA ECX, [EBP-14]
PUSH EAX
PUSH ECX
CALL 7C454536
TEST EAX, EAX
JZ 7C4542DE
MOV EAX, 00000001
JMP 7C454322
93
INTRODUCCIN AL CRACKING
94
Durante todo este tutorial se har referencia a la versin 4.05 de Numega SoftIce para
DOS/Win95/Win98.
ii
Desde luego es una recomendacin que suscribimos. Tener una copia de estos manuales, en especial
del Command Reference, nos permitir conocer que hace exactamente una orden que no
empleamos a menudo o como es su sintaxis.
iii
Hasta la fecha los autores solo han encontrado dicha informacin en un programa.
iv
Hace referencia al crackeo de un programa mediante la localizacin de una cadena conocida (ver pag
10).
Como ya se ha mencionado mas arriba en este tutorial, el winice.dat que acompaa el paquete de Sice
ya incluye todas esta lneas EXP precedidas de un ; basta quitar el ; y listo.
vi
Se trata de una de las funciones avanzadas del SoftIce. Cuando identificamos en Wdasm una parte del
cdigo que nos interesa tracear hacia atrs, pero no sabemos de donde viene (no hay cartel
Referenced by ...), ponemos un BPR rango (zona de la que pensamos puede provenir o todo el
programa si no tenemos ni idea) y un bpx en la parte que hemos visto en el Wdasm. Al romper el Bpx
podremos hacer un show identificando de donde parte la llamada (generalmente un jmp [eax+48] o
cosa similar, ya que si no Wdasm dara la referencia)
vii
Similar a anterior salvo que en vez de indicar un rango de direcciones de memoria el SoftIce dispone
automticamente el rango que ocupa el mdulo o programa en ejecucin que le indicamos.
viii
Instruccin muy til para el desempacado manual de ejecutable comprimidos, pero que cuelga el
sistema con frecuencia.
95
INTRODUCCIN AL CRACKING
Captulo
Instalacin y descarga
El sitio oficial de WinHex se encuentra en http://www.winhex.com aunque
tambin puede ser descargado desde otras pginas como tucows, softonic,
cnet. En esa misma pgina se encuentra otro de los productos
hermanos de winhex, el RAMCheat, supongo que ahora entenderis por
qu empec utilizando el WinHex. Este editor es Shareware, y su
nica limitacin es no poder guardar archivos mayores de 200kb, por
ello es aconsejable o bien comprarlo, o bien buscar por la red alguna
versin sin dicha limitacin.
Una vez descargado tendremos un zip que
al descomprimirlo nos
mostrar una serie de archivos, entre ellos uno llamado winhex.exe. Este es
el archivo que tenemos que ejecutar. Tambin hay un archivo de instalacin
llamado setup.exe, pero su ejecucin no aade ninguna funcin que nos interese,
ya que nosotros slo lo utilizaremos como editor hexadecimal, y no
para otras utilidades que se anuncian en la pgina web, como clonado de
datos o borrado irreversible de datos.. Entonces hagamos doble clic sobre el
archivo WinHex.exe y veamos que
es capaz de hacer.
Primeros pasos
Una vez arrancado el programa aparece una ventana en la que se puede elegir
entre acceder a uno de los proyectos recientes, continuar con la ultima sesin,
abrir un script personalizado o preinstalado o bien elegir una de las cuatro
96
Editores Hexadecimales.
opciones de arriba que consisten en abrir un archivo, abrir una unidad de disco,
abrir Ram y abrir el contenido de una carpeta. Lo normal es que
queramos abrir un archivo, para ver el contenido de ste y modificar lo que
hayamos hecho con el debugger. Tambin puede ser interesante abrir la ram para
modificar parmetros en aplicaciones como juegos, etc. Si pulsamos sobre esta
opcin sale una lista con las tareas que estamos realizando y pulsando sobre la
que queramos se puede analizar su contenido.
Checksums
Un checksum es un nmero caracterstico obtenido para verificar la autenticidad
de los datos. Al realizar cambios sobre los archivos, es posible que si los cambios
no se contrarrestan entre si, el checksum cambie, produciendo un error en la
ejecucin del archivo. Para evitar esto el checksum se puede recalcular pulsando
ALT+F2.
97
INTRODUCCIN AL CRACKING
Editores varios
Winhex es capaz tambin de editar discos y ram. La funcin de editar discos
tiene ciertas aplicaciones como la de editar el espacio en blanco de un
disco para poderlo copiar y abrirlo para buscar datos perdidos que no
hayan sido machacados y tambin se pueden copiar sectores. Por su parte el
editor de ram permite ver el contenido en ram de diferentes aplicaciones y
modificarlo, con el inconveniente de que los modulos de 16 bits slo pueden
ser editados desde mquinas con win95/98 y que los mdulos de sistema de
windows no pueden ser alterados.
Algunas teclas rpidas
Hay ciertas teclas o combinaciones de teclas que pueden resultar de inters. La
seleccin se realiza con el ratn, con el botn izquierdo, sobre una seleccin de
ratn se puede deshacer pulsando dos veces con el botn derecho.
La tecla TAB sirve para cambiar de modo hexadecimal a Texto y viceversa.
La tecla INS sirve para cambiar del modo de sobreescritura al de insertar.
El men
El men principal contiene muchas opciones que son evidentes. Explicar las ms
interesantes
Men bsqueda
Esta es una de las funciones que ms utilizaremos, que ser buscar cadenas
hexadecimales o de texto. El men bsqueda presenta las siguientes opciones:
Encontrar texto: Busca cadenas de hasta 50 caracteres.
Encontrar valores Hexadecimales: Busca una cadena de hasta 50 valores
hexadecimales de dos caracteres.
Reemplazar texto: Reemplaza un texto dado por otro seleccionado.
Reemplazar valores Hexadecimales: Funciona igual que el comando
anterior, pero con valores hexadecimales en vez de texto.
Bsqueda combinada: Es una bsqueda en dos archivos diferentes de dos
valores pero en
un mismo offset. Como ejemplo esto se puede utilizar para examinar partidas
guardadas. Por ejemplo sabemos que tenemos 5 vidas en una partida guardada,
guardamos otra con 1 vida y aqu realizamos la bsqueda y veremos cual es
el valor que cambia, luego lo podemos modificar y poner 10 vidas o las que
queramos.
Creo que con esto es suficiente para saber manejar el programa para nuestros
intereses. Si hay dudas acerca de otras funciones conviene utilizar la ayuda del
mismo programa.
98
Editores Hexadecimales.
99
INTRODUCCIN AL CRACKING
Esta es una vista cuando ya abrimos el archivo, por supuesto como este programa
es un editor hexadecimal veremos las posiciones de memoria en offset a la
izquierda y su contenido en Hexadecimal en el centro, en la columna de la
derecha vemos los caracteres ASCII correspondientes a cada posicin de
memoria si los hay, sino un puntito si no existe carcter para ese valor
hexadecimal.
Lo primero que debemos saber es como ubicarnos en un valor offset para
modificarlo.
Si nosotros utilizamos el Wdasm anteriormente y hallamos la posicin de
memoria que queremos modificar en la leccin de Wdasm, se vio que en el borde
inferior si estamos posicionados sobre la lnea a modificar se puede leer el
OFFSET de esa posicin de memoria.
Pero que es exactamente el OFFSET que diferencia tiene con la posicin de
memoria?
En el desensamblado del Wdasm encontramos la respuesta all en las primeras
lneas podemos leer esto.
1001035
1000000
1035
100
Editores Hexadecimales.
BUSCAR-IR A LINEA-PAGINA.
y en la ventanita escribimos 0x1035 ya que nos exige el 0x para demostrar
que es un valor hexadecimal.
76 F7 BF A8 6D F7 BF E7
Vamos al Ultra Edit subimos la barra de desplazamiento hacia el principio
del programa y all marcamos la primera lnea para buscar a partir de all hacia
abajo.
Vamos directamente a Buscar y all ponemos la cadena en forma corrida y le
damos a Buscar y all la encuentra, siempre que usemos este mtodo debemos
101
INTRODUCCIN AL CRACKING
BUSCAR SIGUIENTE luego de hallar una coincidencia, para ver que no haya
otra cadena igual mas adelante.
Ese suele ser el problema de este mtodo que muchas veces se busca una cadena y
se confa uno y modifica algo y resulta que haba dos o tres cadenas iguales mas
adelante que uno no verifico al no usar BUSCAR SIGUIENTE y modifica
cualquier cosa y mal.
Siempre es aconsejable el mtodo del OFFSET si se puede usar.
Bueno una vez que por cualquiera de los mtodos encontramos los bytes a
cambiar escribimos encima de los mismos los valores nuevos y vamos a
ARCHIVOS-GUARDAR y listo ya estarn guardados los cambios y adems el
Ultra Edit generara un archivo de respaldo de extensin bak que en este caso se
llamara calc.bak y que ser original como era antes de realizar los cambios salvo
con la extensin bak en vez de exe.
Este programa tiene muchsimas funciones y posibilidades mas que se pueden ver
claramente en su manual, solo haremos mencin a dos que nos pueden servir en
el tema cracking.
La primera funcin nos da la posibilidad de elegir dos archivos para comparar y
ver las diferencias,
la misma se encuentra en el men ARCHIVOSCOMPARAR ARCHIVOS, podemos poner la tilde en la opcin SOLO
MOSTRAR LINEAS QUE DIFIERAN y saldrn solo las lneas que hay
diferentes entre los dos. Esto es til para ver los cambios que uno realizo o
cuando uno analiza un crack hecho por otra persona para ver que modifico el
mismo al ejecutarlo (habiendo guardado una copia del original en otro lugar antes
de aplicar el crack)
Otra funcin interesante es la de COPIAR Y AGREGAR que se encuentra en el
men EDITAR, y sirve para marcar una zona de valores hexadecimales, copiarla o
cortarla y agregarla en otro lugar del mismo archivo a partir del lugar donde esta el
cursor o tambin para agregarle a partir del cursor los valores hexadecimales
copiados en otro archivo diferente
Con eso completamos esta visin bsica del Ultra Edit en lo referido al tema
cracking
102
Editores Hexadecimales.
103
INTRODUCCIN AL CRACKING
Es la tecla a usar para efectuar los cambios en un archivo. Antes debes situar el
cursor en el primer carcter de la cadena a modificar. La posicin del cursor se
advierte porque est resaltada con otro color de fondo. Te puedes desplazar con
las teclas habituales.
Cuando se pulsa F3 el cursor aparecer en intermitencia. Puedes abandonar
el modo edicin pulsando la tecla Esc. Lo ms habitual es editar en modo
Decode, cuando se trata de efectuar cambios en los cdigos hexadecimales.
Cuando pulses F3, vers que cambia el sistema de direcciones; en lugar de
tener en la columna de la izquierda las RVA (Direcciones Virtuales
Relativas) que son las que nos aparecen en SoftIce y W32Dasm, se ven los
desplazamientos... pero eso ya es otro tema. Tambin te cambiarn los datos de la
columna de la derecha por la misma razn. En suma, asegrate bien de estar en la
RVA que deseas antes de pasar al modo Edicin para no confundirte con estos
cambios. Ahora llegamos al punto en que HIEW tiene una de sus mejores bazas:
puedes cambiar directamente el nmero hexadecimal o introducir la instruccin
ASM que
desees. Para esto ltimo, una vez situado el cursor en el punto
adecuado y tras pulsar F3, pulsas Enter (o F2) y te aparecer una ventanita
(Assembler) con la instruccin sobre la que vas a trabajar. Esto es muy cmodo
porque permite realizar algunos cambios a pelo sin necesidad de saber qu
nmeros hex (opcodes) se requieren para ello. Por ejemplo, en la ventana
Assembler puedes cambiar directamente una instruccin push ebx por push
eax con solo escribirlo; luego HIEW se encargar de hacer aparecer los opcodes
crrespondientes. Para editar las instrucciones ASM en esta ventana vienen muy
bien las teclas retroceso insertar supr inicio fin y las flechas de
dplazamiento. En cualquier momento puedes deshacer los cambios con la tecla
Esc.
104
Editores Hexadecimales.
Cuando hayas terminado de hacer los cambios deseados, pulsas F9 para guardar
los cambios, que ya no se podrn deshacer. Antes de guardar los cambios se
pueden restablecer los caracteres originales situando el cursor en el lugar deseado
y pulsando F3. Si ha salido algo mal, pulsa Esc para dejar el archivo como estaba.
El modo Hex tambin sirve para realizar cambios cuando, por ejemplo, quieres
cambiar un texto que aparece en el programa, y has localizado el punto donde se
encuentra. Caso tpico suelen ser los epgrafes de las ventanas que rezan
Unregistered o Evaluation que se quedan as aunque se hayan efectuado los
cambios necesarios para evitar los trastornos que conllevan esas limitaciones.
Bien, F5 para ir a la direccin deseada; F4 para pasar al modo Hex y F3 para
editar. Ahora, pulsando la tecla de tabulacin puedes pasar a la columna derecha
(ascii) y realizar los cambios a pelo sobre los caracteres.
En este modo Hex hay unas teclas de edicin de bytes (F4, F5, y F6) que
despliegan el valor hexadecimal en formato byte, palabra y doble palabra
respectivamente.
TERMINANDO
Con Esc se sale de HIEW. Si antes de salir se pulsa F10 se guardar la fecha actual
como fecha de modificacin del archivo (timestamp).
105
INTRODUCCIN AL CRACKING
Captulo
Entrando en materia
Con este programita Cruehead / MiB ilustran el ms bsico de los esquemas
de proteccin. Fue posiblemente el primero de los que se usaron all por los
aos 90, cuando aparecieron las dristibuciones shareware. As pues, el
programa recibe una cadena de caracteres que debe evaluar como cierta o
falsa realizando despus una determinada accin o consecuencia.
Esquemticamente el proceso consta de: Introduccin del serial
encriptacin comparacin resultado. En cada uno de estos puntos
podemos intervenir, siendo nuestro objetivo el conseguir que la aplicacin
funcione sin limitaciones. En su variante ms primitiva la comparacin se
106
En el caso que nos ocupa, tenemos una caja de dilogo (DialogBox) que se
abre clickeando sobre Help y luego sobre register. Nos pide un nombre y un
serial. Si ponemos alguno al azar y pulsamos ok vemos el cartel de chico
malo No luck there, mate!.
107
INTRODUCCIN AL CRACKING
Aqu vemos algo que debe resultarnos familiar: No luck there, mate! Es la
cadena de texto que aparece en la ventana cuando introducimos un serial al
azar. Si clickeamos dos veces sobre esta lnea Wdasm nos lleva hasta la
zona del cdigo donde es referenciada:
108
Como podemos ver en este explcito trozo de cdigo, el cartel que aparece
cuando fallamos es un MessageBoxA. Si tomamos referencia de la API
MessageBoxA (a m me gusta tener a mano una copia de las Crackers
Notes) comprenderemos exactamente que hace:
109
INTRODUCCIN AL CRACKING
Adems podemos decir que todas las lneas de cdigo situadas entre el
primer ret y el ltimo son un procedimiento o una funcin, esto es, una
unidad dentro del programa que realiza una tarea concreta, en este caso
pintar una caja de mensaje. A los procedimientos se les llama desde un call
y cuando terminan de ejecutarse retornan el control a la lnea siguiente a su
llamada. Si miramos un poco mas arriba vemos:
110
Resaltado en rojo una parte del cdigo que siempre debe suscitar nuestra
atencin, aunque recordad, crackear no consiste en ir buscando como locos
un cmp o un je/jne, consiste en saber que hace el programa y como lo hace.
Vemos que segn sea la comparacin de 0401241 se realiza el
procedimiento 401245 (que acabamos de ver) o el de 0040134D. Veamos
como es este:
111
INTRODUCCIN AL CRACKING
Bsqueda a lo retro
Ahora vamos a mostrar otra forma de llegar a lo mismo. Como sabemos que
el programa lanza un mensaje de error cuando fallamos, podemos poner un
Bpx en MessageBoxA con el Sice y as caer en una parte del cdigo que
posiblemente se ejecute justo despus de realizar la comparacin del serial.
Para ello arrancamos el programa, ponemos datos al azar, ponemos el Bpx
MessageBoxA y pulsamos ok. Los lectores ms experimentados y tambin
aquellos que hayan ledo hasta aqu con ms atencin sabrn ya
exactamente que lnea va aparecer resalada en el Sice cuando este
interrumpa la ejecucin. Justamente la primera lnea de la API
MessageBoxA. Como sabemos que ha sido llamada como procedimiento
despus de empujar a la pila unos determinados valores, sabemos que
devolver la ejecucin al programa despus de uno varios rets, con lo que
ser suficiente con pulsar F12 (ejecuta hasta el siguiente ret) hasta que
volvamos a caer en el programa principal, lo cual sabremos mirando la lnea
verde que separa la ventana de comandos de la ventana de cdigo en el
Sice, que debe decir crackme1! code. Despus de pulsar una vez F12
llegamos a una parte de cdigo que ya conocemos:
Otra parte conocida. Como vemos se cae en la ejecucin del programa justo
despus de realizada la comparacin, por eso el nombre de retro. Podemos
poner un Bpx en :00401241 y ver que es lo que se compara. Una vez
paramos ah hacemos eax y ebx y vemos 000054B3 y 000054B2.
UHF casi acertamos!
Pero Por qu se comparan estos dos nmeros si ninguno de ellos es el
que nosotros introdujimos? Imaginemos que eax valiera 18055 y ebx
18054. Reconoceramos nuestro serial y deduciramos que compara el
serial bueno (18055) con el nuestro (18054) y que como no son iguales saca
el cartel de chico malo. Aunque no olvidemos una cosa, el ordenador
112
113
INTRODUCCIN AL CRACKING
Echemos un vistazo a las caractersticas de este API para saber que se est
empujando a la pila:
114
El inevitable parcheo
Parchear un programa significa cambiar unos bytes por otros. Para ello se
necesita identificar el offset de los bytes que queremos cambiar, localizarlos
mediante el offset en un editor hexadecimal y cambiarlos. Si editamos un
archivo exe lo que vamos a ver son los valores ASC de los opcodes en
hexadecimal. Por lo tanto, lo que necesitamos es saber el valor en hexadecimal
de la instruccin que vamos a cambiar y de la instruccin por la que queremos
cambiarla, localizarla por medio del offset conocido y sustituirla. Esta es la
explicacin tradicional y la primera que le yo al respecto! Pero para evitar
procesos migraosos u otros de peores consecuencias mi consejo es usar
Hiew. Con Hiew podemos localizar el byte que nos interesa sin conocer su
offset y parchearlo sin conocer el opcode de la instruccin ASM. Antes de
nada haz una copia del ejecutable que vas a parchear. Abre Hiew, pulsa
Alt+F2, selecciona la unidad, luego elige el directorio y el programa. Pulsa F4 y
selecciona decode. Pulsa F5 y la direccin RVA (virtual adress) que quieres
cambiar precedida de un punto .401241. Aqu es donde vimos que se haca la
comparacin del serial encriptado.
115
INTRODUCCIN AL CRACKING
116
Como podis ver la instruccin original JE 40124C se codifica como 7407, que
ocupa 2 bytes. La nueva instruccin, JMP 40124C, se codifica como
E904000000, que ocupa 5 bytes con lo que invade los 3 primeros bytes de la
siguiente, que es el CALL que muestra el cartel de chico malo. Como a
nosotros ese cartel no nos interesa en ningn caso, terminamos de quitarlo
aadiendo 2 instrucciones nop para que no se produzca error por
desplazamiento del marco de lectura (como en las Talasemias). Seguramente
habris pensado otro buen montn de formas de parchear este programa.
Aparte del clsico 74 por 75 y viceversa y el nopeo del CALL maldito, como
dicen los castizos, no existen ms reglas predefinidas, sino que es la
compresin del sistema de proteccin y el anlisis de su cdigo lo que nos hace
decidir el parcheo ms conveniente.
El crack distribuible
Otro aspecto de este tema, quizs el ms interesante por cuestiones obvias, es
la creacin de patchers, esto es, pequeos programitas que toman un ejecutable
original y parchean esos bytes defectuosos hasta dejarlo de nuestro gusto.
Tenemos una variedad de programas que hacen esto, dependiendo nuestra
eleccin del aspecto grfico del patcher, el tamao que ocupa, la cantidad de
bytes que puede parchear y nuestras preferencias personales. Uno que a mi me
gusta bastante es Cogen, del grupo Egoiste, que se puede bajar de coders
domain. Genera parcheadotes en Turbo Assembler a partid de un fichero asm
que contiene el cdigo fuente que nosotros podemos modificar
personalizndolo. Simplemente deberemos tener el programa original sin
parchear y otro parcheado con el Hiel, pulsar el botn Generate y listo, un
pequeo parcheador de tan solo unas kbs que podemos mandar
cmodamente por e-mail a un amigo para que reviva esa aplicacin
caducada
Adems de parchear fsicamente el archivo ejecutable, podemos parchear el
programa una vez que se ha cargado en memoria. Esto es lo que hacen los
117
INTRODUCCIN AL CRACKING
118
Obtener un serial
La mejor forma de crackear un programa siempre es introducir un serial
vlido. El programa no es modificado y todas las rutinas de comprobacin y
de registro verifican nuestra condicin de usuarios autorizados. No solo
modificamos aquellas rutinas que engaan al programa hacindolo creer que
lo estamos, lo cual demasiadas veces puede conducir a errores imprevistos.
Obtener un serial mediante ingeniera inversa supone una considerable
condicin de esfuerzo adicional ya que significa que tenemos un conocimiento
mucho ms exacto de la proteccin del programa que el requerido para un
simple parche. Tambin significa que la proteccin del programa es ms dbil
ya que hay que desmontar todas las rutinas de encriptacin partiendo de un
listado de ASM en el mejor de los casos. Sin embargo nuestro amigo crackme
es un ejemplo sencillo del mtodo a seguir. Si vemos el trozo de cdigo de la
pgina 5, que es donde se encuentra el meollo, veremos el DlgBoxParam
seguido de unas cuantas lneas de cdigo hasta llegar a la comparacin decisiva.
Sabemos que ah se realiza la encriptacin de nuestro serial y del serial bueno y
despus se comparan. Como no vemos en ese listado las instrucciones de
encriptacin, forzosamente han de estar contenidas en alguno de los CALL. Si
traceamos un poco con el Sice en seguida veremos como se hace esto:
Asi pues, parece que el meollo se cocina en esos dos CALLs. Vemoslo de
ms cerca:
119
INTRODUCCIN AL CRACKING
120
121
INTRODUCCIN AL CRACKING
122
mR gANDALF
123