Уроки Iczelion'а

       

Анализ:


Begin_control_dispatch MESSAGE Control_Dispatch Create_VM, OnVMCreate Control_Dispatch VM_Terminate2, OnVMClose End_control_dispatch MESSAGE

VxD обрабатывает два контрольных сообщения, CreateVM и VM_Terminate2. После получения сообщения Create_VM, он вызывает процедуру OnVMCreate. А когда он получает сообщение VM_Terminate2, вызывается процедура OnVMC.

VxD_PAGEABLE_DATA_SEG

MsgTitle db "VxD MessageBox",0 VMCreated db "A VM is created",0 VMDestroyed db "A VM is destroyed",0

VxD_PAGEABLE_DATA_ENDS

Мы помещаем данные в выгружаемый сегмент.

BeginProcOnVMCreate mov ecx, OFFSET32VMCreated CommonCode: VMMCall Get_sys_vm_handle mov eax,MB_OK+MB_ICONEXCLAMATION mov edi, OFFSET32 MsgTitle xor esi,esi xor edx,edx VxDCall SHELL_Message ret EndProcOnVMCreate

Процедура OnVMCreate создается с помощью макросов BeginProc и EndProc. Она помещает параметры для сервиса SHELL_Message в регистры. Так как мы хотим отображать message box в системной VM, мы не можем использовать значения в ebx (которое является хэндлом созданной VM). Вместо этого мы используем VMM-сервис Get_Sys_VM_Handle, чтобы получить хэндл системной виртуальной машины. Этот сервис возвращает хэндл VM в ebx. Мы помещаем адрес сообщения и заголовка в ecx и edi. Hам не нужно знать ответ пользователя, поэтому мы обнуляем esi и edx. Когда все параметры находятся в соответствующих регистрах, мы вызываем SHELL_Message, чтобы отобразить message box.

BeginProcOnVMClose mov ecx,OFFSET32 VMDestroyed jmp CommonCode EndProcOnVMClose

Процедура OnVMClose достаточно проста. Так как она использует идентичный с OnVMCreate код, она инициализирует ecx адресом другого сообщения, а затем переходит к коду внутри OnVMCreate.



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