Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Agosto 21, 2008, 01:35:07
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  ASM (Moderador: The Shadow)  |  Tema: [W] Arranque del ordenador 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: [W] Arranque del ordenador  (Leído 105 veces)
The Shadow
Moderadores
Colaborador
*****
Desconectado Desconectado

Mensajes: 801


Fucking mnemonic c0d1n6!

shadow@el-hacker.org
Ver Perfil Email
« en: Marzo 22, 2008, 01:42:31 »

Código:
;Compilar con MASM 5.0, luego el LINK y ejecuta el fichero.exe obtenido.

;Programa de arranque similar al de los sistemas operativos que arrancan
;desde disquetes o discos duros. Estos programas arrancan en modo real
;X86 basados en un estandar que cumplen todos los ordenadores compatibles
;con IBM-PC. Hasta la fecha los KXP-7 y Pentium-IV lo siguen haciendo.
; Todo ordenador luego de ejecutar el POST de su BIOS, cargan del disco
;duro o disquetes la informacisn contenida en un sector especmfico
;situado en cara 0, pista 0 y sector 1. Estos 512 bytes, de los cuales
;todos no son csdigo de maquina o ejecutable directamente por la CPU,
;se depositan en un segmento y desplazamiento especifico de su ordenador.
; Segmento y desplazamiento 0000:7C00H, y automaticamente se le transfiere el
;control de ejecucion al primer byte del sector cargado, es decir el puntero
;de instruccion IP de la CPU apunta a 0000:7C00H. Generalmente esta posicisn
;contiene un salto intrasegmento, desplazandose unos 53 bytes
;donde se encuentra el resto del codigo ejecutable del arranque de su ordenador.
;Este salto se debe a que cada disquete, tiene una zona especifica para indicar
;su formato, es decir cantidad de caras, sectores por pistas, cantidad de copias
;de la FAT y otros datos de interes que no debemos borrar.

;Este programa vale para su Disco duro, PERO CON MUCHOS CAMBIOS y hay que saber
;que se esta haciendo en todo momento para no perder la informacisn del disco duro.

;BIOS, Sistema basico de entrada y salida brindado por los fabricantes para acceder
;a sus dispositivos sin utilizar los puertos. Son rutinas en csdigo de maquina
;almacenadas en ROM o EPROM en trajetas, perifiricos y metherborad.

;FAT, Tabla de localizacisn de ficheros utilizada por los sistemas operativos MS-DOS,
;Windows 3.XX, 9X, 2000, NT y XP.Para los zltimos, en el caso que no desee utilizar NTFS,
;pues el estnadar segzn la capacidad de su disco duro puede ser FAT 8 bits, FAT 16 bits
;y FAT 32 bits. NTFS, es algo como la FAST, pero con menos documentacisn de su estructura
;para almacenar la informacisn el los discos duros.

;BOOT SECTOR, Sector de arranque de disquetes o Discos duros, el mismo se utiliza para
;almacenar un pequeqo programa de arranque de su ordenador, que ira cargando poco a poco
;su Sistema Operativo. Ademas contiene informacisn del tipo de soporte magnitico, como
;capacidad, sectores por cara, cantidad de FAT, Copias de Fat...


.8086

alfa  segment para public 'code'
org  0100h
assume cs:alfa,es:alfa,ds:alfa,ss:alfa
inicio proc near

push cs
pop ds
push cs
pop es


mov ax,0201h            ;Servicio 02H para leer un sector del disco
mov cx,0001h            ;pista y numero del sector a leer dentro de la pista
mov dh,00h              ;Cara donde se encuentra el sector a leer
mov dl,0                ;Unidad fisica a leer,en este caso Torre "A" no cambie esto.
mov bx,offset final     ;Zona donde cargaremos los 512 bytes del sector leido
int 13h                 ;Interrupcion del BIOS dada por el fabricante para
                        ;acceder a los discos.
; todo esto es para leer el sector 1, cara 0, pista 0 de su disquete,
; el cual debe estar ubicado en la torre "A" de su ordenador.

mov si,offset inicio
mov bx,offset mensx

jnc notERRORread        ;Salata si no hay error en la lectura del disquete
     
     
errorINdisk:
dec cs:[flagDISK]       ;Como hay error hago la ultima operacion 3 veces
jz Print                ;Si ya se ha intentado realizar 3 veces, Aborto
       
                   
xor ah,ah               ;Servicio 0H para recalibrar unidad de disco
mov dl,0                ;Unidad "A a recalibrar producto a un error
int 13h
jc errorINdisk          ;Si hay error al recalibrar salto a chequear veces
   

recalibro:              ;Si salta aqui, es que no hay problemas en recalibracion
push si                 ;En este registro comienza la rutina pendiente
ret                     ;Se apila y luego se le dice a la CPU que retorne al valor
                        ;que hay en la pila que es el de la rutina pendiente.
                        ;Esto es un recurso de programacion, pues normalmente
                        ;Un "RET", va acompa$ado de un "CALL"
     
notERRORread:           ;Si salta aqui, es que pudo leer el Boot sector
mov cs:[flagDISK],03h   ;Restablece a 3 veces los intentos de la ultima operacion

mov si,offset final+03h ;Posicion donde estan los datos del disquete Para el S.O
mov di,offset reservados;Posicion donde salvare esos datos para cuando escriba
mov cx,0033h            ;Cantidad de bytes a mover
   
cld
rep movsb               ;Permite mover bytes de DS:SI a ES:SI segun la cantidad
                        ;puesta en CX
       
mov si,offset write1    ;Pongo posicion de la rutina a realizar con el disquete

write1: 
mov ax,0301h            ;Servicio 03H para escribir en disco
mov cx,0001h            ;Pista 0, primer sector
mov dh,00h              ;Pista 0
mov dl,0                ;Unidad donde escribiremos, Torre "A"
mov bx,offset bootEXEC  ;Datos a escribir, en realidad es el BOOT SECTOR personlizado
int 13h                 ;Interrupcion del BIOS que permite el acceso al disco
jnc exitDOS             ;Salta si no hay error

mov bx,offset mensb5    ;Mensaje a Imprimir si no se puede realizar la escritura
jmp errorINdisk         ;Rutina que trata de recalibrar el disco para luego escribir
   
 

exitDOS:
mov bx,offset mensE7    ;Si salta aqui es que ya se ha escrito correctamente
                        ;el boot sector o sector de arranque personalizado

print:                  ;Rutina para Imprimir Una cadena en Pantalla
mov ah,09h              ;Servico 09H de la interrupcion 21H del S.O
push cs                 ;Segmento DS debe apuntar al segmento donde esta mi cadena
pop ds
mov dx,bx               ;En DX debe estar el puntero donde comienza la cadena
int 21h                 ;Interrupcion multiple del S.O para varios propositos

exit:
mov ax,4c00h            ;Servicio que le indica al S.O que la aplicacion ha finalizado
int 21h

flagDISK   db 3         ;Variable para controlar intentos de repeticion de una operacion

mensE7 db 0ah,0dh,'  Disco con Arranque Personalizado:',0ah,0dh
mensE8 db ' Ya puede reiniciar su Ordenador, recuerde que debe establecer en su SETUP',0ah,0dh
mensE9 db 'la opcion de arrancar por Unidad A o disquete...',0ah,0dh,'$'

mensx  db 0ah,0dh,'  ERROR:',0ah,0dh
mensx1 db ' Imposible leer. No hay disco en la Unidad A: o sectores da$ados...',0ah,0dh,'$'

mensb5 db 0ah,0dh,'  ERROR:',0ah,0dh
mensb4 db ' Imposible escribir. Disco Protegido contra escritura o sectores da$ados...',0ah,0dh,'$'


;----------------------------------------------------------------------------
bootEXEC:
;reservo 512 bytes para el programa que estar  en el
;boot sector, el cual imprimira en pantalla las teclas que pulse
;y saldra para arrancar por su disco duro con la tecla ESCAPE "ESC"


jmp boot        ;Cuando esto es escrito en el boot sector de su disquete
                ;y es cargado por el BIOS en el arranque de su ordenador
                ;esta es la primera instruccion a ejecutar por la CPU
                ;SALTAMOS, pues los bytes restantes es el area de datos
                ;utilizadas por el S.O para saber que tipo de disco es

;reservo los datos de gu!a para el DOS

reservados:     
r1    dw 0
r2    dw 0     
r3    dw 0
r4    dw 0
r5    dw 0
r6    dw 0
r7    dw 0
r8    dw 0
r9    dw 0
r10   dw 0
r11   dw 0
r12   dw 0     
r13   dw 0
r14   dw 0
r15   dw 0
r16   dw 0
r17   dw 0
r18   dw 0
r19   dw 0
r20   dw 0
r21   dw 0
r22   dw 0     
r23   dw 0
r24   dw 0
r25   dw 0
r26   db 0


 
boot:
cli                     ;Desactivo las interrupciones.
xor si,si               ;Posiciono el segmento de pila en el segmento 0000
mov ss,si
mov sp,7c00h            ;Posiciono el puntero de pila(SP) en 7C00H y el puntero base(BP)
mov bp,7c00h
sti                     ;Activo las interrupciones. Esto en realidad se hace
                        ;por un motivo, pero es largo de explicar.

mov ds,si               ;Apunto mi segmento de datos(DS) y extra(ES) a 0000
mov es,si

mov ax,0003h
int 10h               ;Con esto pondr el modo texto 80X25


mov ah,02h            ;Posiciona el cursor en fila 0 columna 0
mov bh,0
mov dx,0100h
int 10h               ;Interrupcion de video que permite estas funciones

mov dx,7c00h+(offset Welcome-offset bootEXEC) ;Imprimo Mensaje de Bienvenida en pantalla
mov cx,0000h
call PrintString      ;Subrutina que permite imprimir una cadena en pantalla

readKEY:
xor ah,ah             ;Leo el teclado hastya que pulsen una tecla
int 16h               ;Interrupcion que permite leer el teclado
       
cmp al,00h            ;Comparo el tipo de tecla que devuelve al pulsarlas
je readKEY            ;Si no es tecla imprimible en pantalla,entonces no se imprime


mov ah,0eh            ;Imprimo en pantalla el caracter correspondiente a la tecla pulsada 
int 10H

cmp al,1bh            ;Controlo si la tecla pulsada es "ESC"
jne readKEY           ;De no serlo, sigo leyendo el teclado e imprimiendo

mov dx,7c00h+(offset GoodBye-offset bootEXEC)
mov cx,1400h
call PrintString      ;Como se pulso la tecla "ESC", entonces imprimo mensaje
                      ;de despedida.

xor ah,ah             ;Espero a que presionen una tecla para volver a la
int 16h               ;secuencia de arranque del BIOS de su ordenador

int 19h               ;Esta interrupcion es la que invoca la secuencia de
                      ;arranque del BIOS de su ordenador

PrintString:          ;Imprime una cadena directamente en pantalla
mov ax,0b800h         ;En CX fila y columna
mov es,ax             ;en DX puntero al comienzo de la cadena
                      ;la cadena debe terminar en '$'
Push cs
pop ds

mov ax,160
mul ch

shl cl,1
xor ch,ch

add ax,cx

mov di,ax
mov si,dx

cld

again_PrintString:
lodsb
cmp al,'$'
je exit_PrintString
mov ah,1fh
stosw
jmp again_PrintString


exit_PrintString:
ret

GoodBye  db 'Retire el disqute y presione una tecla para cargar su Sistema '
GoodBye1 db 'Operativo...$'

Welcome  db 'Ya puede teclear el texto que desee, Para salir, presione ESC$'

final db 0 

inicio endp
alfa ends
end inicio

Autor: Wilfredo Pérez Velázquez
Fuente: LWP
« Última modificación: Marzo 28, 2008, 05:11:25 por The Shadow » En línea





Reglamento del Foro     Linux  Registered User #473016
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  ASM (Moderador: The Shadow)  |  Tema: [W] Arranque del ordenador « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC