| 网站首页 | 硬件维修 | 应用学院 | 网络组建 | 网站制作 | 菜鸟黑客 | 编程之道 | 数码大全 | 娱乐休闲 | 软件下载 | 在线视频 | 请您留言 | 技术论坛 | 
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
  • 重装系统后必须做的10件大事

  • 网络安全基础 教你怎样关闭网…

  • 当心软件泄密 彻底清理应用软…

  • 怀疑PC安装木马?学学网络安…

  • 黑客又出手 全面解析新时代的…

  • 浅谈除不尽理还乱的Spyware间…

  • 网络安全之特洛伊木马攻防战…

  • 黑客攻击行为的特征分析及反…

  • 网络钓鱼揭秘:钓鱼者的三种…

  • “网络钓鱼”主要手法及防范

  • Q
    您现在的位置: 我是IT人 >> 菜鸟黑客 >> 黑客攻防 >> 文章正文
    网络协议分析软件的编写           
    网络协议分析软件的编写
    作者:网络 文章来源:转载 点击数: 更新时间:2006-1-20
    [ 字体:缩小 正常 放大 | 双击自动滚屏 ]
    请选择合适的字体颜色:

    前一阵子要写一个简单的arp协议的分析程序,在翻阅了一些资料以后,决定使用libpcap库来实现,但是后来涉及到写链路层数据的缘故(另外一个程序,这个程序就是发送一个假冒的arp request,在本文没有实现,今后有空再整理吧),所以放弃了libpcap。由于本人使用的是solaris环境,所以无法使用bpf,但是sun公司仍然为开发者提供了一个与设备底层无关的接口DLPI,DLPI的全称是Data Link Provider Interface,通过DLPI开发者可以访问数据链路层的数据包,在早期的sunos系统中基本上采用的是NIT设备,但是现在solaris系统都使用了DLPI.关于DLPI的具体介绍大家可以访问网站www.opengroup.org/pubs/catalog/c811.htm,我这里就不多说了。
    在搜索了许多资料之后发现目前关于DLPI的编程资料不多,没有具体的过程,后来翻阅了Neal Nuckolls写的一篇文章How to Use the STREAMS Data Link Provider Interface (DLPI),根据例子做了修改(主要是提供了协议分析的部分),现在把编写一个DLPI过程共享一下,希望能对大家有所帮助。建议大家可以先看看Neal Nuckolls的文章,其中有部分涉及到流编程的,可以参考http://docs.sun.com/app/docs/doc/816-4855的streams programming guide(不过这不是必须的)。
    使用DLPI来访问数据链路层有几个步骤:
    1、打开网络设备
    2、将一个流 attach到一个特定的设备上,这里就是我们刚才打开的设备
    3、将设备设置为混杂模式(可选)
    4、把数据链路层sap绑定到流
    5、调用ioctl,设置raw模式
    6、配置其他模块(可选)
    7、刷新缓存
    8、接收数据进入分析阶段
    第一步,我们首先打开一个网络设备,在本例中我们打开的是/dev/bge设备,这是本机的网络接口,注意不是/dev/bge0,通过open调用打开,并且返回一个描述符
    fd=open(device, 2)
    第二步,attach一个流到设备上,这是通过发送DL_ATTACH_REQ原语来完成的
    dlattachreq(fd, ppa)
    int fd;
    u_long ppa;
    {
    dl_attach_req_t attach_req;
    struct strbuf ctl;
    int flags;

    attach_req.dl_primitive = DL_ATTACH_REQ;
    attach_req.dl_ppa = ppa;

    ctl.maxlen = 0;
    ctl.len = sizeof (attach_req);
    ctl.buf = (char *) &attach_req;

    flags = 0;

    if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
    syserr("dlattachreq:  putmsg");
    }
    dl_attach_req_t是一个定义在dlpi.h中的结构体,我们通过填写结构体来发布原语,putmsg将消息发送到一个流,以上这个函数是DLPI中发布原语的主要格式
    发布了DL_ATTACH_REQ原语之后,还要确认是否成功,
    dlokack(fd, bufp)
    int fd;
    char *bufp;
    {
    union DL_primitives *dlp;
    struct strbuf ctl;
    int flags;

    ctl.maxlen = MAXDLBUF;
    ctl.len = 0;
    ctl.buf = bufp;

    strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");

    dlp = (union DL_primitives *) ctl.buf;

    expecting(DL_OK_ACK, dlp);

    if (ctl.len < sizeof (dl_ok_ack_t))
    err("dlokack:  response ctl.len too short:  %d", ctl.len);

    [1] [2] [3] [4] [5] [6] 下一页  

    文章录入:54iter    责任编辑:54iter 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 关于我们 | 友情链接 | 版权申明 |