tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
阅读:1862回复:16

关于注册假协议的几个问题,恳请大虾指教

楼主#
更多 发布于:2002-09-30 11:42
    鄙人有一个防火墙的驱动程序,是用注册假协议然后替换函数地址来实现的,并且该程序单独运行时一切正常,但是有一个问题,就是和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;

       可是该结构和网上给出的好象不一样,但是我的这个驱动程序确实能运行,不知道为什么,恳请大虾指点。分不多,请大虾见谅,鄙人是新手,描述问题有不清楚的地方,请大虾海涵。

最新喜欢:

zackaryzackar...
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-09-30 19:14
   鄙人有一个防火墙的驱动程序,是用注册假协议然后替换函数地址来实现的,并且该程序单独运行时一切正常,但是有一个问题,就是和winpcap同时运行时会出现蓝屏错误,用softice跟踪发现是在替换函数地址时出错。
    具体出错情况是这样的:如果我的放火墙驱动的生命期在winpcap生命期之间就不会出错,而有交叉就会出错。

 


当然必须是FIFO,
否则那张NDIS_OPEN_BLOCK会填乱的。

我思故我在,脑袋不会坏.
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-09-30 22:39
在你勾住的TCP/IP协议处理函数中加一个SPIN LOCAK看看效果如何 :mad: :mad: :mad: :mad:
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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

};
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-08 10:20
不行啊,好像不是这个问题,难道没有人碰到过这个问题吗
再等几天,要是没有人回答,我的分你们两个就分了吧,
郁闷!
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-08 10:23
对了,我那个驱动中用的是NDIS 4.0 所以那个结构不用改,不过楼上wlrwx的那个结构我保留了,谢谢。 :)
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2002-10-08 14:39
据我了解,升级结构的时候大多数是把新的域放在结构后面,然后可以根据Version来确定有些什么域。
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-08 15:02
我想试试,winpcap怎么用?有没有什么东东是使用它的?
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-08 15:06
找到一个udpdump,可是没死啊,你的是什么系统?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-08 16:26
我们实验室的另一个产品用到了winpcap,具体怎么用winpcap我也不知道:(,我用sniffer测试了一下没有问题,现在我想这样做:hook
NdisRegisterProtocol和NdisDeRegisterProtocol,每当这两个函数调用的时候,我就恢复NDIS_OPEN_BLOCK那张表,执行完后再重新勾挂,不知道这样行不行,请大侠点拨,我的操作系统是2000,另外
udpdump是什么?我没有用过。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
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地函数地址,然后用我的函数的地址直接替换就可以了?

鄙人实在是菜,望大虾点拨,最好大虾能有一个简单的例子,
在下给大虾鞠躬了!!!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-10-10 10:52
Hook NDIS API,你可以到网络安全版里面找我的noname 防火墙源代码看看。
你给出的这段代码:
MyGetModule,根据模块名字,返回改模块在内存里面的基地址
MyGetProcAddress,在上面那个函数返回的机地址里面,根据函数的名字,找到函数的地址。

tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-10 11:40
我下载不了阿,出现错误。
能不能直接发到我信箱阿,
谢谢,
xutaiping@263.net

bow
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
13楼#
发布于:2002-10-10 13:22
还真是下不了啊?我还以为是你设置不对呢。上来一个把。
附件名称/大小 下载次数 最后更新
2002-10-10_Apf_src_1.1.zip (28KB)  52
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2002-10-10 13:26
这个可以下了。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-10-10 13:39
哇徕!太酷了,我还没有仔细看,先加分先!
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-10-10 13:40
加过分了,好像不能再加分了,另一个帖子里再给分!
游客

返回顶部