免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2779 | 回复: 3
打印 上一主题 下一主题

OSPF嗅探程序, 校验码疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-08 21:53 |只看该作者 |倒序浏览
本人目前在用Java做OSPF嗅探程序,发现抓下来的包,校验和总是不对。(OSPF里用的校验算法是“Fletcher Checksum”), 按照算法自己写了个两个小程序,一个用c,一个用Java (见下面),都是用数组做测试, 结果仍然不对。
察看zebra/ospfd 里面的这段代码,发现里面的指针变量,指的地址早已经超出了原来的包的地址范围,也就是说 p 指针里面的东西,已经不是原来包的内容了!!

但是下面的ospf代码应该没有问题,这种情况下,想问问用Java该如何实现这种指针操作呢?或者更广泛地说,Java下,如果做这种校验呢?希望有经验的赐教一下。不胜感谢!


/* Fletcher Checksum -- Refer to RFC1008. */
#define MODX                 4102
#define LSA_CHECKSUM_OFFSET    15

u_int16_t
ospf_lsa_checksum (struct lsa_header *lsa)
{
  u_char *sp, *ep, *p, *q;
  int c0 = 0, c1 = 0;
  int x, y;
  u_int16_t length;

lsa->checksum = 0;
//Q1: ntohs 把网络16比特转化为主机值
// 这样,如果包的长度原来为30, 转换后,就变成了7680
  length = ntohs (lsa->length) - 2;
  sp = (char *) &lsa->options;

  for (ep = sp + length; sp < ep; sp = q)
    {
      q = sp + MODX;
      if (q > ep)
        q = ep;
      for (p = sp; p < q; p++)
        {
          c0 += *p;
                          // p 指针的内容,一旦超出了包的长   度,里面的内容,不就是随机的了么,怎么保证校验的正确呢?

          c1 += c0;
        }
      c0 %= 255;
      c1 %= 255;
    }

  x = ((length - LSA_CHECKSUM_OFFSET) * c0 - c1) % 255;
  if (x <= 0)
    x += 255;
  y = 510 - c0 - x;
  if (y > 255)
    y -= 255;

  /* take care endian issue. */
  lsa->checksum = htons ((x << + y);

  return (lsa->checksum);
}

public static long caculateChecksum_2(int[] content, int start, int len) // can be seen it is from c version.
        {
                /* Fletcher Checksum -- Refer to RFC1008. */
               
                int  MODX                 = 4102;
                int LSA_CHECKSUM_OFFSET   = 15;
               
               
          int sp, ep, p, q; // positions
          long c0 = 0, c1 = 0;
          long x, y;
          int length;

          long checksum = 0;
          //length = lsa.length() - 2;
          
          length = len -start ;
          
          
          //sp = LSAPacketFields.OPTIONS_POS;
          sp = start;
          

          for (ep = sp + length; sp < ep; sp = q)
            {
              q = sp + MODX;
              if (q > ep)
                q = ep;
              for (p = sp; p < q; p++)
                {
                  c0 += (content[p] & 0xff);
                  c1 += c0;
                }
              c0 %= 255;
              c1 %= 255;
            }

          x = ((length - LSA_CHECKSUM_OFFSET) * c0 - c1) % 255;
          if (x <= 0)
            x += 255;
          y = 510 - c0 - x;
          
          if (y > 255)
                  y -= 255;

          /* take care endian issue. */
          //checksum = htons ((x << + y);
          //checksum = (x <<  8 )  + y;
          checksum = (x<< 8 )  + y;

          return checksum;
        }

论坛徽章:
0
2 [报告]
发表于 2007-03-09 09:06 |只看该作者
java中没有指针的概念

[ 本帖最后由 jeffwang8001 于 2007-3-9 09:17 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-03-09 11:16 |只看该作者
另:ospf包好像直接用的是IP协议,不经过tcp或udp,不知lz怎么用java来嗅探ospf
用jpcap吗?

论坛徽章:
0
4 [报告]
发表于 2007-03-09 20:13 |只看该作者
对呀,java中没有指针的概念, 所以我才用数组啊。。。。

另外,我是用jpcap。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP