wondest
驱动牛犊
驱动牛犊
  • 注册日期2001-09-11
  • 最后登录2002-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3969回复:6

如何勾Windows NT的IP协议栈?

楼主#
更多 发布于:2001-09-11 21:45


   我试图在Windows NT的NDIS层实现串接式截包,不打算用IM driver,而是想用NDIS Hooking技术。但是,Winsdows NT在这方面并没有文档化的接口。

   我打算采用的办法是勾TCP/IP driver的 NDIS_PROTOCOL_CHARACTERISTICS 类型结构变量指针,这是由NdisRegisterProtocol函数进行登记的。

   现在的问题是:如何获得NDIS_PROTOCOL_CHARACTERISTICS 类型结构变量在内存中的实际地址(或偏移量)?我将tcpip.dbg装入SOFTICE,试图找到相关的地址(如_ArpHandle),通过相关地址获得NDIS_PROTOCOL_CHARACTERISTICS变量地址,但未能成功。原因是:
    1)相关地址(_ArpHandle)的获得可能不正确,请问如何正确获得_ArpHandle的偏移地址(相对于TCP/IP driver的起始地址)?
    2)针对相同的SP,不同站点下载的tcpip.dbg,获得的偏移地址可能不一样,请问这是为什么?

    另外,有没有更好的办法勾Windows NT的IP协议栈?如果不采用tcpip.dbg,有没有更好的办法获得所要的Hook地址?

    如能提供一些信息或启示,将不胜感激!

  


    

最新喜欢:

xiangshifuxiangs... skylglskylgl
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2001-09-11 23:03
非常有创意,虽然这并非是一个截包得好方法,但是这种思路
可以用于所有的syshook。

其实我建议你hook ndis的输出函数,对于这个应用来说,要
hook的就是ndisregisterprotocol。这样一来,需要做两件事情,
1、找到这个函数的入口
2、保留这个入口,用自己的函数覆盖原有入口地址。

对于kernel driver来说,所有的地址都是共享的,你的driver
和ndis.sys在同一个地址,因此不存在地址切换的问题。

如何找到ndisregisterprotocol的地址呢?
ndis.sys是一个kernel dll,符合pe文件格式,因此
要找到这个地址非常简单,甚至可以用dumpbin看这个地址,
这样,需要知道的就是ndis.sys加载的位置,对于一个
kernel driver的加载次序,你可以通过getsysmteminformation
获得,具体用法可以参考native api的附录及第一章。
实际上,据我的经验,似乎ndis.sys每次加载的位置固定。

然后还剩下一个问题,何时是hook的好时机呢?就是说,
什么时候覆盖原有地址,改写成自己的函数入口地址呢?
什么时候做不会漏掉这次调用,也不会不安全呢?

首先,当然,必须保证hook driver在ndis之前加载,如果
只想hook tcp的话,可以在tcp之前加载。让我们来看一看
整个网络模块加载的过程。首先是ndis.sys被加载,然后
是协议driver被加载,协议driver负责加载网卡miniport
driver。
最好的做法当然是在加载tcp.sys之前就修改了ndis.sys
的输出函数入口,这需要找到ndis在内存的位置,然后
定位到这个地址。这个相对位置是固定的,在ndis.lib
里面说明。
或者在加载tcp的时候修改tcp.sys的这个函数的输入表,
这个时机似乎就更加难以把握,我不知道应该怎么办,
nt使用zwloaddriver加载driver,但是不知道tcp.sys
是否也是这么加载。具体的过程如何,我还不太清楚。

总之,这是一个值得花一些时间去探索的领域,一句话,
所有irp皆可filter,一切syscall皆可hook。
不再回忆从前,我已经生活在幸福当中。
m_lam12
驱动牛犊
驱动牛犊
  • 注册日期2001-07-19
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-12 15:22
有相关的函数吗?在winme 98下,我实现了用hook_device_service。
在2000nt 下,有吗?能给于提示吗?
我对他很赶兴趣???

李安明
bible
驱动牛犊
驱动牛犊
  • 注册日期2001-09-03
  • 最后登录2009-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-12 17:42
在那里下download tcpip.dbg 和checked tcpip.sys ?
如何使用tcpip.dbg ? 是否必须用checked tcpip.sys?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2001-09-12 18:43
9x的vxd都不是pe文件格式,都可以用hook_device_sevice,
我提供的vpn source for 9x就是用这个方法。
对于nt来说,不存在这个系统调用,但是可以用hook api
的方法来解决,不同的是,是hook kernel api。
不再回忆从前,我已经生活在幸福当中。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2001-09-12 18:44
最简单的办法是买一套msdn,安装chkbuild。
开发driver,有一套msdn是非常有必要的。
不再回忆从前,我已经生活在幸福当中。
bible
驱动牛犊
驱动牛犊
  • 注册日期2001-09-03
  • 最后登录2009-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-09-13 09:49
版主有时间看小弟的"如何在passthru构造自己的IP包和Indicate?"
先谢了.
游客

返回顶部