阅读:1805回复:16
关于注册假协议的几个问题,恳请大虾指教
鄙人有一个防火墙的驱动程序,是用注册假协议然后替换函数地址来实现的,并且该程序单独运行时一切正常,但是有一个问题,就是和winpcap同时运行时会出现蓝屏错误,用softice跟踪发现是在替换函数地址时出错。
具体出错情况是这样的:如果我的放火墙驱动的生命期在winpcap生命期之间就不会出错,而有交叉就会出错。 另外还有一个问题,我的NDIS_PROTOCOL_BLOCK的结构如下: typedef struct _NDIS_PROTOCOL_BLOCK { PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol ULONG Unknown1; ULONG Unknown2; ULONG Unknown3; struct _NDIS_PROTOCOL_BLOCK *NextProtocol; ///PROTOCOL_CHARACTERISTICS UCHAR MajorNdisVersion; UCHAR MinorNdisVersion; USHORT Filler; union { UINT Reserved; UINT Flags; }; OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler; CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler; union { SEND_COMPLETE_HANDLER SendCompleteHandler; WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler; }; union { TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler; }; RESET_COMPLETE_HANDLER ResetCompleteHandler; REQUEST_COMPLETE_HANDLER RequestCompleteHandler; union { RECEIVE_HANDLER ReceiveHandler; WAN_RECEIVE_HANDLER WanReceiveHandler; }; RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; STATUS_HANDLER StatusHandler; STATUS_COMPLETE_HANDLER StatusCompleteHandler; NDIS_STRING Name; RECEIVE_PACKET_HANDLER ReceivePacketHandler; BIND_HANDLER BindAdapterHandler; UNBIND_HANDLER UnbindAdapterHandler; // PNP_EVENT_HANDLER PnPEventHandler; // UNLOAD_PROTOCOL_HANDLER UnloadHandler; } NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK; 可是该结构和网上给出的好象不一样,但是我的这个驱动程序确实能运行,不知道为什么,恳请大虾指点。分不多,请大虾见谅,鄙人是新手,描述问题有不清楚的地方,请大虾海涵。 |
|
最新喜欢:zackar... |
沙发#
发布于:2002-10-08 10:20
不行啊,好像不是这个问题,难道没有人碰到过这个问题吗
再等几天,要是没有人回答,我的分你们两个就分了吧, 郁闷! |
|
板凳#
发布于:2002-10-08 10:23
对了,我那个驱动中用的是NDIS 4.0 所以那个结构不用改,不过楼上wlrwx的那个结构我保留了,谢谢。 :)
|
|
地板#
发布于:2002-10-08 16:26
我们实验室的另一个产品用到了winpcap,具体怎么用winpcap我也不知道:(,我用sniffer测试了一下没有问题,现在我想这样做:hook
NdisRegisterProtocol和NdisDeRegisterProtocol,每当这两个函数调用的时候,我就恢复NDIS_OPEN_BLOCK那张表,执行完后再重新勾挂,不知道这样行不行,请大侠点拨,我的操作系统是2000,另外 udpdump是什么?我没有用过。 |
|
地下室#
发布于:2002-10-09 10:44
再请教大虾一个问题,就是如何hook NdisRegisterProtocol?
我在网上找到了下面两个函数: PVOID MyGetModule(PCSTR Name) { ULONG n; PULONG q; PVOID ntoskrnl = 0; ULONG i = 0; PSYSTEM_MODULE_INFORMATION p; ZwQuerySystemInformation(SystemModuleInformation, &n, 0, &n); q = (PULONG)(ExAllocatePool(PagedPool, n)); ZwQuerySystemInformation(SystemModuleInformation, q, n * sizeof *q, 0); p = (PSYSTEM_MODULE_INFORMATION)(q + 1); for (; i < *q; i++) if (_stricmp(p->ImageName + p->ModuleNameOffset, Name) == 0) ntoskrnl =p->Base; ExFreePool(q); return ntoskrnl; } PVOID MyGetProcAddress(PVOID Base, PCSTR Name) { PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)(Base); PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)(PCHAR(Base) + dos->e_lfanew); PIMAGE_DATA_DIRECTORY expdir = nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT; ULONG size = expdir->Size; ULONG addr = expdir->VirtualAddress; PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((PCHAR)(Base) + addr); PULONG functions = (PULONG)((PCHAR)(Base) + exports->AddressOfFunctions); PSHORT ordinals = (PSHORT)((PCHAR)(Base) + exports->AddressOfNameOrdinals); PULONG names = (PULONG)((PCHAR)(Base) + exports->AddressOfNames); PVOID func = 0; for (ULONG i = 0; i < exports->NumberOfNames; i++) { ULONG ord = ordinals [i ]; if (functions[ord] < addr || functions[ord] >= addr + size) { if (strcmp((PSTR)((PCHAR)(Base) + names), Name) == 0) func = (PCHAR)(Base) + functions[ord]; } } return func; } 但是不知道怎么用,是不是得到NdisRegisterProcotol地函数地址,然后用我的函数的地址直接替换就可以了? 鄙人实在是菜,望大虾点拨,最好大虾能有一个简单的例子, 在下给大虾鞠躬了!!! |
|
5楼#
发布于:2002-10-10 11:40
我下载不了阿,出现错误。
能不能直接发到我信箱阿, 谢谢, xutaiping@263.net bow |
|
6楼#
发布于:2002-10-10 13:39
哇徕!太酷了,我还没有仔细看,先加分先!
|
|
7楼#
发布于:2002-10-10 13:40
加过分了,好像不能再加分了,另一个帖子里再给分!
|
|