Détournement d'une int bios

Contenu du snippet

;détournement d'une interruption bios 
;ex avec 11h (config système) qui devient 10 h(mode vidéo) 
;------------------------------------ 

org 100h 

;avant de bidouiller on sauvegarde le mode video courant 
;------------------------------------------------------- 

mov ah,0fh 
int 10h 
mov [modeVideo],al 

;obtention des adresses des gestionnaires de int 10h et int 11h 
;-------------------------------------------------------------- 

push 0h    ;adresse début IVT 
pop fs    ;devient notre segment de données 
mov edx,40h   ;correspond à l'entrée 10h 
xor ax,ax 
mov ax,[fs:edx]   ;ax contient le word n°1 du pointeur FAR (=segment) 
mov [FAR_segment_bios_10h],ax 
mov ax,[fs:edx+2]  ;ax contient le word n°2 (=offset) 
mov [FAR_offset_bios_10h],ax ; [FAR_segment_bios_10h]:[FAR_offset_bios_10h]=adresse du gestionnaire de int 10h 

mov ax,[fs:edx+4]  ;idem pour int 11h 
mov [FAR_segment_bios_11h],ax 
mov ax,[fs:edx+6] 
mov [FAR_offset_bios_11h],ax ; [FAR_segment_bios_11h]:[FAR_offset_bios_11h]=adresse du gestionnaire de int 11h 

;remplacement de l'adresse du gestionnaire de int 11h par celui de int 10h 
;------------------------------------------------------------------------- 

mov ax,[FAR_segment_bios_10h] 
mov [fs:edx+4],ax 
mov ax,[FAR_offset_bios_10h] 
mov [fs:edx+6],ax 

; test 
;------ 

mov ah,0 
mov al,13h     ;vga 320*200 256 couleurs 
int 11h      ;+++++++++++ revient à int 10h 

push 0a000h 
pop fs 
mov edx,10 
xor ax,ax 
mov al,5 
mov [fs:edx],ax ;on allume un pixel 

;tempo 
;----- 

int 16h  ;on attend une frappe clavier 

;on remet tout dans l'ordre (int 11h redevient int 11h) 
;------------------------------------------------------ 

mov ax,[FAR_segment_bios_11h] 
mov [fs:edx+4],ax 
mov ax,[FAR_offset_bios_11h] 
mov [fs:edx+6],ax 

;on remet le mode video du départ pour sortir proprement 
;------------------------------------------------------- 

mov ah,0 
mov al,[modeVideo] 
int 10h 

ret 

modeVideo  db 0 
FAR_segment_bios_11h dw 0 
FAR_offset_bios_11h dw 0 
FAR_segment_bios_10h dw 0 
FAR_offset_bios_10h dw 0

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.