null__吧 关注:220贴子:4,305

菜鸟编程8之snmp探测工具的实现

只看楼主收藏回复



1楼2011-04-18 17:23回复
    度娘,你老就放过我吧。让我好好发帖,行不?我发个帖容易嘛我!!!


    2楼2011-04-18 17:24
    回复
      关于snmp的一些简介
      snmp(Simple Network Management Protocol:简单网络管理协议)
      简单网络管理协议(SNMP)是一种应用层协议, 便于在网络设备间交换管理信息. 它是TCP/IP协议簇的一部分. 网络管理员使用SNMP管理网络性能, 发现和解决网络故障, 并计划网络增长。它是一个标准的用于管理IP网络上结点的协议。此协议包括了监视和控制变量集以及用于监视设备的两个数据格式:SMI和MIB。
      MIB,Management Information Base:管理信息库
      由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。
      SMI,Structure of Management Information:管理信息结构
      用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。
      使用SNMP进行网络管理需要下面几个重要部分:管理基站,管理代理,管理信息库和网络管理工具。管理基站通常是一个独立的设备,它用作网络管理者进行网络管理的用户接口。基站上必须装备有管理软件,管理员可以使用的用户接口和从MIB取得信息的数据库,同时为了进行网络管理它应该具备将管理命令发出基站的能力。
      


      3楼2011-04-18 17:28
      回复
        如果一台服务器提供SNMP服务,那么假若配置不当的话就很容易泄漏服务器的重要信息。
        以2000为例,一旦安装并启动了SNMP管理协议,系统将打开
        UDP 161 snmp
        UDP 162 snmptrap
        两个端口,另外,系统支持初始的“查询密码”community strings 为:public。利用这个默认的查询密码,我们可以得到以下等信息:
         系统进程
         系统用户
         系统信息
         已安装的软件
        另外,通过其它的oid(就是物件识别代码Object Identifier,可以把oid理解成MIB管理信息库中各种信息分类存放树资源的一个数字标识。)可以获取更多的目标服务器的信息。
        


        4楼2011-04-18 17:29
        回复
          测试环境:
          snmp agent:xpsp3(安装管理与监视工具之后,打开udp 161端口)
          工具测试:xpsp3


          5楼2011-04-18 17:32
          回复
                     // 取得IP地址
                     //agent = (LPSTR)SNMP_malloc(strlen(*argv) + 1);
                 //     strcpy(agent, argv[1]);
                     agent=argv[1];    
                     community="public";//设置查询密码
                   
                     variableBindings.list = NULL;
                     variableBindings.len = 0;
                     // 设置 oid
                     if(!strcmp(argv[2],"sysprocess"))i=0;
                     else if(!strcmp(argv[2],"sysuser"))i=1;
                     else if(!strcmp(argv[2],"domainname"))i=2;
                     else if(!strcmp(argv[2],"software"))i=3;
                     else if(!strcmp(argv[2],"sysinf"))i=4;
                     else{
                         usage(argv[0]);
                         return 0;
                         }
                     printf("%s\n",SnmpOid[i]);
                        
                         // 把字符串转换成标准oid
                     if (!SnmpMgrStrToOid(SnmpOid[i], &reqObject))
                        {
                          printf("Error: Invalid oid, %s, specified.\n", *argv);
                         return 1;
                        }
                     else
                        {
                          variableBindings.len++;//结点长度加1
                          if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc(
                                variableBindings.list, sizeof(RFC1157VarBind) *
                                variableBindings.len)) == NULL)
                            {
                              printf("Error: Error allocating oid, %s.\n",*argv);
            


            7楼2011-04-18 17:34
            回复
                                return 1;
                              }
                            variableBindings.list[variableBindings.len - 1].name=reqObject;
                            variableBindings.list[variableBindings.len - 1].value.asnType=ASN_NULL;
                           }
                  // Make sure only one variable binding was specified if operation is WALK.
                       if (operation == WALK && variableBindings.len != 1)
                          {
                           printf("Error: Multiple oids specified for WALK.\n");
                           return 1;
                          }
                       // Establish a SNMP session to communicate with the remote agent.   The
                       // community, communications timeout, and communications retry count
                       // for the session are also required.
                       if ((session = SnmpMgrOpen(agent, community, timeout, retries)) == NULL)
                          {
                            printf("error on SnmpMgrOpen %d\n", GetLastError());
                         return 1;
                         }
                  } // end if
                 
                   AsnObjectIdentifier root;
                   AsnObjectIdentifier tempOid;
                   SnmpUtilOidCpy(&root, &variableBindings.list[0].name);
                   requestType = ASN_RFC1157_GETNEXTREQUEST;
                   for(;;)//循环打出结果
                     {
                       if (!SnmpMgrRequest(session, requestType, &variableBindings,
                                               &errorStatus, &errorIndex))//向代理请求失败
                       {
                           printf("error on SnmpMgrRequest %d\n", GetLastError());
                           break;
                       }
              


              8楼2011-04-18 17:34
              回复
                         else//请求成功
                         {
                                
                             if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME ||
                                  SnmpUtilOidNCmp(&variableBindings.list[0].name,
                                                  &root, root.idLength))
                                {
                                  printf("End of MIB subtree.\n\n");
                                  break;
                                }
                             if (errorStatus > 0)
                                 {
                                  printf("Error: errorStatus=%d, errorIndex=%d \n", errorStatus, errorIndex);
                                  break;
                                 }
                             else
                                 {
                                // 打印查询的结果
                                  char *string = NULL;
                                  SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
                                  printf("Variable = %s\n", string);
                                  if (string) SNMP_free(string);
                                  printf("Value     = ");
                                  SnmpUtilPrintAsnAny(&variableBindings.list[0].value);
                                  printf("\n");
                                 }
                         } // end if()
                             // 准备下一次查询
                         SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name);
                         SnmpUtilVarBindFree(&variableBindings.list[0]);
                         SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid);
                         variableBindings.list[0].value.asnType = ASN_NULL;
                         SnmpUtilOidFree(&tempOid);
                     } // end for()
                    // 释放资源
                    SnmpUtilVarBindListFree(&variableBindings);
                    SnmpUtilOidFree(&root);
                    // 关闭 SNMP session
                    if (!SnmpMgrClose(session))//清理退出
                     {
                      printf("error on SnmpMgrClose %d\n", GetLastError());
                      return 1;
                     }
                     return 0;
                } 


                9楼2011-04-18 17:34
                回复
                  测试结果:
                  图片打出两行snmpoid,是因为调试的时候加的,请忽略。代码默认只输出一次。
                  目标主机用户:



                  10楼2011-04-18 17:36
                  回复
                    系统信息:



                    11楼2011-04-18 17:38
                    回复
                      目标主机安装的软件:



                      12楼2011-04-18 17:39
                      回复
                        目标主机进程:



                        13楼2011-04-18 17:40
                        回复
                          ============================完
                          度娘我爱你,你真给力!!!!!!


                          15楼2011-04-18 17:41
                          回复
                            \(=口=)/
                            还在数据链路层混的表示压力= =


                            IP属地:陕西16楼2011-04-18 19:25
                            回复
                              回复:16楼
                              一层都没了解的路过。。。


                              IP属地:河南17楼2011-04-18 21:26
                              回复