阅读:2141回复:14
对防火墙技术的一点新想法,请高手指点。
对于PC网络防火墙,有LSP,Hook TDI,IMD等方法,最近看论坛上讨论Hook NDIS,和注册假协议,继而搜索协议链的方法很火,我有一个可能很幼稚的想法,就是既然可以Hook NDIS的NdisRegisterProtocol,NdisOpenAdapter等函数,为什么不能Hook NDIS的NdisMRegisterMiniport函数,这可是网卡调用的阿,如果我在这里用自己函数替换NDIS_MINIPORT_CHARACTERISTICS里面的函数,是不是也可以得到发送,接受的数据,这个时候应该也可以做过滤,加密之类的操作吧?我想这种思路做过防火墙的朋友考虑过吧?但为什么没人讨论呢?难道是这种方法根本没有办法实现?期待高手来指点迷津。
|
|
最新喜欢:YiXion... |
沙发#
发布于:2002-07-10 09:21
呵呵!我弄了两天,结果并非所想的那样!因为没有接受函数的地址,不知道放在哪里了!还有就是小端口的链地址也没有找到
|
|
板凳#
发布于:2002-07-10 10:55
呵呵!我弄了两天,结果并非所想的那样!因为没有接受函数的地址,不知道放在哪里了!还有就是小端口的链地址也没有找到 不是这两天弄得吧? |
|
地板#
发布于:2002-07-10 18:28
我倒是写了一个这样的驱动,我把NdisMRegisterMiniport给hook了,也看到我自己的NdisMRegisterMiniport被调用了,但是如果有多个网卡,我把NDIS_MINIPORT_CHARACTERISTICS的函数替换成了自己的函数后,那么当这些函数调用后,比如在SendHandler被调用的时候,我怎么知道这次调用是对应那个网卡呢?不知道那位大虾有好的解决方法。
|
|
地下室#
发布于:2002-07-11 23:07
呵呵!这个倒是好解决的啊!本站好象有这样的讨论的啊
|
|
5楼#
发布于:2002-07-11 23:09
给你一个例子,自己参考吧!方法一样的,对了,在这里要进行堆栈调整,内核里面不一定的哦
// SDkTest1.cpp : Defines the entry point for the application. // #include \"stdafx.h\" #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif typedef (*P)(IN HWND Handle, IN LPCTSTR Mesg1,IN LPCTSTR Mesg2,IN unsigned int Type); ULONG RealMyFun( IN P FunAddr, IN HWND Handle, IN LPCTSTR Mesg1, IN LPCTSTR Mesg2, IN unsigned int Type ); VOID TempMyFun( IN HWND Handle, IN LPCTSTR Mesg1, IN LPCTSTR Mesg2, IN unsigned int Type ); typedef struct _tagCODEDATA tagCODEDATA,*PtagCODEDATA; struct _tagCODEDATA{ PtagCODEDATA pNext; UCHAR ucFixCode[8];//0x90 UCHAR ucFix1[2];//0x90 UCHAR ucPOPEAX;//0x58 UCHAR ucPushCode1;//0x68 ULONG ucPushHexFunParam;//让函数多出来的参数 UCHAR ucFix2[2];//0x90 UCHAR ucPushEAX;//0x50 UCHAR ucPushCode2;//0x68 ULONG ulPushFunEntry;//需要进入的函数地址 UCHAR ucRet;//0xc3 }; ULONG RealMyFun( IN P FunAddr, IN HWND Handle, IN LPCTSTR Mesg1, IN LPCTSTR Mesg2, IN unsigned int Type ) { P a=FunAddr; MessageBox(Handle,Mesg1,Mesg2,Type); FunAddr(Handle,Mesg1,Mesg2,Type); return 0; } VOID TempMyFun( IN HWND Handle, IN LPCTSTR Mesg1, IN LPCTSTR Mesg2, IN unsigned int Type ) { MessageBox(Handle,Mesg1,Mesg2,Type); } tagCODEDATA *p; VOID My() { tagCODEDATA abc,cbd; CHAR Buffer1[]=\"1234567890\"; CHAR Buffer2[]=\"abcdef\"; memset(&abc,0x90,sizeof(abc)); p=&abc; abc.pNext=NULL; abc.ucPOPEAX=0x58; abc.ucPushCode1=0x68; abc.ucPushCode2=0x68; abc.ucPushEAX=0x50; abc.ucRet=0xc3; abc.ulPushFunEntry=(ULONG)RealMyFun; abc.ucPushHexFunParam=(ULONG)&TempMyFun; memcpy(&cbd,&abc,sizeof(cbd)), abc.pNext=&cbd; _asm{ push MB_OK lea eax,Buffer2 push eax lea eax,Buffer1 push eax push NULL lea eax,abc.ucFixCode call eax add esp,20 } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { My(); return 0; } |
|
6楼#
发布于:2002-07-11 23:21
谢谢老鼠,今天身体不舒服,没有仔细看,不过好像跟我的想法差不多,不过我的手法可能比较偏,我是自己申请一块内存,然后写入二进制的代码,比如我要接挂MiniportSend函数,我要自己写个MyMiniportSend,比原来的MiniportSend多一个参数,这个参数就是用来标识哪个网卡的。不过还没有调试通过哦,也不知道是不是真的行得通。
|
|
7楼#
发布于:2002-07-12 00:01
为什么要用到汇编呢?是不是移植性就不好了呢?
|
|
|
8楼#
发布于:2002-07-12 13:30
为什么要用到汇编呢?是不是移植性就不好了呢? 应该不会有什么问题的。 |
|
9楼#
发布于:2002-07-12 17:48
怪了,为什么我的驱动程序设置Start为0时就加载不起来呢?我设置1的时候时可以的,我好像也没有用什么特别的东西阿。
|
|
10楼#
发布于:2002-07-12 17:52
我的程序调试成功,我看到我的虚拟网卡加载的时候我,我用我的程序可以拦截到发包,但是我的物理网卡我没有能拦截到,可能是启动顺序不对,那位这方面精通的指点一下,我也慢慢研究。
|
|
11楼#
发布于:2002-07-12 17:57
我设置为0 的时候,指定在ndis.sys之后加载的。
|
|
12楼#
发布于:2002-07-15 10:22
唐僧不知道研究到什么地方了呢!我也曾经搞过,结果不行,现在有点时间,我们一块搞?
|
|
13楼#
发布于:2002-07-15 11:40
好啊,不过我的代码写得好土,怕你会笑哦。
|
|
14楼#
发布于:2002-07-15 12:12
老鼠这么热心,要鼓励一下,给你100分专家分吧,本来想多给点,怕不好给大家交待啊。哈哈。
|
|