VxD编程入门教程.docx
- 文档编号:11334533
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:16
- 大小:20.38KB
VxD编程入门教程.docx
《VxD编程入门教程.docx》由会员分享,可在线阅读,更多相关《VxD编程入门教程.docx(16页珍藏版)》请在冰点文库上搜索。
VxD编程入门教程
VxD编程入门教程
--------------------------------------------------------------------------------
一、Windows95DDK的安装
安装Windows95DDK一般需要先安装Win32SDK,原因是Windows95DDK需要Win32SDK的16位资源编译器,但是Win32SDK很大(一整张光盘的容量),而且国内难以买到,ftp站上也较少见,即使有,下载也很困难。
笔者经过一段时间的摸索,找到了安装Windows95DDK的几种简单方法,现将方法介绍如下:
方法之一:
使用第三方资源编译器
1、修改注册表,仿真Win32SDK已经安装的情况。
建立一个名为WIN32SDK.REG的注册表文件,内容为:
REGEDIT4
[HKEY_USERS\.Default\Software\Microsoft\Win32SDK]
[HKEY_USERS\.Default\Software\Microsoft\Win32SDK\Directories]
"InstallDir"="C:
\\MSTOOLS"
在资源管理器中双击此文件,将此文件中的内容添加到注册表。
就可以安装Windows95DDK了。
2、运行Windows95DDK中的SETUP.EXE文件,安装Windows95DDK到C:
\DDK。
3、安装MASM6.11到C:
\MASM611,安装完成后将未安装的Windows95DDK中的MASM611C目录下的文件覆盖到C:
\MASM611\BIN。
4、安装VisualC++5.0(4.0也可以,但不宜使用6.0)到C:
\ProgramFiles\DevStudio\VC。
5、建立C:
\MSTOOLS\BINW16目录,拷贝资源编译器。
Windows95DDK需要一个能将Win32资源源文件编译成16位资源的资源编译器。
如果有Win32SDK,可以将BINW16目录下的文件直接拷贝到C:
\MSTOOLS\BINW16,如果没有Win32SDK,则可以使用第三方的资源编译
器,这里以使用Borland的资源编译器为例:
准备TurboMASM5.0一套,用UNPAK工具解压缩CMDLINE.PAK文件,找到下面三个文件:
BRC.EXE
BRCC32.EXE
RW32CORE.DLL
将这三个文件拷贝到C:
\MSTOOLS\BINW16,并将BRC.EXE改名为RC.EXE即可。
6、修改CONFIG.SYS增大环境变量空间。
在CONFIG.SYS文件最后加入一行:
SHELL=C:
\WINDOWS\COMMAND.COM/E:
8192/P
7、进入Windows95MS-DOS方式,初始化编译环境(最好建立一个批处理文件):
C:
\MASM611\BINR\NEW-VARS.BAT
C:
\DDK\DDKINIT.BAT32BASE
(编译的设备驱动程序不同,参数也不同)
C:
\ProgramFiles\DevStudio\VC\bin\VCVARS32.BAT
就可以使用Windows95DDK了,连接时出现的警告可以不理会。
方法之二:
使用Windows98DDK完整版的Windows98DDK(约30M)包括Windows95DDK、全套SDK编译器和MASM6.11C汇编器,安装方法非常简单:
安装Windows98DDK和VisualC++5.0,然后直接运行“CheckBuildEnvironment”(编译带调试信息的设备驱动程序)或者“FreeBuildEnvironment”(编译正式发布版本的设备驱动程序)程序项即可。
二、一个拦截Windows95/98文件操作的VxD
VxD——虚拟设备驱动程序,顾名思义,VxD是用来控制硬件设备的,那么这里为什么要讲一个拦截Windows95/98文件操作的VxD呢?
其实,VxD不仅仅可以用来控制硬件设备,因为VxD工作在80386保护模式Ring0特权级(最高特权级)上,而一般的应用程序工作在Ring3特权级(最低特权级)上,所以VxD可以完成许多API不能完成的功能,例如端口读写、物理内存读写、中断调用、API拦截等。
正因为如此,VxD在Windows系统编程中有广泛用途,其实大家一般都是碰到WindowsAPI不能解决或者难以解决的问题才考虑编写VxD解决问题。
这里介绍的拦截Windows95/98文件操作的VxD可以用来拦截Windows95/98(WindowsNT不支持VxD)的所有文件操作,那么这个VxD有什么用途呢?
最大的用途可能是——病毒防火墙,用来对文件操作进行过滤,可以进行动态病毒检测和动态杀毒。
这个VxD使用的原理和目前流行的CIH病毒传染的原理是基本相同的。
(其实大家如果要问我为什么要写这么一个VxD,那是因为——我是Virus版的版主啦)
该VxD的文件名是FILEHOOK.VXD,源程序(FILEHOOK.ASM)如下:
;FILEHOOK.VXD--拦截Windows95/98文件操作的VxD
.386p
.XLIST
INCLUDEVMM.Inc
INCLUDEVWin32.Inc
INCLUDEShell.Inc
MASM=1
INCLUDEIFS.Inc
INCLUDEIFSMgr.Inc
.LIST
;VxD声明
Declare_Virtual_Device
FILEHOOK,1,0,VxD_Control,Undefined_Device_ID,,,
;保护模式数据段
VxD_DATA_SEG
Prev_File_System_Api_Hookdd0
In_File_System_Api_Hookdb0
Message1db'Openfile!
',0
Caption1db'FILEHOOK',0
VxD_DATA_ENDS
;保护模式代码段
VxD_CODE_SEG
;系统控制过程
BeginProcVxD_Control
Control_DispatchSYS_DYNAMIC_DEVICE_INIT,VxD_Device_Init
Control_DispatchSYS_DYNAMIC_DEVICE_EXIT,VxD_Device_Exit
Control_DispatchW32_DEVICEIOCONTROL,VxD_IOCTL
clc
ret
EndProcVxD_Control
;IOCTL控制(设备I/O控制)过程
BeginProcVxD_IOCTL
;获取DeviceIoControl控制代码
movecx,[esi.dwIoControlCode]
cmpecx,1
jzInstall_File_System_Api_Hook
cmpecx,2
jzUninstall_File_System_Api_Hook
jmpVxD_IOCTL_Exit
;安装文件系统API钩子
Install_File_System_Api_Hook:
moveax,OFFSET32File_System_Api_Hook
VxDCallIFSMgr_InstallFileSystemApiHook
oreax,eax
jzError_Handler
;保存上一个文件系统API钩子地址
movPrev_File_System_Api_Hook,eax
jmpVxD_IOCTL_Exit
;移去文件系统API钩子
Uninstall_File_System_Api_Hook:
moveax,OFFSET32File_System_Api_Hook
VxDCallIFSMgr_RemoveFileSystemApiHook
cmpeax,0FFFFFFFFH
jzError_Handler
jmpVxD_IOCTL_Exit
;IOCTL控制过程结束
VxD_IOCTL_Exit:
xoreax,eax
clc
ret
;错误处理
Error_Handler:
moveax,0FFFFFFFFH
stc
ret
EndProcVxD_IOCTL
;VxD_Device_Exit过程
BeginProcVxD_Device_Exit
clc
ret
EndProcVxD_Device_Exit
;文件系统API钩子过程(C语言调用方式)
BeginProcFile_System_Api_Hook,CCALL
ArgVarFSDFnAddr,DWORD
ArgVarFunctionNum,DWORD
ArgVarDrive,DWORD
ArgVarResourceFlags,DWORD
ArgVarCodePage,DWORD
ArgVarpir,DWORD
EnterProc
pushad
;防止重入
cmpbyteptrIn_File_System_Api_Hook,00h
jnzPrev_Hook
;比较是打开文件操作吗?
cmpdwordptrFunctionNum,IFSFN_OPEN
jnzPrev_Hook
;设置重入标志
incbyteptrIn_File_System_Api_Hook
;取当前VM句柄
VMMCallGet_Cur_VM_Handle
;显示消息框
moveax,MB_ICONASTERISK+MB_OK
movecx,OFFSET32Message1
movedi,OFFSET32Caption1
movesi,0
movedx,0
VxDCallShell_Message
;取消重入标志
decbyteptrIn_File_System_Api_Hook
;转到上一个文件系统API钩子地址
Prev_Hook:
popad
LeaveProc
moveax,Prev_File_System_Api_Hook
jmp[eax]
Return
EndProcFile_System_Api_Hook
VxD_CODE_ENDS
;保护模式初始化代码段
VxD_ICODE_SEG
;VxD_Device_Init过程
BeginProcVxD_Device_Init
clc
ret
EndProcVxD_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过程是Windows95/98应用程序与VxD通信的接口,完成文件系统API钩子的安装和移去工作,[esi.dwIOControlCode]中是设备I/O控制代码,该控制代码为1时安装文件系统API钩子,为2时移去文件系统API钩子。
File_System_Api_Hook是文件系统API钩子过程,这里作为一个简单的实例,钩子过程判断是否是打开文件操作,如果是则显示一个简单的消息框,然后跳转到上一个文件钩子(相当于旧的文件系统API入口)。
如果需要扩充功能,可以在该过程中增加代码。
汇编连接VxD需要一个模块定义文件和一个NMAKE文件(手工汇编连接当然也可以)。
这两个文件都可以直接用DDK中的GENERIC实例中的模块定义文件和NMAKE文件修改而成,模块定义文件(FILEHOOK.DEF)如下:
VXDFILEHOOKDYNAMIC
DESCRIPTION'FileSystemAPIHookProgram'
SEGMENTS
_LPTEXTCLASS'LCODE'PRELOADNONDISCARDABLE
_LTEXTCLASS'LCODE'PRELOADNONDISCARDABLE
_LDATACLASS'LCODE'PRELOADNONDISCARDABLE
_TEXTCLASS'LCODE'PRELOADNONDISCARDABLE
_DATACLASS'LCODE'PRELOADNONDISCARDABLE
CONSTCLASS'LCODE'PRELOADNONDISCARDABLE
_TLSCLASS'LCODE'PRELOADNONDISCARDABLE
_BSSCLASS'LCODE'PRELOADNONDISCARDABLE
_LMSGTABLECLASS'MCODE'PRELOADNONDISCARDABLEIOPL
_LMSGDATACLASS'MCODE'PRELOADNONDISCARDABLEIOPL
_IMSGTABLECLASS'MCODE'PRELOADDISCARDABLEIOPL
_IMSGDATACLASS'MCODE'PRELOADDISCARDABLEIOPL
_ITEXTCLASS'ICODE'DISCARDABLE
_IDATACLASS'ICODE'DISCARDABLE
_PTEXTCLASS'PCODE'NONDISCARDABLE
_PMSGTABLECLASS'MCODE'NONDISCARDABLEIOPL
_PMSGDATACLASS'MCODE'NONDISCARDABLEIOPL
_PDATACLASS'PDATA'NONDISCARDABLESHARED
_STEXTCLASS'SCODE'RESIDENT
_SDATACLASS'SCODE'RESIDENT
_DBOSTARTCLASS'DBOCODE'PRELOADNONDISCARDABLECONFORMING
_DBOCODECLASS'DBOCODE'PRELOADNONDISCARDABLECONFORMING
_DBODATACLASS'DBOCODE'PRELOADNONDISCARDABLECONFORMING
_16ICODECLASS'16ICODE'PRELOADDISCARDABLE
_RCODECLASS'RCODE'
EXPORTS
FILEHOOK_DDB@1
NMAKE文件(MAKEFILE)如下:
!
ifdefMASTER_MAKE
BUILD_BITS=32
BUILD_TYPE=base
!
INCLUDE$(DDKROOT)\master.mk
!
endif
NAME=filehook
#supplythelocationofa16-bitlinker
LINK=
#Definitionsforthedebuglevel
!
ifdefDEBUG
DDEBUG=-DDEBLEVEL=1-DDEBUG
!
else
DDEBUG=-DDEBLEVEL=0
!
endif
#DefinitionsforMASM6Assembler
ASM=ml
AFLAGS=-coff-DBLD_COFF-DIS_32-W2-c-Cx-Zm-DMASM6$(DDEBUG)
ASMENV=ML
LFLAGS=/VXD/NOD
#MASM6onlyinferencerules
.asm.obj:
set$(ASMENV)=$(AFLAGS)
$(ASM)-Fo$*.obj$<
all:
$(NAME).VXD
OBJS=filehook.obj
filehook.obj:
filehook.asm
$(NAME).vxd:
$(NAME).def$(OBJS)
link@<<$(NAME).lnk
$(LFLAGS)
/OUT:
$(NAME).vxd
/MAP:
$(NAME).map
/DEF:
$(NAME).def
$(OBJS)
<<
mapsym-s-o$(NAME).sym$(NAME).map
clean:
-@del*.obj
-@del*.vxd
-@del*.exp
-@del*.lib
-@del*.map
-@del*.sym
有了这两个文件,运行NMAKE即可汇编连接VxD。
三、Windows95/98应用程序与VxD的通信
Windows95/98应用程序与VxD的通信一般使用DeviceIoControl函数,
这里给出一个实例源程序(FHTEST.C)如下:
//拦截Windows95/98文件操作测试程序
#include
#include"tchar.h"
#defineINSTALL_FILE_SYSTEM_API_HOOK1
#defineUNINSTALL_FILE_SYSTEM_API_HOOK2
staticTCHARszAppName[]=_T("FHTEST");
staticTCHARszAppTitle[]=_T("拦截Windows95/98文件操作测试程序");
staticHANDLEhDevice;
LRESULTCALLBACKWndProc(HWNDhWnd,UINTMessage,WPARAM
wParam,LPARAMlParam);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCE
hPrevInstance,LPSTRlpCmdLine,intnCmdShow)
{
HWNDhWnd;
WNDCLASSEXwcex;
MSGMsg;
//本程序不能在WindowsNT中运行
if(GetVersion()<0x80000000)
{
MessageBox(NULL,_T("本程序不能在WindowsNT中运行!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
returnFALSE;
}
if(!
hPrevInstance)
{
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=szAppName;
wcex.hIconSm=LoadIcon(hInstance,IDI_APPLICATION);
if(!
RegisterClassEx(&wcex))returnFALSE;
}
hWnd=CreateWindow(szAppName,szAppTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
0,0,hInstance,NULL);
if(!
hWnd)returnFALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&Msg,0,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
returnMsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhWnd,UINTMessage,WPARAMwParam,LPARAMlParam)
{
HDChDC;
PAINTSTRUCTps;
DWORDcb;
BOOLbResult;
switch(Message)
{
caseWM_CREATE:
hDevice=CreateFile("\\\\.\\FILEHOOK.VXD",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
if(hDevice!
=INVALID_HANDLE_VALUE)
{
bResult=DeviceIoControl(hDevice,INSTALL_FILE_SYSTEM_API_HOOK,NULL,0,NULL,0,&cb,0);
if(bResult)MessageBox(hWnd,_T("文件系统API钩子安装成功!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
elseMessageBox(hWnd,_T("不能安装文件系统API钩子!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
}
else
{
MessageBox(hWnd,_T("不能打开FILEHOOK.VXD!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
}
break;
caseWM_PAINT:
hDC=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
if(hDevice!
=INVALID_HANDLE_VALUE)
{
bResult=DeviceIoControl(hDevice,UNINSTALL_FILE_SYSTEM_API_HOOK,NULL,0,NULL,0,&cb,0);
if(bResult)MessageBox(hWnd,_T("文件系统API钩子移去
成功!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
elseMessageBox(hWnd,_T("不能移去文件系统API钩子!
"),szAppTitle,MB_ICONINFORMATION|MB_OK);
CloseHandle(hDevice);
}
else
{
MessageBox(hWnd,_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VxD 编程 入门教程