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

noname 防火墙使用技术

楼主#
更多 发布于:2002-08-15 14:12
写过虚拟网卡驱动或者用过DDK Passthru 的兄弟都知道,在写这个驱动的时候,都是先填充一下NDIS_MINIPORT_CHARACTERISTICS结构,然后调用NdisMRegisterMiniport,或者是NdisIMRegisterLayeredMiniport(DDK 的Passthru),有或者是NdisRegisterMac(用这个函数的驱动程序我只在98下见过)来向Ndis注册一个网卡,而通过DDK文档的说明,知道NDIS_MINIPORT_CHARACTERISTICS里面有一系列的函数,是用来收发网络包的,比如SendHandler用来发单个Packet,SendPacketsHandler发送多个包。而通常向协议层指示数据,是调用NdisMEthIndicateReceive,NdisMIndicateReceivePacket等函数(当然也会有一些用来支持FDDI之类的函数)。

最新喜欢:

okincnokincn
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2002-08-15 14:17
通过以上了解,可以大胆设想,如果能将这些发送和接受的部分拦截,是不是就可以实现发出和进入数据的拦截?做了一些试验,发现这种方法是可行的,试验是在网卡上做的,没有在modem,ADSL等其他设备上测试过,所以不知道能否行得通。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-08-15 14:20
要实现这种方法,主要以下问题:
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-08-15 14:33
1。ndis API的拦截,这里就是对NdisMRegisterMiniport等API的拦截。这个问题网上讨论的很多,看看PE文件的格式,看看如何搜索系统模块,很容易解决。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2002-08-15 14:50
2。拦截了ndis API以后,举个例子说,比如NdisMReigsterMiniport,系统起来以后,如果你有多块网卡,你就可以看到这个函数被调用了多次。
要实现数据的拦截,光拦截API还是不够的,如第一篇所讲,还要拦截NDIS_MINIPORT_CHARACTERISTICS里面的很多成员,如SendHandler,拦截的方法很简单,我们写一个参数跟SendHandler一样的函数MySendHandler,然后将原来的SendHandler地址保存,把MySendHandler填入到NDIS_MINIPORT_CHARACTERISTICS结构中,这样当系统调用NDIS_MINIPORT_CHARACTERISTICS的SendHandler时,实际上就调用的是MySendHandler,然后在MySendHandler里面调用原来的SendHandler.
这样就存在一个问题,如果系统有多个网卡,当然每个SendHandler都不同,而MySendHandler只有一个,如果每个NDIS_MINIPORT_CHARACTERISTICS都填的是这个地址,那么怎么在MySendHandler里面来确定要调哪个网卡的SendHandler呢?唉,要是
MySendHandler能比原来多出来一个参数多好啊?可是,系统调SendHandler的时候,可没有给出啊。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2002-08-15 14:57
为了解决这个问题,要练练汇编了:

看看汇编调用函数:
比如C写的函数
int func( int argv1, int argv2 ) {
  ...
}
int demo( ) {
  func( 0, 1 );
}
翻译成汇编就成了:

func (...)
XXXXX:XXXXX  push ebp
XXXXX:XXXXX  mov  ebp, esp
XXXXX:XXXXX  mov  eax, [ebp+0c] /* 用的是好像第一个参数吧? */
XXXXX:XXXXX  mov  eax, [ebp+08] /* 用的是第二个参数吧?*/
...
XXXXX:XXXXX  pop ebp
XXXXX:XXXXX  ret 08

demo(...)
XXXXX:XXXXX  push 1
XXXXX:XXXXX  push 0
XXXXX:XXXXX  call func
XXXXX:XXXXX  ret
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2002-08-15 15:04
我靠,讲到这段我都不知道怎么讲了。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
7楼#
发布于:2002-08-15 15:05
喝水,灌水,歇会儿。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-15 15:45
我对fracker的敬仰犹如滔滔江水,绵绵不绝。。。。。

你说的pe格式可是这个?
要是的话大家参考一下吧。 :cool:
按第一贴的“给分”键,给分。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2002-08-15 16:31
老Mo找东西真得好牛啊!以后缺什么东西一定跟你要。
(小声说:“ndis.sys的源代码你帮我找找吧”)
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2002-08-15 16:43
接着说,其实hookNDIS_MINIPORT_CHARACTERISTICS里面的函数的时候,我们是为了实现下面的这种效果:
typedef ( int * POLDFUNC )( int argv1, int argv2 );

typedef struct _CHARAC {
   POLDFUNC pfunc;
} CHARAC;

int func( int argv1, int argv2 ) {
 ...
}

main() {
  CHARAC ch;
  ch.pfunc = func;  
  ch.pfunc( 0, 1 );
}

如果我们要拦截,就是要实现如下
int myfunc( int argv1, int argv2 ) {
  return func( argv1, argv2 );
}
int func( int argv1, int argv2 ) {
 ...
}

main() {
  CHARAC ch;
  ch.pfunc = func;  
  //在他之前我改!!!
  ch.pfunc = myfunc;
  ch.pfunc( 0, 1 );
}

这也没问题,但如果CHARAC有很多个,对应的pfunc里面的内容不同的话,这个代码在内核里面运行,肯定死翘!那么如果改成这样:
int myfunc( POLDFUNC poldfunc, int argv1, int argv2 ) {
  return poldfunc( argv1, argv2 );
}

int fakefunc( int argv1, int argv2 ) {
   POLDFUNC poldfunc;
   return myfunc( poldfunc, argv1, argv2 );
}
int func( int argv1, int argv2 ) {
 ...
}

main() {
  CHARAC ch;
  ch.pfunc = func;  
  //在他之前我改!!!
  ch.pfunc = fakefunc;
  ch.pfunc( 0, 1 );
}


fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-08-15 16:49
到了这一步,剩下的就是怎么给fakefunc里面的局部变量poldfunc赋值了,很不幸,代码所在的内存写的时候会兰屏(有些高手能绕过去,可是我没学到),从前面的汇编代码知道,函数调用实际上就是call + 地址,那么如果我们自己申请一块内存,里面的内容就是fakefunc的所有指令,应该就能满足我们的要求!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
12楼#
发布于:2002-08-15 16:51
这样一来就简单了,写一个fakefunc,反汇编之,然后把机器码找出。。。
最后在合适的位置上把poldfunc的地址填入。。。。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
13楼#
发布于:2002-08-15 16:53
运用到noname 防火墙里面就是。。。。
反正只要经过N(N>100)次重起,他就工作啦。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2002-08-15 17:29
就写这么多吧,写这个好累哦。
zhangyj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-17
  • 最后登录2009-07-17
  • 粉丝0
  • 关注0
  • 积分103分
  • 威望50点
  • 贡献值1点
  • 好评度9点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-16 08:26
高!!!!!!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-08-16 10:18
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?
我不仅要金子,我还要点石成金的手指!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
17楼#
发布于:2002-08-16 15:41
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?


不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API
但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。
daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-10-25 11:30
不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API
但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。 [/quote]

可以发那个pe文件给我吗?楼上那个连接无效了。
daisyboy@sohu.com
合作c/c++/ndis/pppoe/802.1x!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
19楼#
发布于:2002-10-25 11:37
那得跟老mo要了,我也没有保存下来。
上一页
游客

返回顶部