⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hookint.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 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 + -