📄 hookint.asm
字号:
;*********************
;文件:HookInt.asm *
;功能:对中断09H挂钩 *
;*********************
.386p
include C:\98DDK\inc\win98\vmm.inc
include C:\98DDK\inc\win98\shell.inc
include C:\98DDK\inc\win98\debug.inc
INT_NUM = 09H ;中断号
Declare_Virtual_Device \
HOOKINT, \
1, 0, \
HOOKINT_control, \
Undefined_Device_ID, Undefined_Init_Order
;消息分派
BeginProc HOOKINT_control,LOCKED
Control_Dispatch Sys_Dynamic_Device_Init, OnDynInitAsm, cCall
Control_Dispatch Sys_Dynamic_Device_Exit, OnDynExitAsm, cCall
Control_Dispatch W32_DeviceIOControl, OnDynCtlAsm, cCall
clc
ret
EndProc HOOKINT_control
;数据段
VxD_LOCKED_DATA_SEG
Caption db "Hook Interrupt",0
VxDInit db "Beging Hook Interrupt.",0
KeyPress_V86 db "用户在DOS窗口中按了'A'键",0
KeyPress_PM db "用户在保护模式程序中按了'A'键",0
align 4
PreHookProc dd ?
Old_Sel dW ?
Old_Off dd ?
VxD_LOCKED_DATA_ENDS
;代码段
VxD_LOCKED_CODE_SEG
BeginProc MsgBox ;显示消息框
VMMCall Get_sys_vm_handle
mov eax,MB_OK+MB_ICONEXCLAMATION
mov edi,OFFSET32 Caption
xor esi,esi
xor edx,edx
VxDCall SHELL_Message
ret
EndProc MsgBox
BeginProc HookProc ;V86的中断处理
pushad
pushf
in al,60H
cmp al,1Eh ;按了‘A’键?
jnz HookProcOK
mov ecx, OFFSET32 KeyPress_V86
call MsgBox
HookProcOK:
popf
popad
stc
ret
EndProc HookProc
BeginProc PMProc ;保护模式的中断处理
pushad
pushf
in al,60H
cmp al,1Eh ;按了‘A’键?
jnz PMProcOK
mov ecx, OFFSET32 KeyPress_PM
call MsgBox
PMProcOK:
popf
popad
mov cx,[Old_Sel]
mov edx,[Old_Off]
VMMjmp Simulate_Far_Jmp ;跳加原处理程序
EndProc PMProc
BeginProc OnDynInitAsm
mov ecx, OFFSET32 VxDInit
call MsgBox
mov eax,INT_NUM
VMMCall Get_PM_Int_Vector ;取保护模式中断向量
mov [Old_Sel],cx
mov [Old_Off],edx
mov esi,offset32 PMProc ;分配回调函数
VMMCall Allocate_PM_Call_Back
mov ecx,eax
shr ecx,16
movzx edx,ax
mov eax,INT_NUM
VMMCall Set_PM_Int_Vector ;设置保护模式中断向量
mov eax, INT_NUM
mov esi, OFFSET32 HookProc
VMMCall Hook_V86_Int_Chain ;设置V86中断钩子
mov eax,1
ret
EndProc OnDynInitAsm
BeginProc OnDynExitAsm
mov eax,INT_NUM
mov cx,[Old_Sel]
mov edx,[Old_Off]
VMMCall Set_PM_Int_Vector ;设回原值
mov eax, INT_NUM
mov esi, OFFSET32 HookProc
VMMCall Unhook_V86_Int_Chain ;卸载V86中断钩子
mov eax,1
ret
EndProc OnDynExitAsm
BeginProc OnDynCtlAsm
xor eax,eax
ret
EndProc OnDynCtlAsm
VxD_LOCKED_CODE_ENDS
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -