您的位置:首页 > 编程语言 > Java开发

汇编学习历程(按键中断劫持)

2013-04-23 23:03 302 查看
assume cs:code,ds:data,ss:stack

code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16									;set about segment

mov ax,0
mov es,ax
mov ax,word ptr es:[36]
mov ds:[0],ax
mov ax,word ptr es:[38]
mov ds:[2],ax								;save interrupted address

mov word ptr es:[36],offset key_dispose
mov word ptr es:[38],cs					;exchenge interrupted address

mov ax,0b800h
mov es,ax

mov al,'a'
flag:
mov byte ptr es:[7D0h],al
inc al
call sub_empty
cmp al,'z'
je flag
jb flag											;echo a char

mov ax,0
mov es,ax
push ds:[0]
pop es:[36]
push ds:[2]
pop es:[38]									;recover interrupted address

mov ax,4c00h
int 21h											;program return

key_dispose:
push ax
push bx
push es											;save segment

in al,60h										;rede key_virtual

pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[0]							;imitate iret

cmp al,1										;if esc pressdown
jne exit
mov ax,0b800h
mov es,ax
inc byte ptr es:[7d1h]

exit:
pop es
pop bx
pop ax
iret

sub_empty:									;empty loop
push ax
push cx
pushf

mov ax,9000h
outer:
dec ax
mov cx,0FFFh
core:
nop
nop
loop core

cmp ax,0
ja outer

popf
pop cx
pop ax
ret

code ends

stack segment
dw 8 dup(0)
stack ends

data segment
db 'this is a empty!'
data ends

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息