阅读:983回复:2
请教在VXD中如何拦截文件IO?
使用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? |
|
|
沙发#
发布于: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入口)。如果需要 扩充功能,可以在该过程中增加代码。 |
|
|
板凳#
发布于:2002-07-30 09:25
我知道CIH中用的是call
|
|