Another Example: #include<BIOS.H> #include<DOS.H> char st[80] ={"Hello World$"}; char st1[80] ={"Hello Students!$"}; void interrupt (*oldint65)( ); void interrupt newint65( ); void main() { oldint65 = getvect(0x65); setvect(0x65, newint65); keep(0, 1000); }
Continued: void interrupt newint65( ) { if (( _AH ) = = 0) _AH = 0x09; _DX = (unsigned int) st; geninterrupt (0x21); } else if (( _AH ) = = 1) _DX = (unsigned int) st1;
#include<BIOS.H> #include<DOS.H> void main() { 2nd Program: #include<BIOS.H> #include<DOS.H> void main() { _AH = 1; geninterrupt (0x65); _AH = 0; }
Interrupt Interception Hooks/Stealing
Execution Interrupted ISR Perform I/O Normal Execution of Interrupt
New Routine Original Routine Interrupt Interception
Original Routine New Routine Other form of Interrupt Interception
void Interrupt newint(); void Interrupt (*old)(); void main() { old=getvect(0x08); Setvect(0x08,newint); Keep(0,1000); } void interrupt newint () (*old)();
Timer Interrupt
Hardware Interrupts Invoked by Means of Hardware Approximately occurs 18.2 times per second
BIOS Data Area 0040:0000
Keyboard Status Word 7 6 5 4 3 2 1 40:17H Insert key Caps Lock Key 40:17H Insert key Caps Lock Key Num Lock key Scroll lock key Right Shift key Left Shift Key Ctrl Key Alt Key Keyboard Status Word
#include <dos.h> void Interrupt (*old)(); void Interrupt new(); Char far *scr=(char far* ) 0x00400017; Void main() { old=getvect(0x08); Setvect(0x08,new); Keep(0,1000); } Void interrupt new (){ *scr=64; (*old)();
New Routine Original Routine Interrupt Interception
Memory Mapped Isolated I/O
Isolated I/O M P I/O IN OUT
Memory Mapped I/O MOV M I/O P MOV
Memory Mapped I/O ON Monitor B8OO:0002 B8OO:0003 B8OO:0000 B8OO:0001 Low Byte = ASCII CODE High Byte =Attribute Byte
Memory Mapped I/O ON Monitor fore color X Blink Back Color Color Bold 000 Black 100 Red 010 Green 001 Blue 111 White Low Byte = Ascii Code High Byte = Attribute Byte
unsigned int far *scr=0xb8000000; void main() { (*scr)=0x0756; (*(scr+1))=0x7055; }