阅读:3731回复: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-11-13 18:02
要看是标准调用、c调用还是pascal调用等等
|
|
板凳#
发布于:2002-11-07 18:23
haha,跟函数的声明有关系。
fracker真是谦虚,全国人民都应该学习fracker这种伟大的精神。 |
|
地板#
发布于:2002-11-07 17:58
fracker,好像出错了。哈哈,不过都带有\"?\" 我写文章的时候没有去看源程序啦,所以嘛这个顺序可能会记错的,你心真细啊。不过这个跟函数的声明有关系的。 |
|
地下室#
发布于:2002-11-07 17:50
fracker,好像出错了。哈哈,不过都带有\"?\"
ebp+8是第一个参数,ebp+c是第二个参数. func (...) XXXXX:XXXXX push ebp XXXXX:XXXXX mov ebp, esp XXXXX:XXXXX mov eax, [ebp+0c] /* 用的是好像第一个参数吧? */ XXXXX:XXXXX mov eax, [ebp+08] /* 用的是第二个参数吧?*/ |
|
5楼#
发布于:2002-10-25 11:37
那得跟老mo要了,我也没有保存下来。
|
|
6楼#
发布于:2002-10-25 11:30
不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API
但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。 [/quote] 可以发那个pe文件给我吗?楼上那个连接无效了。 daisyboy@sohu.com |
|
|
7楼#
发布于:2002-08-16 15:41
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改? 不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API 但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。 |
|
8楼#
发布于:2002-08-16 10:18
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?
|
|
|
9楼#
发布于:2002-08-16 08:26
高!!!!!!
|
|
10楼#
发布于:2002-08-15 17:29
就写这么多吧,写这个好累哦。
|
|
11楼#
发布于:2002-08-15 16:53
运用到noname 防火墙里面就是。。。。
反正只要经过N(N>100)次重起,他就工作啦。 |
|
12楼#
发布于:2002-08-15 16:51
这样一来就简单了,写一个fakefunc,反汇编之,然后把机器码找出。。。
最后在合适的位置上把poldfunc的地址填入。。。。 |
|
13楼#
发布于:2002-08-15 16:49
到了这一步,剩下的就是怎么给fakefunc里面的局部变量poldfunc赋值了,很不幸,代码所在的内存写的时候会兰屏(有些高手能绕过去,可是我没学到),从前面的汇编代码知道,函数调用实际上就是call + 地址,那么如果我们自己申请一块内存,里面的内容就是fakefunc的所有指令,应该就能满足我们的要求!
|
|
14楼#
发布于: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 ); } |
|
15楼#
发布于:2002-08-15 16:31
老Mo找东西真得好牛啊!以后缺什么东西一定跟你要。
(小声说:“ndis.sys的源代码你帮我找找吧”) |
|
16楼#
发布于:2002-08-15 15:45
我对fracker的敬仰犹如滔滔江水,绵绵不绝。。。。。
你说的pe格式可是这个? 要是的话大家参考一下吧。 :cool: |
|
|
17楼#
发布于:2002-08-15 15:05
喝水,灌水,歇会儿。
|
|
18楼#
发布于:2002-08-15 15:04
我靠,讲到这段我都不知道怎么讲了。
|
|
19楼#
发布于: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 |
|
上一页
下一页