9 Clase Ensamblador Debug e Instrucciones Iniciales
9 Clase Ensamblador Debug e Instrucciones Iniciales
9 Clase Ensamblador Debug e Instrucciones Iniciales
DEPURADORES
Programas utilizados para probar y depurar programas ejecutables. Es muy útil para escribir programas
muy pequeños en lenguaje ensamblador, examinar el contenido de un archivo o examinar el contenido
de memoria.
Los depuradores son tan potentes que podemos realizar la corrección de un error y luego generar
nuevamente el programa, esto vincula la violación de un código de seguridad de un programa para
conocerlo y/o modificarlo, permitiendo usar la aplicación libremente.
Existen depuradores de ALTO NIVEL y de BAJO NIVEL, para nuestro caso nos interesa de BAJO
NIVEL, lo que permite mirar un programa DESEMSAMBLADO, proceso inverso a ENSAMBLAR.
DEPURADORES ACTUALES:
SofICE: Depurador en modo kernel propietario y de pago para Microsoft Windows. Está diseñado para
ejecutarse debajo de Windows, de tal manera que el Sistema Operativo desconozca su presencia. A
diferencia de un depurador de aplicaciones, SoftICE es capaz de suspender todas las operaciones en
Windows cuando se desee, lo cual resulta útil para depurar drivers ya que es importante conocer cómo
se accede al hardware así como las funciones del sistema operativo.
WinDBG: El Depurador de Windows (WinDbg) se puede usar para depurar código en modo kernel y
modo usuario, para analizar volcados de memoria y para examinar los registros de la CPU mientras se
ejecuta el código.
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 1
Fuentes varias e internet UFPS
https://www.microsoft.com/es-co/p/windbg-preview/9pgjgd53tn86?rtc=1&activetab=pivot:overviewtab
Ollydbg: Depurador de código ensamblador de 32 bits para sistemas operativos Microsoft Windows.
Pone especial énfasis en el análisis del código binario, esto lo hace muy útil cuando no está disponible
el código fuente del programa.1 Traza registros, reconoce procedimientos, llamadas a las API, swiches,
tablas, constantes y strings, así como localiza rutinas de archivos objeto y de bibliotecas
x64dbg: Depurador para plataformas de 32 y 64 bits, bajo entornos MICROSOFT muy potente como
otros depuradores, y gran complejidad en su entorno de manejo y estructura.
DEBUG A 16 BITS
Para empezar a trabajar en debug dígito la su nombre respectivo y pulso enter, al pulsar la entrada o
archivo ejecutable del DOS aparecerá el promt de debug el cual es un guión “-”.
FUNCIONES PRINCIPALES
Características de Debug
(Izquierda) Dirección hexadecimal del último byte de la izquierda que se despliega en forma
segmento:desplazamiento.
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 2
Fuentes varias e internet UFPS
(Centro) Representación hexadecimal del área desplegada.
5. Cada línea desplegada consta de 16 bytes separados en 8 bytes por un guión “-”.
6. Por cada byte en la línea se representan por dos caracteres hexadecimales más un espacio en
blanco.
7. Teclas F1 repite carácter por carácter de la ultima instrucción y F5 la repite toda.
Comandos de DEBUG
Ensamblar A [Dirección]
Entrada I Puerto
Salir Q
Desemsamblar U [Intervalo]
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 3
Fuentes varias e internet UFPS
Asignar páginas de memoria expandida XM [Lpágina] [Ppágina] [Identificador]
Ejemplos de DEBUG
1. C:\WINDOWS>debug
-d
(6810):(512)
1A9A:0200 AA 0A C0 75 FA 80 3E C0 - D7 00 74 73 E8 68 07 BE ...u..>...ts.h..
1A9A:0210 91 D6 BF 54 CB A0 39 DF - E8 1B 0A E8 FB 09 75 16 ...T..9.......u.
1A9A:0220 80 3E 83 CF 00 75 0F BA - 96 80 E8 C3 1F E8 D7 E2 .>...u..........
1A9A:0230 BA B8 7E E9 CF 06 80 3E - 8D CF 00 75 42 E8 F1 03 ..~....>...uB...
1A9A:0240 72 10 80 3E 83 CF 00 75 - 36 80 3E C1 D7 00 75 46 r ..>...u6.>...uF
1A9A:0250 EB 2D 80 3E 9C D7 00 75 - 07 80 3E 83 CF 00 74 08 .-.>...u..>...t.
1A9A:0260 C6 06 8E CF 01 E9 CA FE - E8 C4 00 74 86 80 3E C2 ...........t..>.
1A9A:0270 D7 00 74 03 E9 1F FF C6 - 06 8E CF 01 E9 17 FF 80 ..t.............
2. Una palabra rudimentaria en la BIOS nos explica una indicación rudimentaria de los dispositivos
instalados.
BIOS
-d 40:10 “Localidades en que se encuentra instalados los dispositivos detectados por la BIOS”
23 C2 = C2 23 en binario es 1100001000100011
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 4
Fuentes varias e internet UFPS
1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 portatil
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
11 0 0 0 0 1 0 0 0 1 0 0 0 1 1 = C2 23
00=0 01=1 10=2 11=3 BIOS maneja 3 estados Normal, EPP, ECP
3. Unas localidades de memoria nos muestra la marca, modelo y derechos de autor de la BIOS
como lo es
-d FE00:0 luego de pulsar enter siguen pulsando “d” y sigue apareciendo toda la información
-d FFFFF:5
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 5
Fuentes varias e internet UFPS
Insert activa 1 0 0 0 0 0 0 0 = 128 (10) = 80H
Ejemplos:
Valor de Comb Insert Caps Num Scroll Valor de Insert Caps Num Scroll
Comb
F0H X X X X 06H X X
E0H X X X 05H X X
D0H X X X 04H X
C0H X X 03H X X
B0H X X X 02H X
A0H X X 01H X
09H X X 00H
08H X
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 6
Fuentes varias e internet UFPS
Valor de Comb Insert Caps Num Scroll Valor de Insert Caps Num Scroll
Comb
07H X X X
ENSAMBLAR EN MEMORIA
Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble); cuando se utiliza este
comando se le puede dar como parametro la dirección donde se desea que se inicie el ensamblado.
Aunque en este momento no es necesario darle un parametro al comando "a" es recomendable hacerlo
para evitar problemas una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos:
Al hacer ésto aparecerá en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de
estos números, nótese que los primeros cuatro dígitos (en sistema hexadecimal) pueden ser diferentes,
pero los últimos cuatro deben ser 0100, ya que es la dirección que indicamos como inicio. Ahora
podemos introducir las instrucciones:
0C1B:0108 int 20; provoca la terminación del programa y se vuelve al prompt del debug
0C1B:010A
Int 20 No es una instrucción de ensamblador, es una llamada a una interrupción del sistema operativo.
Para ejecutar el programa que escribimos se utliza el comando "g" (Correr el programa en memoria),
al utilizarlo veremos que aparece un mensaje que dice: "Program terminated normally". Naturalmente
con un mensaje como éste no podemos estar seguros que el programa haya hecho la suma, pero existe
una forma sencilla de verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos de
todos los registros del procesador, simplemente teclee:
- r [Enter]
0C1B:010A 0F DB oF
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 7
Fuentes varias e internet UFPS
-g 108, esta instrucción ejecuta el programa, se detiene en la dirección 108 y muestra los contenidos
de los registros.
0C1B:0108 int 20
0C1B:610A
- h 10a 100 ; h obtener la longitud programa donde se hace: dir. final y luego dir. inicial
020A 000A ; resultado del comando anterior donde es: rta de suma y rta resta de las 2 dir anterior.
- r CX ;cambio el valor del registro CX por el obtenido en el tamaño del comando h “000A” CX
0000:000A
Nota: Muchas veces toca observar los registros BX y DX para también colocarlos en Cero por si
tienen algún valor, pues él Debug toma a uno de estos dos registros como parte alta del CX.
-w ; w escribe el programa en el disco y nos indica cuantos bytes escribio. El programa queda
almacenado en el directorio en D.O.S. que nos encontremos ubicados.
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 8
Fuentes varias e internet UFPS
Proporcionar el nombre del archivo que se cargará. Cargarlo utilizando el comando "l" (load).
- l ; l carga programa
- u 100 109 ; u verificar que el programa se cargo en memoria (desensambla para mostrarlo) siempre
se cargan a partir de la dirección 100H
EJERCICIOS
1. Explicación de la Interrupción INT 21 para obtener datos de la BIOS
-a 0100
1A9A:0100 Mov AH,2A EN LA PROXIMA INSTRUCCION EL IP AUMENTO EN 2
1A9A:0102 INT21
1A9A:0104 NOP
Ejecutemos -r para observar los contenidos de los registros y ejecutemos el paso a paso pero con -p
La fecha de la BIOS se nos da de la siguiente manera:
AL: Día de la semana donde 0= domingo
CX: Año en HEX
DH: Mes 01 al 12
DL: Dia 01 al 31
2. Ejercicios de sumas y restas, e incrementos y decrementos
MOV AX,FFEE
MOV BX,45BC
MOV CX,AX
INC CX
DEC BX
ADD AX,BX
MOV DX,AX
SUB CX,0001
MOV AX,CX
ADD BX,0001
NOP ; Al final de los valores deben quedar igual AX,BX y CX que al inicio del programa.
3. Ejercicio de Pila
MOV AX,8BCF
ADD BX,0002
INC AX
PUSH BX
PUSH AX
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 9
Fuentes varias e internet UFPS
INC SP
DEC SP
POP AX
POP BX
MOV CX,BX
NOP
- h 10F 100 Realizo el calculo del tamaño en bytes del programa en memoria.
020F 000F Retorna la SUMA y RESTA de los valores colocados como parámetros.
- r CX Modifico el valor del CX pues es el No. que toma Debug para calcular tamaño
INSTRUCIONES INICIALES
Donde Destino es el lugar a donde se moverán los datos y fuente es el lugar donde se encuentran
dichos datos.
Direccionamiento de Registro
Copia un byte, palabra o palabra doble a un registro.
Direccionamiento inmediato
Copia un byte, palabra o palabra doble a un registro o localidad de memoria.
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 10
Fuentes varias e internet UFPS
Direccionamiento directo
Copia un byte, palabra o palabra doble a un registro.
Ejemplos
La instrucción PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando
fuente a la nueva dirección resultante en el registro recién modificado.
El decremento en la dirección se debe a que al agregar valores a la pila ésta crece de la dirección
mayor a la dirección menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que
hacemos es aumentar el tamaño de la pila en dos bytes, que es la única cantidad de información que
puede manejar la pila en cada entrada y salida de datos.
Ejemplo: Suposición SP=FFEE
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 11
Fuentes varias e internet UFPS
Esta instrucción transfiere el último valor almacenado en la pila al operando destino, despues
incrementa en dos el registro SP.
Este incremento se debe a que la pila va creciendo desde la dirección mas alta de memoria del
segmento hacia la mas baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en
dos el registro SP realmente se le esta restando dos al tamaño real de la pila.
Ejemplos
Ejemplo:
Ejemplo:
MOV AX,02E4H ; Mueve al AX el número 02E4H
MOV BX,00FFH ; Mueve al BX el número 00FFH
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 12
Fuentes varias e internet UFPS
SUB AX,BX ; Resta el contenido del AX con el BX y guarda el resultado en AX=01E5H
INT 21H ; Finaliza el programa.
Esta operación resta 1 al operando destino y almacena el nuevo valor en el mismo oeprando.
Ejemplo:
MOV AX,4567 ; Mueve al AX el número 4567H
MOV BX,1234 ; Mueve al BX el número 1234H
DEC AX ; Decrementa el AX en 1 osea el AX=4566H
DEC BX ; Decrementa el BX en 1 osea el BX=1233H
Ejemplo:
MOV AX,4567 ; Mueve al AX el número 4567H
MOV BX,1234 ; Mueve al BX el número 1234H
INC AX ; Incrementa el AX en 1 osea el AX=4568H
INC BX ; Incrementa el BX en 1 osea el BX=1235H
Instrucción MOVSX y MOVZX: Se utilizan para complementar las limitaciones de MOV. Permitiendo
mover de un byte a dos y de dos a cuatro ósea de una byte a una palabra o de una palabra a una
palabra doble
Ejemplo:
Var1 DB 1111b
Var2 DW 10101111b
MOVSX AX,Var1 // Mueve el valor Var1 al AX el cual toma el valor AX=1111 1111
MOVZX EBX,Var2 // Mueve el valor Var2 al EBX el cual toma el valor EBX=0000 0000 1010 1111
MOVSX Var1,AH // Mueve el valor AH a Var1 el cual toma el valor Var1=1111
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 13
Fuentes varias e internet UFPS
Realiza una transferencia de datos diferente a la realizada por MOV “Mueve valores copiando del origen
al destino”, permitiendo intercambiar los datos del origen al destino y del destino al origen.
Solo se permite su uso para el intercambio de datos entre dos registros y entre registro y memoria.
Por ejemplo:
XCHG AX,CX
XCHG AX,VAR1
XCHG VAR1,BX
VAR3=3434
VAR3 DB ´1234´
Insert 80H
Caps Lock 40H
Bloq Num 20H
Scroll Lock 10H
Mati Epp Is M. Fabian Robles A. www.roblestecnologia.com Arq del Compt UFPS Página 15