Уроки Iczelion'а

       

Анализ:


Мы начнем с VxDLoader.asm.

invoke CreateFile,addr VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 .if eax!=INVALID_HANDLE_VALUE mov hVxD,eax

.... .else invoke MessageBox,NULL,addr Failure,NULL,MB_OK+MB_ICONERROR .endif

Мы вызывает CreateFile, чтобы загрузить динамический VxD. Обратите внимание на флаг FILE_FLAG_DELETE_ON_CLOSE. Этот флаг указывает Windows выгрузить VxD, когда VxD-хэндл, возвращенный CreateFile, будет закрыт. Если вызов CreateFile прошел успешно, мы сохраняем хэндл VxD для будущего использования.

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

Программа отображает окошко с соообщением, когда VxD загружается/выгружается. Она вызывает DeviceIoControl с dwIoControlCode равным 1 и передает адрес InBuffer в параметре lрInBuffer, а размер InBuffer (8) в nInBufferSize. InBuffer - это массив из двух dword-элементов: каждый элемент содержит текстовую строку.

MsgTitle db "DeviceIoControl Example",0 MsgText db "I'm called from a VxD!",0 InBuffer dd offset MsgTitle dd offset MsgText

Теперь мы переводим наше внимание на VxD. Он обрабатывает только сообщение w32_deviceIoControl. Когда он получает это сообщение, вызывается процедура OnDeviceControl.

BeginProc OnDeviceIoControl assume esi:ptr DIOCParams

.if [esi].dwIoControlCode==DIOC_Open xor eax,eax

OnDeviceIoControl обрабатывает код DIOC_Oрen, возвращая в eax 0.

.elseif [esi].dwIoControlCode==1 mov edi,[esi].lpvInBuffer

Она также обрабатывает контрольный код 1. Вначале она извлекает данные из lрInBuffer, который состоит из двух двойных слов. Для извлечения она помещает адрес массива в edi. Первый dword - это адрес текста, который будет использован для заголовка окна сообщения. Второй dword - это адрес текста сообщения.

;----------------------------------- ; copy the message title to buffer ;----------------------------------- VMMCall _lstrlen, <[edi]> inc eax



Содержание раздела