阅读:1862回复: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-09-30 19:14
鄙人有一个防火墙的驱动程序,是用注册假协议然后替换函数地址来实现的,并且该程序单独运行时一切正常,但是有一个问题,就是和winpcap同时运行时会出现蓝屏错误,用softice跟踪发现是在替换函数地址时出错。 当然必须是FIFO, 否则那张NDIS_OPEN_BLOCK会填乱的。 |
|
|
板凳#
发布于:2002-09-30 22:39
在你勾住的TCP/IP协议处理函数中加一个SPIN LOCAK看看效果如何 :mad: :mad: :mad: :mad:
|
|
|
地板#
发布于:2002-09-30 23:05
对了,那个结构应该是和NDIS的版本有关的...所以不同...参考一下我的定义吧...
struct _MYNDIS_PROTOCOL_BLOCK { PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol ULONG Unknown1; ULONG Unknown2; ULONG Unknown3; struct _MYNDIS_PROTOCOL_BLOCK *NextProtocol; ///PROTOCOL_CHARACTERISTICS ///NDIS30 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; #if ( NDIS40 || NDIS50 ) // // Start of NDIS 4.0 extensions. // RECEIVE_PACKET_HANDLER ReceivePacketHandler; // // PnP protocol entry-points // BIND_HANDLER BindAdapterHandler; UNBIND_HANDLER UnbindAdapterHandler; PNP_EVENT_HANDLER PnPEventHandler; UNLOAD_PROTOCOL_HANDLER UnloadHandler; #endif //Start of NDIS 5.0 extensions. //added by OHG #if NDIS50 // // Placeholders for protocol extensions for PnP/PM etc. // PVOID ReservedHandlers[4]; // // Start of NDIS 5.0 extensions. // CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; CO_STATUS_HANDLER CoStatusHandler; CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; #endif }; |
|
|
地下室#
发布于:2002-10-08 10:20
不行啊,好像不是这个问题,难道没有人碰到过这个问题吗
再等几天,要是没有人回答,我的分你们两个就分了吧, 郁闷! |
|
5楼#
发布于:2002-10-08 10:23
对了,我那个驱动中用的是NDIS 4.0 所以那个结构不用改,不过楼上wlrwx的那个结构我保留了,谢谢。 :)
|
|
6楼#
发布于:2002-10-08 14:39
据我了解,升级结构的时候大多数是把新的域放在结构后面,然后可以根据Version来确定有些什么域。
|
|
7楼#
发布于:2002-10-08 15:02
我想试试,winpcap怎么用?有没有什么东东是使用它的?
|
|
8楼#
发布于:2002-10-08 15:06
找到一个udpdump,可是没死啊,你的是什么系统?
|
|
9楼#
发布于:2002-10-08 16:26
我们实验室的另一个产品用到了winpcap,具体怎么用winpcap我也不知道:(,我用sniffer测试了一下没有问题,现在我想这样做:hook
NdisRegisterProtocol和NdisDeRegisterProtocol,每当这两个函数调用的时候,我就恢复NDIS_OPEN_BLOCK那张表,执行完后再重新勾挂,不知道这样行不行,请大侠点拨,我的操作系统是2000,另外 udpdump是什么?我没有用过。 |
|
10楼#
发布于: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地函数地址,然后用我的函数的地址直接替换就可以了? 鄙人实在是菜,望大虾点拨,最好大虾能有一个简单的例子, 在下给大虾鞠躬了!!! |
|
11楼#
发布于:2002-10-10 10:52
Hook NDIS API,你可以到网络安全版里面找我的noname 防火墙源代码看看。
你给出的这段代码: MyGetModule,根据模块名字,返回改模块在内存里面的基地址 MyGetProcAddress,在上面那个函数返回的机地址里面,根据函数的名字,找到函数的地址。 |
|
12楼#
发布于:2002-10-10 11:40
我下载不了阿,出现错误。
能不能直接发到我信箱阿, 谢谢, xutaiping@263.net bow |
|
13楼#
发布于:2002-10-10 13:22
还真是下不了啊?我还以为是你设置不对呢。上来一个把。
|
|
|
14楼#
发布于:2002-10-10 13:26
这个可以下了。
|
|
15楼#
发布于:2002-10-10 13:39
哇徕!太酷了,我还没有仔细看,先加分先!
|
|
16楼#
发布于:2002-10-10 13:40
加过分了,好像不能再加分了,另一个帖子里再给分!
|
|