一、Windows?95?DDK的安裝?
?
安裝Windows?95?DDK一般需要先安裝Win32?SDK,原因是Windows?95?DDK?
需要Win32?SDK的16位資源編譯器,但是Win32?SDK很大(一整張光盤?
的容量),而且國內難以買到,ftp站上也較少見,即使有,下載也很困難。?
筆者經過一段時間的摸索,找到了安裝Windows?95?DDK的幾種簡單方法,?
現將方法介紹如下:?
方法之一:使用第三方資源編譯器?
1、修改注冊表,仿真Win32?SDK已經安裝的情況。?
建立一個名為WIN32SDK.REG的注冊表文件,內容為:?
?
REGEDIT4?
?
[HKEY_USERS\.Default\Software\Microsoft\Win32SDK]?
?
[HKEY_USERS\.Default\Software\Microsoft\Win32SDK\Directories]?
"Install?Dir"="C:\\MSTOOLS"?
?
在資源管理器中雙擊此文件,將此文件中的內容添加到注冊表。就可以安?
裝Windows?95?DDK了。?
2、運行Windows?95?DDK中的SETUP.EXE文件,安裝Windows?95?DDK到?
C:\DDK。?
3、安裝MASM?6.11到C:\MASM611,安裝完成后將未安裝的Windows?95?DDK?
中的MASM611C目錄下的文件覆蓋到C:\MASM611\BIN。?
4、安裝Visual?C++?5.0(4.0也可以,但不宜使用6.0)到C:\Program?
Files\DevStudio\VC。?
5、建立C:\MSTOOLS\BINW16目錄,拷貝資源編譯器。?
Windows?95?DDK需要一個能將Win32資源源文件編譯成16位資源的資源?
編譯器。如果有Win32?SDK,可以將BINW16目錄下的文件直接拷貝到?
C:\MSTOOLS\BINW16,如果沒有Win32?SDK,則可以使用第三方的資源編譯?
器,這里以使用Borland的資源編譯器為例:?
準備Turbo?MASM?5.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、進入Windows?95?MS-DOS方式,初始化編譯環境(最好建立一個批處?
理文件):?
?
C:\MASM611\BINR\NEW-VARS.BAT?
C:\DDK\DDKINIT.BAT?32?BASE?
(編譯的設備驅動程序不同,參數也不同)?
C:\Program?Files\DevStudio\VC\bin\VCVARS32.BAT?
?
就可以使用Windows?95?DDK了,連接時出現的警告可以不理會。?
方法之二:使用Windows?98?DDK?
完整版的Windows?98?DDK(約30M)包括Windows?95?DDK、全套SDK編譯?
器和MASM?6.11C匯編器,安裝方法非常簡單:安裝Windows?98?DDK和Visual?
C++?5.0,然后直接運行“Check?Build?Environment”(編譯帶調試信息?
的設備驅動程序)或者“Free?Build?Environment”(編譯正式發布版本?
的設備驅動程序)程序項即可。?
?
二、一個攔截Windows?95/98文件操作的VxD?
?
VxD——虛擬設備驅動程序,顧名思義,VxD是用來控制硬件設備的,那么?
這里為什么要講一個攔截Windows?95/98文件操作的VxD呢?其實,VxD?
不僅僅可以用來控制硬件設備,因為VxD工作在80386保護模式Ring?0?
特權級(最高特權級)上,而一般的應用程序工作在Ring?3特權級(最?
低特權級)上,所以VxD可以完成許多API不能完成的功能,例如端口讀?
寫、物理內存讀寫、中斷調用、API攔截等。正因為如此,VxD在Windows?
系統編程中有廣泛用途,其實大家一般都是碰到Windows?API不能解決或?
者難以解決的問題才考慮編寫VxD解決問題。?
這里介紹的攔截Windows?95/98文件操作的VxD可以用來攔截Windows?95?
/98(Windows?NT不支持VxD)的所有文件操作,那么這個VxD有什么用?
途呢?最大的用途可能是——病毒防火墻,用來對文件操作進行過濾,可?
以進行動態病毒檢測和動態殺毒。這個VxD使用的原理和目前流行的CIH?
病毒傳染的原理是基本相同的。?
(其實大家如果要問我為什么要寫這么一個VxD,那是因為——我是Virus?
版的版主啦)?
該VxD的文件名是FILEHOOK.VXD,源程序(FILEHOOK.ASM)如下:?
?
;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入口)。如果需要?
擴充功能,可以在該過程中增加代碼。?
匯編連接VxD需要一個模塊定義文件和一個NMAKE文件(手工匯編連接當?
然也可以)。這兩個文件都可以直接用DDK中的GENERIC實例中的模塊定?
義文件和NMAKE文件修改而成,模塊定義文件(FILEHOOK.DEF)如下:?
?
VXD?FILEHOOK?DYNAMIC?
?
DESCRIPTION?'File?System?API?Hook?Program'?
?
SEGMENTS?
????_LPTEXT?????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_LTEXT??????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_LDATA??????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_TEXT???????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_DATA???????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????CONST???????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_TLS????????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_BSS????????CLASS?'LCODE'???PRELOAD?NONDISCARDABLE?
????_LMSGTABLE??CLASS?'MCODE'???PRELOAD?NONDISCARDABLE?IOPL?
????_LMSGDATA???CLASS?'MCODE'???PRELOAD?NONDISCARDABLE?IOPL?
????_IMSGTABLE??CLASS?'MCODE'???PRELOAD?DISCARDABLE?IOPL?
????_IMSGDATA???CLASS?'MCODE'???PRELOAD?DISCARDABLE?IOPL?
????_ITEXT??????CLASS?'ICODE'???DISCARDABLE?
????_IDATA??????CLASS?'ICODE'???DISCARDABLE?
????_PTEXT??????CLASS?'PCODE'???NONDISCARDABLE?
????_PMSGTABLE??CLASS?'MCODE'???NONDISCARDABLE?IOPL?
????_PMSGDATA???CLASS?'MCODE'???NONDISCARDABLE?IOPL?
????_PDATA??????CLASS?'PDATA'???NONDISCARDABLE?SHARED?
????_STEXT??????CLASS?'SCODE'???RESIDENT?
????_SDATA??????CLASS?'SCODE'???RESIDENT?
????_DBOSTART???CLASS?'DBOCODE'?PRELOAD?NONDISCARDABLE?CONFORMING?
????_DBOCODE????CLASS?'DBOCODE'?PRELOAD?NONDISCARDABLE?CONFORMING?
????_DBODATA????CLASS?'DBOCODE'?PRELOAD?NONDISCARDABLE?CONFORMING?
????_16ICODE????CLASS?'16ICODE'?PRELOAD?DISCARDABLE?
????_RCODE??????CLASS?'RCODE'?
?
EXPORTS?
????????FILEHOOK_DDB?@1?
?
NMAKE文件(MAKEFILE)如下:?
?
!ifdef?MASTER_MAKE?
BUILD_BITS=32?
BUILD_TYPE=base?
!INCLUDE?$(DDKROOT)\master.mk?
!endif?
?
NAME?=?filehook?
?
#?supply?the?location?of?a?16-bit?linker?
?
LINK?=?
?
#???????Definitions?for?the?debug?level?
?
!ifdef?DEBUG?
DDEBUG??=-DDEBLEVEL=1?-DDEBUG?
!else?
DDEBUG??=-DDEBLEVEL=0?
!endif?
?
#???????Definitions?for?MASM?6?Assembler?
?
ASM????=?ml?
AFLAGS?=?-coff?-DBLD_COFF?-DIS_32?-W2?-c?-Cx?-Zm?-DMASM6?$(DDEBUG)?
ASMENV?=?ML?
LFLAGS?=?/VXD?/NOD?
?
#???????MASM?6?only?inference?rules?
?
.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。?
?
三、Windows?95/98應用程序與VxD的通信?
?
Windows?95/98應用程序與VxD的通信一般使用DeviceIoControl函數,?
這里給出一個實例源程序(FHTEST.C)如下:?
?
//攔截Windows?95/98文件操作測試程序?
?
#include?
#include?"tchar.h"?
?
#define?INSTALL_FILE_SYSTEM_API_HOOK?1?
#define?UNINSTALL_FILE_SYSTEM_API_HOOK?2?
?
static?TCHAR?szAppName[]=_T("FHTEST");?
static?TCHAR?szAppTitle[]=_T("攔截Windows?95/98文件操作測試程?
序");?
static?HANDLE?hDevice;?
?
LRESULT?CALLBACK?WndProc(HWND?hWnd,UINT?Message,WPARAM?
wParam,LPARAM?lParam);?
?
int?WINAPI?WinMain(HINSTANCE?hInstance,HINSTANCE?
hPrevInstance,LPSTR?lpCmdLine,int?nCmdShow)?
{?
?HWND?hWnd;?
?WNDCLASSEX?wcex;?
?MSG?Msg;?
?//本程序不能在Windows?NT中運行?
?if(GetVersion()<0x80000000)?
?{?
??MessageBox(NULL,_T("本程序不能在Windows?NT中運行!?
"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
??return?FALSE;?
?}?
?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))?return?FALSE;?
?}?
?hWnd=CreateWindow(szAppName,szAppTitle,WS_OVERLAPPEDWINDOW,?
?
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,?
???????0,0,hInstance,NULL);?
?if(!hWnd)?return?FALSE;?
?ShowWindow(hWnd,nCmdShow);?
?UpdateWindow(hWnd);?
?while(GetMessage(&Msg,0,0,0))?
?{?
??TranslateMessage(&Msg);?
??DispatchMessage(&Msg);?
?}?
?return?Msg.wParam;?
}?
?
LRESULT?CALLBACK?WndProc(HWND?hWnd,UINT?Message,WPARAM?
wParam,LPARAM?lParam)?
{?
?HDC?hDC;?
?PAINTSTRUCT?ps;?
?DWORD?cb;?
?BOOL?bResult;?
?switch(Message)?
?{?
?case?WM_CREATE:?
?
?hDevice=CreateFile("\\\\.\\FILEHOOK.VXD",0,0,NULL,0,FILE_FLA?
G_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);?
???else?MessageBox(hWnd,_T("不能安裝文件系統API?鉤子!?
"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
??}?
??else?
??{?
???MessageBox(hWnd,_T("不能打開FILEHOOK.VXD!?
"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
??}?
??break;?
?case?WM_PAINT:?
??hDC=BeginPaint(hWnd,&ps);?
??EndPaint(hWnd,&ps);?
??break;?
?case?WM_DESTROY:?
??if(hDevice!=INVALID_HANDLE_VALUE)?
??{?
?
?bResult=DeviceIoControl(hDevice,UNINSTALL_FILE_SYSTEM_API_HO?
OK,NULL,0,NULL,0,&cb,0);?
???if(bResult)?MessageBox(hWnd,_T("文件系統API?鉤子移去?
成功!"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
???else?MessageBox(hWnd,_T("不能移去文件系統API?鉤子!?
"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
???CloseHandle(hDevice);?
??}?
??else?
??{?
???MessageBox(hWnd,_T("不能打開FILEHOOK.VXD!?
"),szAppTitle,MB_ICONINFORMATION|MB_OK);?
??}?
??PostQuitMessage(0);?
??break;?
?default:?
??return?DefWindowProc(hWnd,Message,wParam,lParam);?
?}?
?return?0;?
}?
?
本程序使用CreateFile函數動態裝載VxD,然后用DeviceIoControl函數?
向VxD發送設備I/O控制代碼,安裝和移去文件系統API鉤子,最后用?
CloseHandle函數動態移去VxD。?
運行該程序時,如果文件系統API鉤子安裝成功,會顯示出“文件系統API?
鉤子安裝成功!”的消息框,然后只要進行打開文件操作,就會顯示出“Open?
File?!”的消息框。退出該程序時,如果文件API鉤子移去成功,會顯示?
出“文件API鉤子移去成功!”的消息框,以后進行打開文件操作時不再?
顯示消息框。?
?
四、小結?
?
上述實例演示了一個完整的攔截Windows?95/98文件系統API的VxD和?
Windows?95/98應用程序與該VxD通信的方法。該VxD可以作為一個基本?
框架,稍作修改即可用于病毒防火墻等軟件。其實VxD的功能遠不止這些,?
充分利用VxD的功能可以編寫出許多用API不能編寫出的高級應用程序。?
本教程只是一個簡單的VxD編程例子,因為筆者水平所限,加之時間較少,?
寫得較為簡單,還請大家見諒,同時也歡迎大家討論。本教程中使用的VMM?
功能、VxD功能和API函數請查閱相關手冊或者幫助。?
VXD編程入門教程
- VXD(10209)
相關推薦
FPGA入門教程
FPGA入門教程 FPGA 入門教程 1 .數字電路設計入門 2 .FPGA 簡介 3 .FPGA 開發流程 4 .RTL設計 5 .QuartusⅡ設計實例 6.ModelSim和Testbench
2012-08-11 11:40:44
Linux下C語言編程入門教程
u3000本文是Linux 下C 語言編程入門教程。主要介紹了Linux 的發展與特點、C語言的基礎知識、Linux 程序設計基礎知識及其下C 語言編程環境、Linux 程序設計的特點及其下C 語言
2023-09-22 06:56:10
proteus入門教程
proteus入門教程,新手實用?。?/div>
2013-07-29 15:31:08
誰有入門教程分享一下啊
求入門教程?。。?/div>
2018-10-26 08:42:03
VxD編程
VxD編程
一、VxD介紹 本文介紹VxD的作用。如果Windows 95提供的標準VxD對你的硬件或者 軟件不能提供100%的兼容支持,你需要為你的硬件或者軟件(包
2008-09-12 10:17:51
1742

單片機入門教程第25課-鍵盤接口與編程
單片機入門教程第25課-鍵盤接口與編程
鍵盤是由若干按鍵組成的開關矩陣,它是微型計算機最常用的輸入設備,用戶可以通過鍵盤向計算機輸入指
2010-01-07 15:19:21
746


單片機入門教程第23課-常用接口電路及其編程
單片機入門教程第23課-常用接口電路及其編程
LED數碼顯示器的連接與編程 在單片機系統中,通常用LED數碼顯示器來顯示各種數字或符
2010-01-07 15:37:25
1105


單片機入門教程第22課-串行口應用編程實例
單片機入門教程第22課-串行口應用編程實例
1. 串口方式0應用編程 8051單片機串行口方式0為移位寄存器方式,外接一個串入并出的移位寄存器,
2010-01-07 15:40:13
1223


PLC編程是什么?圖解PLC編程入門教程
本文開始介紹了PLC編程的概念和PLC編程的七大特點,其次闡述了PLC編程工作原理與PLC的五種標準編程語言,最后介紹了PLC編程入門教程。
2018-04-19 08:42:54
64219


Linux下C語言編程入門教程詳細說明
本文是Linux 下C 語言編程入門教程。主要介紹了Linux 的發展與特點、C語言的基礎知識、Linux 程序設計基礎知識及其下C 語言編程環境、Linux 程序設計的特點及其下C 語言編程風格等。
2020-08-25 18:05:00
39

單片機c語言編程入門教程
單片機c語言編程入門教程說難不難,說易不易,學習單片機c語言首先就要明白這兩樣東西是啥?單片機入門編程主要是學C語言,其次就是電路跟編程語言。
2021-07-29 10:39:16
17545

評論