Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Filter-hook Driver   Найти похожие ветки 

 
volser   (2005-01-03 18:43) [0]

У меня нет опита написания драйверов. Прочитав в ДДК о Filter-hook Driver я так и не понял как его делать. Там приводится пример:

#define PROT_TCP   6

// Drop all TCP packets

PF_FORWARD_ACTION
DropTcpPackets(
       unsigned char   *PacketHeader,
       unsigned char   *Packet,
       unsigned int    PacketLength,
       unsigned int    RecvInterfaceIndex,
       unsigned int    SendInterfaceIndex,
       IPAddr          RecvLinkNextHop,
       IPAddr          SendLinkNextHop
       )
{
   if (PacketHeader->iph_protocol == PROT_TCP)
   {
       return PF_DROP;
   }
   return PF_FORWARD;
}



Че с ним делать? Как его откомпилировать? И как его зарегистрировать?


 
Eraser ©   (2005-01-03 23:14) [1]

Если бы всё было так просто ))) Программирование драйверов это всё равно что программирование под другую ОС- другой API, другие функции, только язык программирования тот же ))
Покупай книгу по написанию драйверов, уже есть на русском!


 
volser   (2005-01-04 12:30) [2]

А есть ли что-то в електронном виде? Желательно на русском


 
Eraser ©   (2005-01-05 01:50) [3]

Очень мало...
Советую http://sysinternals.com/, хоть там и конкретной инфы не очень много, зато много прог, которые используют драйвер- чудеса техники )))


 
AlterEgo of WondeRu ©   (2005-01-05 16:38) [4]

у Подгорецкого на сайте видел программирование WDM-драйверов www.podgoretsky.com

это мой код, работает прилично, объяснять не буду:

.386
.model flat, stdcall
option casemap:none

include inc\ntstatus.inc
include inc\ntddk.inc
include inc\ntoskrnl.inc
include inc\pfhook.inc
include inc\Strings.mac
include inc\native.inc
include inc\wdm.inc

includelib lib\ntoskrnl.lib
includelib lib\ntdll.lib
includelib lib\wdm.lib

set_hook PROTO  :PacketFilterExtensionPtr

.const
uszFilterDevName dw "\","D","e","v","i","c","e","\","I","P","F","I","L","T","E","R","D","R","I","V","E","R",0
uszDeviceName  dw "\","D","e","v","i","c","e","\","I","P","H","O","O","K","E","R",0
uszSymbolicLinkName dw "\","D","o","s","D","e","v","i","c","e","s","\","I","P","H","O","O","K","E","R", 0

IOCTL_GET_VERSION  equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_ANY_ACCESS)

.data

hook_nfo PF_SET_EXTENSION_HOOK_INFO <>

isb      IO_STATUS_BLOCK <>
fileobj  PFILE_OBJECT NULL
myirp    PIRP NULL
devobj   PDEVICE_OBJECT ?
incer    DWORD 0
source1  DWORD 0
dest1    DWORD 0
counter  DWORD 0
type_    BYTE ?

usSymbolicLinkName UNICODE_STRING <>
usDeviceName UNICODE_STRING <>
usFilterDevName UNICODE_STRING <>

cb   DWORD ?
p     PVOID ?
dwNumModules DWORD ?
pMessage DWORD ?
mas     BYTE 1000h dup(0)

.code

;-----------------------------------------------------------------
DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
       mov eax, pIrp
assume eax:ptr _IRP
mov [eax].IoStatus.Status, STATUS_SUCCESS
and [eax].IoStatus.Information, 0
assume eax:nothing

fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT

mov eax, STATUS_SUCCESS
ret

DispatchCreateClose endp

;------------------------------------------------------------------
DispatchControl proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

local status          : NTSTATUS
local dwBytesReturned : DWORD

;int 3
and dwBytesReturned, 0

mov esi, pIrp
assume esi:ptr _IRP

IoGetCurrentIrpStackLocation esi
mov edi, eax
assume edi:ptr IO_STACK_LOCATION

.if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_GET_VERSION
 mov eax, [esi].AssociatedIrp.SystemBuffer

 ;.if counter !=0
   invoke CopyMemory,eax, addr mas, 10h
 ;.endif

 push counter
 pop dword ptr [eax]

 push source1
 pop  dword ptr [eax+4]

 push dest1
 pop  dword ptr [eax+8]

 mov dl,type_
 mov byte ptr [eax+12],dl

 mov dwBytesReturned,13

 mov status, STATUS_SUCCESS
.else
 mov status, STATUS_INVALID_DEVICE_REQUEST
.endif

assume edi:nothing

push status
pop [esi].IoStatus.Status

push dwBytesReturned
pop [esi].IoStatus.Information

assume esi:nothing

fastcall IofCompleteRequest, esi, IO_NO_INCREMENT

mov eax, status
ret

DispatchControl endp

;------------------------------------------------------------------
DriverUnload proc pDriverObject:PDRIVER_OBJECT
;int 3

invoke set_hook,NULL
invoke IoDeleteSymbolicLink, addr usSymbolicLinkName
mov eax, pDriverObject
invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
       
       invoke ExFreePool, p
       invoke DbgPrint, $CTA0("SystemModules: Memory at address %08X released\n"), p

    ret
DriverUnload endp

;---------------------------------------------------------------------
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

local pDeviceObject      : PVOID
local status             : NTSTATUS

    ;int 3

    and cb, 0
    invoke ZwQuerySystemInformation, SystemModuleInformation, addr p, 0, addr cb
    .if cb != 0
        invoke ExAllocatePool, NonPagedPool, cb
        .if eax != NULL
            mov p, eax
       
            invoke DbgPrint, $CTA0("SystemModules: %u bytes of paged memory allocted at address %08X\n"), cb, p
       
        .endif
    .endif

       invoke RtlInitUnicodeString, addr usDeviceName, offset uszDeviceName
invoke RtlInitUnicodeString, addr usSymbolicLinkName, offset uszSymbolicLinkName
invoke RtlInitUnicodeString, addr usFilterDevName, offset uszFilterDevName

;установка хука!
mov eax,offset hookproc
invoke set_hook, eax

.if eax != STATUS_SUCCESS
        ret
       .endif

mov status, STATUS_DEVICE_CONFIGURATION_ERROR

invoke IoCreateDevice,pDriverObject,0, addr usDeviceName,FILE_DEVICE_UNKNOWN,0,TRUE,addr pDeviceObject

 .if eax == STATUS_SUCCESS
        invoke IoCreateSymbolicLink, addr usSymbolicLinkName, addr usDeviceName
        .if eax == STATUS_SUCCESS
            mov eax, pDriverObject
            assume eax:PTR DRIVER_OBJECT
            mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],offset DispatchCreateClose
     mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],offset DispatchCreateClose
     mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],  offset DispatchControl
            mov [eax].DriverUnload,offset DriverUnload
            assume eax:nothing
            mov status, STATUS_SUCCESS
        .else
            invoke IoDeleteDevice, pDeviceObject
        .endif
    .endif

mov eax, status
;mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    ret

DriverEntry endp

;--------------------------------------------------------------------------
set_hook proc hook_fn:PacketFilterExtensionPtr
local status             : NTSTATUS

invoke IoGetDeviceObjectPointer,addr usFilterDevName,STANDARD_RIGHTS_ALL,addr fileobj,addr devobj

mov status,eax  
       .if eax != STATUS_SUCCESS
        jmp exit
       .endif

       mov eax,hook_fn
       mov hook_nfo.ExtensionPointer,eax
     
       invoke IoBuildDeviceIoControlRequest,IOCTL_PF_SET_EXTENSION_POINTER(),devobj, addr hook_nfo,
           sizeof hook_nfo, NULL, 0, FALSE, NULL,addr isb

mov myirp,eax

       .if eax == NULL
        mov status ,STATUS_INSUFFICIENT_RESOURCES
        jmp exit
       .endif

       invoke IoCallDriver,devobj,myirp

       mov myirp,NULL


 
AlterEgo of WondeRu ©   (2005-01-05 16:39) [5]

       mov eax,STATUS_SUCCESS
       ret
exit:

.if fileobj!=NULL
 invoke ObDereferenceObject,fileobj
.endif

mov eax,status
ret

set_hook endp

;------------------------------------------------------------------------
hookproc proc PacketHeader:DWORD, Packet:DWORD, PacketLength:WORD,
       RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:DWORD,
       SendLinkNextHop:DWORD

;int 3

mov eax, PacketHeader
       assume eax: ptr IPHeader

mov edx,[eax].iph_src
       mov source1,edx

mov edx,[eax].iph_dest  
mov dest1,edx
       
mov dl,byte ptr [eax].iph_protocol
mov type_,dl

.if counter >= 0fffffff0h
    mov counter,0
.else
    inc counter
.endif

       assume eax:nothing

       mov eax,PF_FORWARD
ret
hookproc endp

;------------------------------------------------------------------------
end DriverEntry


 
AlterEgo of WondeRu ©   (2005-01-05 16:43) [6]

а можно и через NDIS-драйвер попробовать!


 
volser   (2005-01-05 22:44) [7]

Eraser
прикольный сайт. Спасибо!

AlterEgo of WondeRu
А нету случайно чего то в этом роде, только на сях?


 
AlterEgo of WondeRu ©   (2005-01-05 23:53) [8]

volser   (05.01.05 22:44) [7]
в DDK есть этот пример, получше поищи! там должен быть файл pfhook.h включен в проект!


 
volser   (2005-01-06 17:51) [9]

Извини, но я в упор не нахожу. У меня DDK 2000. Если не сложно, укажи путь к примеру.
 Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
1-1109671828
JTAG
2005-03-01 13:10
2005.03.13
Как организовать задержку (стандартный таймер) сделал так:


1-1109322050
hgd
2005-02-25 12:00
2005.03.13
Повторный запуск приложения


1-1109334999
ТехникПТО
2005-02-25 15:36
2005.03.13
Как в MessageDlg определить нажатие кнопки?


14-1108834039
Vaitek
2005-02-19 20:27
2005.03.13
3 задачи


4-1107290316
kluben
2005-02-01 23:38
2005.03.13
Защищенный режим процессора