gklch
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2002-08-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:982回复:2

请教在VXD中如何拦截文件IO?

楼主#
更多 发布于:2002-07-29 20:13
使用IFSMgr_InstallFileSystemApiHook注册自己的hook函数
my_File_Api_Hook,代码如下:

mov      eax,OFFSET32 my_File_Api_Hook
VXDCall  IFSMgr_InstallFileSystemApiHook

IFSMgr_InstallFileSystemApiHook返回前一个用户hook函数的
指针,在eax中,应该把它保存起来:

mov      the_Old_File_Api_Hook,eax

这样就可以在自己的hook-my_File_Api_Hook
中加上我们需要的代码了
问题是在my_File_Api_Hook 中返回时要调用前一个VXD的hook
the_Old_File_Api_Hook,具体应如何实现呢,是怎样的调用
关系,使用jmp还是call?
朋友你好
cat5
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2002-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-30 09:25
我知道CIH中用的是call
gklch
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2002-08-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-31 18:11
下面是一个拦截文件IO的VXD例子,不过在98下不能通过
我还不懂用调试工具,但经过在VXD代码里调试,发现
问题出在“文件系统API 钩子过程-File_System_Api_Hook”
已经确定的是钩子过程已经勾连成功,但当VMM调用钩子
过程时98死机,我想应该是VXD的钩子过程没有正确地恢复
环境和正确调用上一个钩子过程。哪位大侠知道原因呢?

;FILEHOOK.VXD--拦截Windows 95/98文件操作的VxD  

.386p  

.XLIST  

INCLUDE VMM.Inc  
INCLUDE VWin32.Inc  
INCLUDE Shell.Inc  

MASM=1  

INCLUDE IFS.Inc  
INCLUDE IFSMgr.Inc  

.LIST  

;VxD声明  

Declare_Virtual_Device  
FILEHOOK,1,0,VxD_Control,Undefined_Device_ID,,,  

;保护模式数据段  

VxD_DATA_SEG  
Prev_File_System_Api_Hook dd 0  
In_File_System_Api_Hook db 0  
Message1 db \'Open file !\',0  
Caption1 db \'FILEHOOK\',0  
VxD_DATA_ENDS  

;保护模式代码段  

VxD_CODE_SEG  

;系统控制过程  

BeginProc VxD_Control  
Control_Dispatch SYS_DYNAMIC_DEVICE_INIT,VxD_Device_Init  
Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT,VxD_Device_Exit  
Control_Dispatch W32_DEVICEIOCONTROL,VxD_IOCTL  
clc  
ret  
EndProc VxD_Control  

;IOCTL 控制(设备I/O控制)过程  

BeginProc VxD_IOCTL  
;获取DeviceIoControl控制代码  
mov ecx,[esi.dwIoControlCode]  
cmp ecx,1  
jz Install_File_System_Api_Hook  
cmp ecx,2  
jz Uninstall_File_System_Api_Hook  
jmp VxD_IOCTL_Exit  

;安装文件系统API 钩子  

Install_File_System_Api_Hook:  
mov eax,OFFSET32 File_System_Api_Hook  
VxDCall IFSMgr_InstallFileSystemApiHook  
or eax,eax  
jz Error_Handler  
;保存上一个文件系统API 钩子地址  
mov Prev_File_System_Api_Hook,eax  
jmp VxD_IOCTL_Exit  

;移去文件系统API 钩子  

Uninstall_File_System_Api_Hook:  
mov eax,OFFSET32 File_System_Api_Hook  
VxDCall IFSMgr_RemoveFileSystemApiHook  
cmp eax,0FFFFFFFFH  
jz Error_Handler  
jmp VxD_IOCTL_Exit  

;IOCTL 控制过程结束  

VxD_IOCTL_Exit:  
xor eax,eax  
clc  
ret  

;错误处理  

Error_Handler:  
mov eax,0FFFFFFFFH  
stc  
ret  
EndProc VxD_IOCTL  

;VxD_Device_Exit过程  

BeginProc VxD_Device_Exit  
clc  
ret  
EndProc VxD_Device_Exit  

;文件系统API 钩子过程(C语言调用方式)  

BeginProc File_System_Api_Hook,CCALL  
ArgVar FSDFnAddr,DWORD  
ArgVar FunctionNum,DWORD  
ArgVar Drive,DWORD  
ArgVar ResourceFlags,DWORD  
ArgVar CodePage,DWORD  
ArgVar pir,DWORD  
EnterProc  
pushad  
;防止重入  
cmp byte ptr In_File_System_Api_Hook,00h  
jnz Prev_Hook  
;比较是打开文件操作吗?  
cmp dword ptr FunctionNum,IFSFN_OPEN  
jnz Prev_Hook  
;设置重入标志  
inc byte ptr In_File_System_Api_Hook  
;取当前VM句柄  
VMMCall Get_Cur_VM_Handle  
;显示消息框  
mov eax,MB_ICONASTERISK+MB_OK  
mov ecx,OFFSET32 Message1  
mov edi,OFFSET32 Caption1  
mov esi,0  
mov edx,0  
VxDCall Shell_Message  
;取消重入标志  
dec byte ptr In_File_System_Api_Hook  

;转到上一个文件系统API 钩子地址  

Prev_Hook:  
popad  
LeaveProc  
mov eax,Prev_File_System_Api_Hook  
jmp [eax]  
Return  
EndProc File_System_Api_Hook  

VxD_CODE_ENDS  

;保护模式初始化代码段  

VxD_ICODE_SEG  

;VxD_Device_Init过程  

BeginProc VxD_Device_Init  
clc  
ret  
EndProc VxD_Device_Init  
VxD_ICODE_ENDS  
end  

该VxD在设备控制过程(VxD_Control过程)中处理了3个系统控制消息,  
分别是SYS_DYNAMIC_DEVICE_INIT(动态VxD初始化)、  
SYS_DYNAMIC_DEVICE_EXIT(动态VxD退出)和W32_DEVICEIOCONTROL(设  
备I/O控制),对应的消息处理过程分别是VxD_Device_Init、  
VxD_Device_Exit和VxD_IOCTL。其中VxD_Device_Init过程和  
VxD_Device_Exit过程只清除进位标志返回(表示成功),VxD_IOCTL过程  
是Windows 95/98应用程序与VxD通信的接口,完成文件系统API钩子  
的安装和移去工作,[esi.dwIOControlCode]中是设备I/O控制代码,该  
控制代码为1时安装文件系统API钩子,为2时移去文件系统API钩子。  
File_System_Api_Hook是文件系统API钩子过程,这里作为一个简单的实  
例,钩子过程判断是否是打开文件操作,如果是则显示一个简单的消息框,  
然后跳转到上一个文件钩子(相当于旧的文件系统API入口)。如果需要  
扩充功能,可以在该过程中增加代码。  
朋友你好
游客

返回顶部