fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:3731回复: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
yjc
yjc
驱动小牛
驱动小牛
  • 注册日期2002-03-12
  • 最后登录2010-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-13 18:02
要看是标准调用、c调用还是pascal调用等等
sufeng
驱动牛犊
驱动牛犊
  • 注册日期2002-04-27
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-07 18:23
haha,跟函数的声明有关系。
fracker真是谦虚,全国人民都应该学习fracker这种伟大的精神。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-11-07 17:58
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] /* 用的是第二个参数吧?*/

我写文章的时候没有去看源程序啦,所以嘛这个顺序可能会记错的,你心真细啊。不过这个跟函数的声明有关系的。
sufeng
驱动牛犊
驱动牛犊
  • 注册日期2002-04-27
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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] /* 用的是第二个参数吧?*/
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2002-10-25 11:37
那得跟老mo要了,我也没有保存下来。
daisyboy
驱动小牛
驱动小牛
  • 注册日期2002-10-24
  • 最后登录2012-05-21
  • 粉丝3
  • 关注0
  • 积分599分
  • 威望140点
  • 贡献值1点
  • 好评度56点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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分
  • 社区居民
7楼#
发布于:2002-08-16 15:41
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?


不是说了吗?我的方法主要有两大难点,第一点是hook ndis的API
但这个问题只要你熟悉PE文件格式,很容易就搞定的啊,而且别人说得也很多了,所以我就几句话带过了。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-16 10:18
哎呀,是noname的?我都晕了,怎么觉得像passthru的阿,你的不是用PE方法吗,把ndis.sys的东东改了改?
我不仅要金子,我还要点石成金的手指!
zhangyj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-17
  • 最后登录2009-07-17
  • 粉丝0
  • 关注0
  • 积分103分
  • 威望50点
  • 贡献值1点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-16 08:26
高!!!!!!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2002-08-15 17:29
就写这么多吧,写这个好累哦。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2002-08-15 16:53
运用到noname 防火墙里面就是。。。。
反正只要经过N(N>100)次重起,他就工作啦。
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:49
到了这一步,剩下的就是怎么给fakefunc里面的局部变量poldfunc赋值了,很不幸,代码所在的内存写的时候会兰屏(有些高手能绕过去,可是我没学到),从前面的汇编代码知道,函数调用实际上就是call + 地址,那么如果我们自己申请一块内存,里面的内容就是fakefunc的所有指令,应该就能满足我们的要求!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
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 );
}


fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
15楼#
发布于:2002-08-15 16:31
老Mo找东西真得好牛啊!以后缺什么东西一定跟你要。
(小声说:“ndis.sys的源代码你帮我找找吧”)
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-08-15 15:45
我对fracker的敬仰犹如滔滔江水,绵绵不绝。。。。。

你说的pe格式可是这个?
要是的话大家参考一下吧。 :cool:
按第一贴的“给分”键,给分。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
17楼#
发布于:2002-08-15 15:05
喝水,灌水,歇会儿。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
18楼#
发布于:2002-08-15 15:04
我靠,讲到这段我都不知道怎么讲了。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
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
上一页
游客

返回顶部