.data AppName db "DeviceIoControl",0 VxDName db "\\.\shellmsg.vxd",0 Success db "The VxD is successfully loaded!",0 Failure db "The VxD is not loaded!",0 Unload db "The VxD is now unloaded!",0 MsgTitle db "DeviceIoControl Example",0 MsgText db "I'm called from a VxD!",0 InBuffer dd offset MsgTitle dd offset MsgText .data? hVxD dd ? .code start: invoke CreateFile,addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 .if eax!=INVALID_HANDLE_VALUE mov hVxD,eax invoke MessageBox,NULL,addr Success,addr AppName,MB_OK+MB_ICONINFORMATION invoke DeviceIoControl,hVxD,1,addr InBuffer,8,NULL,NULL,NULL,NULL invoke CloseHandle,hVxD invoke MessageBox,NULL,addr Unload,addr AppName,MB_OK+MB_ICONINFORMATION .else invoke MessageBox,NULL,addr Failure,NULL,MB_OK+MB_ICONERROR .endif invoke ExitProcess,NULL end start
下面这段源代码是由 vxdloader.asm 调用的动态VxD。 ; ShellMsg.asm
.386p include vmm.inc include vwin32.inc include shell.inc
DECLARE_VIRTUAL_DEVICE SHELLMSG,1,0, SHELLMSG_Control,\ UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
Begin_control_dispatch SHELLMSG Control_Dispatch w32_DeviceIoControl, OnDeviceIoControl End_control_dispatch SHELLMSG
VxD_PAGEABLE_DATA_SEG pTitle dd ? pMessage dd ? VxD_PAGEABLE_DATA_ENDS
VxD_PAGEABLE_CODE_SEG BeginProc OnDeviceIoControl assume esi:ptr DIOCParams .if [esi].dwIoControlCode==DIOC_Open xor eax,eax .elseif [esi].dwIoControlCode==1 mov edi,[esi].lpvInBuffer ;----------------------------------- ; copy the message title to buffer ;----------------------------------- VMMCall _lstrlen, <[edi]> inc eax push eax VMMCall _HeapAllocate,<eax,HEAPZEROINIT> mov pTitle,eax pop eax VMMCall _lstrcpyn,<pTitle,[edi],eax> ;----------------------------------- ; copy the message text to buffer ;----------------------------------- VMMCall _lstrlen, <[edi+4]> inc eax push eax VMMCall _HeapAllocate,<eax,HEAPZEROINIT> mov pMessage,eax pop eax VMMCall _lstrcpyn,<pMessage,[edi+4],eax> mov edi,pTitle mov ecx,pMessage mov eax,MB_OK VMMCall Get_Sys_VM_Handle VxDCall SHELL_sysmodal_Message VMMCall _HeapFree,pTitle,0 VMMCall _HeapFree,pMessage,0 xor eax,eax .endif ret EndProc OnDeviceIoControl VxD_PAGEABLE_CODE_ENDS
end
分析: 我们从VxDLoader.asm开始。
(编辑:anna sui)
|