阅读:3820回复:23
noname 防火墙使用技术
写过虚拟网卡驱动或者用过DDK Passthru 的兄弟都知道,在写这个驱动的时候,都是先填充一下NDIS_MINIPORT_CHARACTERISTICS结构,然后调用NdisMRegisterMiniport,或者是NdisIMRegisterLayeredMiniport(DDK 的Passthru),有或者是NdisRegisterMac(用这个函数的驱动程序我只在98下见过)来向Ndis注册一个网卡,而通过DDK文档的说明,知道NDIS_MINIPORT_CHARACTERISTICS里面有一系列的函数,是用来收发网络包的,比如SendHandler用来发单个Packet,SendPacketsHandler发送多个包。而通常向协议层指示数据,是调用NdisMEthIndicateReceive,NdisMIndicateReceivePacket等函数(当然也会有一些用来支持FDDI之类的函数)。
|
|
最新喜欢:okincn |
沙发#
发布于:2002-08-15 14:17
通过以上了解,可以大胆设想,如果能将这些发送和接受的部分拦截,是不是就可以实现发出和进入数据的拦截?做了一些试验,发现这种方法是可行的,试验是在网卡上做的,没有在modem,ADSL等其他设备上测试过,所以不知道能否行得通。
|
|
板凳#
发布于:2002-08-15 14:20
要实现这种方法,主要以下问题:
|
|
地板#
发布于:2002-08-15 14:33
1。ndis API的拦截,这里就是对NdisMRegisterMiniport等API的拦截。这个问题网上讨论的很多,看看PE文件的格式,看看如何搜索系统模块,很容易解决。
|
|
地下室#
发布于: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的时候,可没有给出啊。 |
|
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 |
|
6楼#
发布于:2002-08-15 15:04
我靠,讲到这段我都不知道怎么讲了。
|
|
7楼#
发布于:2002-08-15 15:05
喝水,灌水,歇会儿。
|
|
8楼#
发布于:2002-08-15 15:45
我对fracker的敬仰犹如滔滔江水,绵绵不绝。。。。。
你说的pe格式可是这个? 要是的话大家参考一下吧。 :cool: |
|
|
9楼#
发布于:2002-08-15 16:31
老Mo找东西真得好牛啊!以后缺什么东西一定跟你要。
(小声说:“ndis.sys的源代码你帮我找找吧”) |
|
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 ); } |
|
11楼#
发布于:2002-08-15 16:49
到了这一步,剩下的就是怎么给fakefunc里面的局部变量poldfunc赋值了,很不幸,代码所在的内存写的时候会兰屏(有些高手能绕过去,可是我没学到),从前面的汇编代码知道,函数调用实际上就是call + 地址,那么如果我们自己申请一块内存,里面的内容就是fakefunc的所有指令,应该就能满足我们的要求!
|
|
12楼#
发布于:2002-08-15 16:51
这样一来就简单了,写一个fakefunc,反汇编之,然后把机器码找出。。。
最后在合适的位置上把poldfunc的地址填入。。。。 |
|
13楼#
发布于:2002-08-15 16:53
运用到noname 防火墙里面就是。。。。
反正只要经过N(N>100)次重起,他就工作啦。 |
|
14楼#
发布于:2002-08-15 17:29
就写这么多吧,写这个好累哦。
|
|
15楼#
发布于:2002-08-16 08:26
高!!!!!!
|
|
16楼#
发布于:2002-08-16 10:18
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?
|
|
|
17楼#
发布于:2002-08-16 15:41
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改? 不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API 但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。 |
|
18楼#
发布于:2002-10-25 11:30
不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API
但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。 [/quote] 可以发那个pe文件给我吗?楼上那个连接无效了。 daisyboy@sohu.com |
|
|
19楼#
发布于:2002-10-25 11:37
那得跟老mo要了,我也没有保存下来。
|
|
上一页
下一页