Ассемблер для Windows

Программа загружающая использующая и выгружающая динамический драйвер



Рисунок 4.7.4. Программа, загружающая, использующая и выгружающая динамический драйвер.

Прокомментируем программу на Рисунок 4.7.4. Главное здесь - разобрать работу функции DeviceIoControl. Вот параметры этой функции:

  • 1-й параметр, дескриптор драйвера, полученный через функцию CreateFile.
  • 2-й параметр, номер необходимой Вам операции.
  • 3-й параметр, адрес данных для драйвера.
  • 4-й параметр, длина данных.
  • 5-й параметр, буфер, куда драйвер поместит свои данные.
  • 6-й параметр, длина буфера.
  • 7-й параметр, адрес переменной, куда будет занесено количество байтов, помещенных в буфер драйвером.
  • 8-й параметр, адрес OVERLAPPED-структуры.
  • Как видите, при вызове мы передаем указатель на строку MES1.

    Теперь, я думаю. Вы легко сможете разобраться в программе загрузки. Переходим к самому драйверу. Драйвер выполняет весьма простую функцию. При вызове его сервиса он выводит на экран сообщение. Причем текст сообщения передается вызывающей программой. При вызове функции DeviceIoControl с дескриптором драйвера, на драйвер приходит сообщение w32_deviceIoControl. При этом регистр EBX содержит дескриптор виртуальной машины, ESI указывает на структуру, содержимое которой мы сейчас разберем. При этом надо иметь в виду, что при загрузке драйвера на него тоже приходит это же сообщение, и мы его должны также обработать. Разберем теперь структуру, на которую указывает регистр ESI.

    DIOCParams STRUC Internal1 DD ? VMHandle DD ? Internal2 DD ? dwIoControlCode DD ? lpvInBuffer DD ? cbInBuffer DD ? lpvOutBuffer DD ? cbOutBuffer DD ? lpcbBytesReturned DD ? lpoOverlapped DD ? hDevice DD ? tagProcess DD ? DIOCParams ENDS

    Опишем поле структуры:

    Internal1 - указатель на структуру Client_Reg_Struc, определяющую регистры вызывающего приложения (см. Рисунок 4.7.6. и пояснения к нему).

    VMHandle - дескриптор виртуальной машины.

    Internal2 - указатель на блок DDB.

    dwIoControlCode - номер необходимой операции.

    lpvInBuffer - указатель на буфер, содержащий информацию вызывающей программы.

    cbInBuffer - количество байт, пересылаемых в буфере.






    lpvOutBuffer - указатель на буфер, в который драйвер может поместить информацию для вызывающей программы.

    cbOutBuffer - количество байт в буфере.

    lpcbBytesReturned - количество возвращаемых байт.

    lpoOverlapped - указатель на OverLapped-структуру.

    hDevice - дескриптор драйвера, возвращаемый функцией CreateFile.

    tagProcess - признак процесса.

    .386P include vmm.inc include vcond.inc include vwin32.inc include shell.inc

    DECLARE_VIRTUAL_DEVICE MSG,1,0, MSG_Control,\ UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER

    Begin_control_dispatch MSG ; будем обрабатывать сообщение w32_Device!oControl ; процедурой PROC1 Control_Dispatch w32_DeviceIoControl, PROC1 End_control_dispatch MSG

    ; сегмент данных VxD_PAGEABLE_DATA_SEG CAP1 DB "Окно сообщения",0 MES1 DB 50 DUP (0) VxD_PAGEABLE_DATA_ENDS

    ; сегмент кода VxD_PAGEABLE_CODE_SEG BeginProc PROC1 CMP DWORD PTR [ESI]+12,DIOC_Open JNE L1 XOR EAX,EAX JMP _EXIT L1: CMP DWORD PTR [ESI]+12,3 JNZ _EXIT ; длина строки MOV EDI,DWORD PTR [ESI]+16 VMMCall _lstrlen, <EDI> ; копировать в буфер INC EAX ; длина VMMCall _lstrcpyn,<OFFSET MES1,EDI,EAX> ; вызвать функцию SHELL_Message MOV ECX,OFFSET MES1 ; DWORD PTR [ESI]+14 MOV EDI,OFFSET CAP1 MOV EAX,MB_OK + MB_ICONEXCLAMATION VMMCall Get_Sys_VM_Handle ; адрес CaliBack функции, в данном случае NULL XOR ESI,ESI ; ссылка на данные для CallBack-функции XOR EDX,EDX VxDCall SHELL_Message XOR EAX,EAX _EXIT: RET EndProc PROC1 VxD_PAGEABLE_CODE_ENDS

    end


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