fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:2106回复:14

对防火墙技术的一点新想法,请高手指点。

楼主#
更多 发布于:2002-07-09 16:50
对于PC网络防火墙,有LSP,Hook TDI,IMD等方法,最近看论坛上讨论Hook NDIS,和注册假协议,继而搜索协议链的方法很火,我有一个可能很幼稚的想法,就是既然可以Hook NDIS的NdisRegisterProtocol,NdisOpenAdapter等函数,为什么不能Hook NDIS的NdisMRegisterMiniport函数,这可是网卡调用的阿,如果我在这里用自己函数替换NDIS_MINIPORT_CHARACTERISTICS里面的函数,是不是也可以得到发送,接受的数据,这个时候应该也可以做过滤,加密之类的操作吧?我想这种思路做过防火墙的朋友考虑过吧?但为什么没人讨论呢?难道是这种方法根本没有办法实现?期待高手来指点迷津。

最新喜欢:

YiXiongYiXion...
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-10 09:21
呵呵!我弄了两天,结果并非所想的那样!因为没有接受函数的地址,不知道放在哪里了!还有就是小端口的链地址也没有找到
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-07-10 10:55
呵呵!我弄了两天,结果并非所想的那样!因为没有接受函数的地址,不知道放在哪里了!还有就是小端口的链地址也没有找到


不是这两天弄得吧?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-07-10 18:28
我倒是写了一个这样的驱动,我把NdisMRegisterMiniport给hook了,也看到我自己的NdisMRegisterMiniport被调用了,但是如果有多个网卡,我把NDIS_MINIPORT_CHARACTERISTICS的函数替换成了自己的函数后,那么当这些函数调用后,比如在SendHandler被调用的时候,我怎么知道这次调用是对应那个网卡呢?不知道那位大虾有好的解决方法。
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-11 23:07
呵呵!这个倒是好解决的啊!本站好象有这样的讨论的啊
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
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;
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2002-07-11 23:21
谢谢老鼠,今天身体不舒服,没有仔细看,不过好像跟我的想法差不多,不过我的手法可能比较偏,我是自己申请一块内存,然后写入二进制的代码,比如我要接挂MiniportSend函数,我要自己写个MyMiniportSend,比原来的MiniportSend多一个参数,这个参数就是用来标识哪个网卡的。不过还没有调试通过哦,也不知道是不是真的行得通。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-12 00:01
为什么要用到汇编呢?是不是移植性就不好了呢?
按第一贴的“给分”键,给分。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
8楼#
发布于:2002-07-12 13:30
为什么要用到汇编呢?是不是移植性就不好了呢?

应该不会有什么问题的。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2002-07-12 17:48
怪了,为什么我的驱动程序设置Start为0时就加载不起来呢?我设置1的时候时可以的,我好像也没有用什么特别的东西阿。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2002-07-12 17:52
我的程序调试成功,我看到我的虚拟网卡加载的时候我,我用我的程序可以拦截到发包,但是我的物理网卡我没有能拦截到,可能是启动顺序不对,那位这方面精通的指点一下,我也慢慢研究。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-07-12 17:57
我设置为0 的时候,指定在ndis.sys之后加载的。
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-15 10:22
唐僧不知道研究到什么地方了呢!我也曾经搞过,结果不行,现在有点时间,我们一块搞?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
13楼#
发布于:2002-07-15 11:40
好啊,不过我的代码写得好土,怕你会笑哦。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2002-07-15 12:12
老鼠这么热心,要鼓励一下,给你100分专家分吧,本来想多给点,怕不好给大家交待啊。哈哈。
游客

返回顶部