home *** CD-ROM | disk | FTP | other *** search
/ Steganos Hacker Tools / SHT151.iso / programme / scanner / nmapNTsp1 / Win_2000.exe / nmapNT-src / nmapNT / snmphlpr.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-25  |  13.2 KB  |  539 lines

  1. #include <winclude.h>
  2.  
  3.  
  4. BOOL OpenMib(char *Name,LOCAL_MIB_ACCESS *Mib)
  5. {
  6.   Mib->m_hInst = LoadLibrary( Name );
  7.   if(Mib->m_hInst < (HINSTANCE) HINSTANCE_ERROR){
  8.     return FALSE;
  9.   }
  10.  
  11.   Mib->m_Init=(pSnmpExtensionInit)GetProcAddress(Mib->m_hInst ,"SnmpExtensionInit");
  12.   if(Mib->m_Init==NULL){
  13.     CloseMib( Mib );
  14.     return FALSE;
  15.   }
  16.  
  17.   Mib->m_InitEx=(pSnmpExtensionInitEx)GetProcAddress(Mib->m_hInst ,"SnmpExtensionInitEx");
  18.   if(Mib->m_InitEx==NULL){
  19.     CloseMib( Mib );
  20.     return FALSE;
  21.   }
  22.  
  23.   Mib->m_Query=(pSnmpExtensionQuery)GetProcAddress(Mib->m_hInst ,"SnmpExtensionQuery");
  24.   if(Mib->m_Query==NULL){
  25.     CloseMib( Mib );
  26.     return FALSE;
  27.   }
  28.  
  29.   Mib->m_Trap=(pSnmpExtensionTrap)GetProcAddress(Mib->m_hInst ,"SnmpExtensionTrap");
  30.   if(Mib->m_Trap==NULL){
  31.     CloseMib( Mib );
  32.     return FALSE;
  33.   }
  34.  
  35.   return TRUE;
  36. }
  37.  
  38. void CloseMib(LOCAL_MIB_ACCESS *Mib)
  39. {
  40.   FreeLibrary( Mib->m_hInst );
  41. }
  42.  
  43.  
  44. SNMPAPI
  45. SNMP_FUNC_TYPE
  46. SnmpUtilOidCpy(
  47.     OUT AsnObjectIdentifier *DstObjId,
  48.     IN  AsnObjectIdentifier *SrcObjId
  49.     )
  50. {
  51.   DstObjId->ids = (UINT *)GlobalAlloc(GMEM_ZEROINIT,SrcObjId->idLength*sizeof(UINT));
  52.   if(!DstObjId->ids){
  53.     SetLastError(1);
  54.     return 0;
  55.   }
  56.  
  57.   memcpy(DstObjId->ids,SrcObjId->ids,SrcObjId->idLength*sizeof(UINT));
  58.   DstObjId->idLength = SrcObjId->idLength;
  59.  
  60.   return 1;
  61. }
  62.  
  63. VOID
  64. SNMP_FUNC_TYPE
  65. SnmpUtilOidFree(
  66.     IN OUT AsnObjectIdentifier *ObjId
  67.     )
  68. {
  69.   GlobalFree(ObjId->ids);
  70.   ObjId->ids = 0;
  71.   ObjId->idLength = 0;
  72. }
  73.  
  74. SNMPAPI
  75. SNMP_FUNC_TYPE
  76. SnmpUtilOidNCmp(
  77.     IN AsnObjectIdentifier *ObjIdA,
  78.     IN AsnObjectIdentifier *ObjIdB,
  79.     IN UINT                 Len
  80.     )
  81. {
  82.   UINT CmpLen;
  83.   UINT i;
  84.   int  res;
  85.  
  86.   CmpLen = Len;
  87.   if(ObjIdA->idLength < CmpLen)
  88.     CmpLen = ObjIdA->idLength;
  89.   if(ObjIdB->idLength < CmpLen)
  90.     CmpLen = ObjIdB->idLength;
  91.  
  92.   for(i=0;i<CmpLen;i++){
  93.     res = ObjIdA->ids[i] - ObjIdB->ids[i];
  94.     if(res!=0)
  95.       return res;
  96.   }
  97.   return 0;
  98. }
  99.  
  100. VOID
  101. SNMP_FUNC_TYPE
  102. SnmpUtilVarBindFree(
  103.     IN OUT RFC1157VarBind *VarBind
  104.     )
  105. {
  106.   BYTE asnType;
  107.   // free object name
  108.   SnmpUtilOidFree(&VarBind->name);
  109.  
  110.   asnType = VarBind->value.asnType;
  111.  
  112.   if(asnType==ASN_OBJECTIDENTIFIER){
  113.     SnmpUtilOidFree(&VarBind->value.asnValue.object);
  114.   }
  115.   else if(
  116.         (asnType==ASN_OCTETSTRING) ||
  117.         (asnType==ASN_RFC1155_IPADDRESS) ||
  118.         (asnType==ASN_RFC1155_OPAQUE) ||
  119.         (asnType==ASN_SEQUENCE)){
  120.     if(VarBind->value.asnValue.string.dynamic){
  121.       GlobalFree(VarBind->value.asnValue.string.stream);
  122.     }
  123.   }
  124.  
  125.   VarBind->value.asnType = ASN_NULL;
  126.  
  127. }
  128.  
  129. int FillIfList(struct _IFlist *iflist, int *icount)
  130. {
  131.   LOCAL_MIB_ACCESS Mib;
  132.   BOOL ret;
  133.   DWORD dwTimeZeroReference;
  134.   HANDLE PollForTrapEvent;
  135.   AsnObjectIdentifier SupportedView[32];
  136.   int                 SupportedViewCount;
  137.   RFC1157VarBindList  *varBindList;
  138.   RFC1157VarBind      varBind[4];
  139.   AsnInteger          errorStatus;
  140.   AsnInteger          errorIndex;
  141.   RFC1157VarBindList  BindList;
  142.  
  143.   AsnObjectIdentifier MIB_NULL = {0,0};
  144.   int    i;    
  145.   BOOL Exit;
  146.  
  147.     /*interface count*/  
  148.   UINT OID_icount[] = {1,3,6,1,2,1,2,1};
  149.   AsnObjectIdentifier MIB_icount= { OID_SIZEOF(OID_icount), OID_icount};
  150.  
  151.  
  152.     /*interface info*/
  153.   UINT OID_interfaceid[] = {1,3,6,1,2,1,2,2,1,1};
  154.   AsnObjectIdentifier MIB_interfaceid= { OID_SIZEOF(OID_interfaceid), OID_interfaceid};
  155.  
  156.   UINT OID_interfacedesc[] = {1,3,6,1,2,1,2,2,1,2};
  157.   AsnObjectIdentifier MIB_interfacedesc= { OID_SIZEOF(OID_interfacedesc), OID_interfacedesc};
  158.  
  159.   UINT OID_interfacetype[] = {1,3,6,1,2,1,2,2,1,3};
  160.   AsnObjectIdentifier MIB_interfacetype= { OID_SIZEOF(OID_interfacetype), OID_interfacetype};
  161.  
  162.   UINT OID_interfaceaddr[] = {1,3,6,1,2,1,2,2,1,6};
  163.   AsnObjectIdentifier MIB_interfaceaddr= { OID_SIZEOF(OID_interfaceaddr), OID_interfaceaddr};
  164.  
  165.  
  166.   varBindList = &BindList;
  167.  
  168.   ret = OpenMib("inetmib1.dll",&Mib);
  169.   if(!ret){
  170.     printf("\nCan't find INETMIB1.DLL");
  171.     return -1;
  172.   }
  173.  
  174.    dwTimeZeroReference = GetTickCount();
  175.   SupportedView[0] = MIB_NULL;
  176.  
  177.   SupportedViewCount = 0;
  178.  
  179.   dwTimeZeroReference = 0;
  180.   ret = Mib.m_Init(dwTimeZeroReference,&PollForTrapEvent,&SupportedView[0]);
  181.   SupportedViewCount = 1;
  182.  
  183.   if(!ret){
  184.     printf("\nInit Fail");
  185.     return -1;
  186.   }
  187.  
  188.    varBindList->list = varBind;
  189.   varBindList->len  = 1;
  190.   varBind[0].name  = MIB_NULL;
  191.     SNMP_oidcpy(&varBind[0].name,&MIB_icount);
  192.  
  193.     ret = Mib.m_Query(ASN_RFC1157_GETNEXTREQUEST,varBindList,&errorStatus,&errorIndex);
  194.     if(ret)
  195.     {
  196.       ret = SNMP_oidncmp(&varBind[0].name,&MIB_icount,MIB_icount.idLength);
  197.      if(!ret)
  198.      {  
  199.          *icount = varBind[0].value.asnValue.number;
  200.       }
  201.  
  202.     }
  203.  
  204.   SNMP_FreeVarBind(&varBind[0]);
  205.  
  206.   
  207.   
  208.   varBindList->list = varBind;
  209.   varBindList->len  = 4;
  210.   varBind[0].name  = MIB_NULL;
  211.   varBind[1].name  = MIB_NULL;
  212.   varBind[2].name  = MIB_NULL;
  213.   varBind[3].name  = MIB_NULL;
  214.  
  215.   SNMP_oidcpy(&varBind[0].name,&MIB_interfaceid);
  216.   SNMP_oidcpy(&varBind[1].name,&MIB_interfacedesc);
  217.   SNMP_oidcpy(&varBind[2].name,&MIB_interfacetype);
  218.   SNMP_oidcpy(&varBind[3].name,&MIB_interfaceaddr);
  219.     
  220.   Exit = FALSE;
  221.   i = 0;
  222.   while(!Exit)
  223.   {
  224.     memset(&iflist[i],0,sizeof(struct _IFlist));
  225.     ret = Mib.m_Query(ASN_RFC1157_GETNEXTREQUEST,varBindList,&errorStatus,&errorIndex);
  226.     if(!ret) Exit=TRUE;
  227.     else
  228.     {
  229.       ret = SNMP_oidncmp(&varBind[0].name,&MIB_interfaceid,MIB_interfaceid.idLength);    
  230.       if(ret!=0)
  231.       {
  232.         Exit=TRUE;
  233.       }
  234.       else
  235.       {
  236.         
  237.         iflist[i].id = varBind[0].value.asnValue.number;
  238.       }
  239.       ret = SNMP_oidncmp(&varBind[1].name,&MIB_interfacedesc,MIB_interfacedesc.idLength);    
  240.       if(ret!=0)
  241.       {
  242.         Exit=TRUE;
  243.       }
  244.       else
  245.       {
  246.         strncpy(iflist[i].desc,varBind[1].value.asnValue.address.stream,512);
  247.       }
  248.       ret = SNMP_oidncmp(&varBind[2].name,&MIB_interfacetype,MIB_interfacetype.idLength);    
  249.       if(ret!=0)
  250.       {
  251.         Exit=TRUE;
  252.       }
  253.       else
  254.       {
  255.         iflist[i].type = varBind[2].value.asnValue.number;
  256.       }
  257.       ret = SNMP_oidncmp(&varBind[3].name,&MIB_interfaceaddr,MIB_interfaceaddr.idLength);    
  258.       if(ret!=0)
  259.       {
  260.         Exit=TRUE;
  261.       }
  262.       else
  263.       {
  264.         if (varBind[3].value.asnValue.address.stream != NULL)
  265.         {
  266.             if ((varBind[3].value.asnValue.address.stream[0] == 0x44)
  267.                 && (varBind[3].value.asnValue.address.stream[1] == 0x45)
  268.                 && (varBind[3].value.asnValue.address.stream[2] == 0x53)
  269.                 && (varBind[3].value.asnValue.address.stream[3] == 0x54)
  270.                 && (varBind[3].value.asnValue.address.stream[4] == 0x00)) 
  271.             {
  272.                 
  273.                 iflist[i].MAC[0] = 0x44;
  274.                 iflist[i].MAC[1] = 0x55;
  275.                 iflist[i].MAC[2] = 0x4E;
  276.                 //strcpy(iflist[i].MAC,"DUN");
  277.                 //printf("Interface #%i is a DUN adapter\n", j);
  278.                 continue;
  279.             }
  280.             if ((varBind[3].value.asnValue.address.stream[0] == 0x00)
  281.                 && (varBind[3].value.asnValue.address.stream[1] == 0x00)
  282.                 && (varBind[3].value.asnValue.address.stream[2] == 0x00)
  283.                 && (varBind[3].value.asnValue.address.stream[3] == 0x00)
  284.                 && (varBind[3].value.asnValue.address.stream[4] == 0x00)
  285.                 && (varBind[3].value.asnValue.address.stream[5] == 0x00)) 
  286.             {
  287.                 memset(iflist[i].MAC,0,6);
  288.                 //printf("Interface #%i is a NULL address\n", j);
  289.                 continue;
  290.             }
  291.     
  292.             iflist[i].MAC[0] = varBind[3].value.asnValue.address.stream[0];
  293.             iflist[i].MAC[1] = varBind[3].value.asnValue.address.stream[1];
  294.             iflist[i].MAC[2] = varBind[3].value.asnValue.address.stream[2];
  295.             iflist[i].MAC[3] = varBind[3].value.asnValue.address.stream[3];
  296.             iflist[i].MAC[4] = varBind[3].value.asnValue.address.stream[4];
  297.             iflist[i].MAC[5] = varBind[3].value.asnValue.address.stream[5];
  298.             //memcpy(iflist[i].MAC,varBind[3].value.asnValue.address.stream,6);
  299.           }
  300.       }
  301.         i++;
  302.       //}
  303.     }
  304.   }
  305.  
  306.   SNMP_FreeVarBind(&varBind[0]);
  307.   SNMP_FreeVarBind(&varBind[1]);
  308.   SNMP_FreeVarBind(&varBind[2]);
  309.   SNMP_FreeVarBind(&varBind[3]);
  310.  
  311.   
  312.  
  313.     return 0;
  314. }
  315.  
  316.  
  317. int FillIpList(struct _IPlist *iplist)
  318. {
  319.   LOCAL_MIB_ACCESS Mib;
  320.   BOOL ret;
  321.   DWORD dwTimeZeroReference;
  322.   HANDLE PollForTrapEvent;
  323.   AsnObjectIdentifier SupportedView[32];
  324.   int                 SupportedViewCount;
  325.   RFC1157VarBindList  *varBindList;
  326.   RFC1157VarBind      varBind[2];
  327.   AsnInteger          errorStatus;
  328.   AsnInteger          errorIndex;
  329.   RFC1157VarBindList  BindList;
  330.   BOOL Exit;
  331.   AsnObjectIdentifier MIB_NULL = {0,0};
  332.   int i;
  333.   
  334.   /*ip address information*/
  335.  
  336.   UINT OID_ipaddr[] = {1,3,6,1,2,1,4,20,1,1 };
  337.   AsnObjectIdentifier MIB_ipaddr= { OID_SIZEOF(OID_ipaddr), OID_ipaddr};
  338.  
  339.   UINT OID_ipid[] = {1,3,6,1,2,1,4,20,1,2};
  340.   AsnObjectIdentifier MIB_ipid= { OID_SIZEOF(OID_ipid), OID_ipid};
  341.  
  342.  
  343.   varBindList = &BindList;
  344.  
  345.   ret = OpenMib("inetmib1.dll",&Mib);
  346.   if(!ret){
  347.     printf("\nCan't find INETMIB1.DLL");
  348.     return -1;
  349.   }
  350.  
  351.    dwTimeZeroReference = GetTickCount();
  352.   SupportedView[0] = MIB_NULL;
  353.  
  354.   SupportedViewCount = 0;
  355.  
  356.   dwTimeZeroReference = 0;
  357.   ret = Mib.m_Init(dwTimeZeroReference,&PollForTrapEvent,&SupportedView[0]);
  358.   SupportedViewCount = 1;
  359.  
  360.   if(!ret){
  361.     printf("\nInit Fail");
  362.     return -1;
  363.   }
  364.   varBindList->list = varBind;
  365.   varBindList->len  = 2;
  366.   varBind[0].name  = MIB_NULL;
  367.   varBind[1].name  = MIB_NULL;
  368.  
  369.   SNMP_oidcpy(&varBind[0].name,&MIB_ipid);
  370.   SNMP_oidcpy(&varBind[1].name,&MIB_ipaddr);
  371.     
  372.   Exit = FALSE;
  373.   i = 0;
  374.   while(!Exit)
  375.   {
  376.     memset(&iplist[i],0,sizeof(struct _IPlist));
  377.     ret = Mib.m_Query(ASN_RFC1157_GETNEXTREQUEST,varBindList,&errorStatus,&errorIndex);
  378.     if(!ret) Exit=TRUE;
  379.     else
  380.     {
  381.       ret = SNMP_oidncmp(&varBind[0].name,&MIB_ipid,MIB_ipid.idLength);    
  382.       if(ret!=0)
  383.       {
  384.         Exit=TRUE;
  385.       }
  386.       else
  387.       {
  388.         
  389.         iplist[i].id = varBind[0].value.asnValue.number;
  390.       }
  391.       ret = SNMP_oidncmp(&varBind[1].name,&MIB_ipaddr,MIB_ipaddr.idLength);    
  392.       if(ret!=0)
  393.       {
  394.         Exit=TRUE;
  395.       }
  396.       else
  397.       {
  398.         memcpy(&iplist[i].ip,varBind[1].value.asnValue.address.stream,4);
  399.       }
  400.         i++;
  401.       //}
  402.     }
  403.   }
  404.  
  405.   SNMP_FreeVarBind(&varBind[0]);
  406.   SNMP_FreeVarBind(&varBind[1]);
  407.  
  408.   
  409.     return 0;
  410. }
  411.  
  412.  
  413.  
  414. int FillRouteList(struct myroute *routelist)
  415. {
  416.   LOCAL_MIB_ACCESS Mib;
  417.   BOOL ret;
  418.   DWORD dwTimeZeroReference;
  419.   HANDLE PollForTrapEvent;
  420.   AsnObjectIdentifier SupportedView[32];
  421.   int                 SupportedViewCount;
  422.   RFC1157VarBindList  *varBindList;
  423.   RFC1157VarBind      varBind[4];
  424.   AsnInteger          errorStatus;
  425.   AsnInteger          errorIndex;
  426.   RFC1157VarBindList  BindList;
  427.  
  428.   AsnObjectIdentifier MIB_NULL = {0,0};
  429.   int    i;    
  430.   BOOL Exit;
  431.  
  432.  
  433.     /*interface info*/
  434.   UINT OID_routeid[] = {1,3,6,1,2,1,4,21,1,2 };
  435.   AsnObjectIdentifier MIB_routeid= { OID_SIZEOF(OID_routeid), OID_routeid};
  436.  
  437.   UINT OID_routedest[] = {1,3,6,1,2,1,4,21,1,1};
  438.   AsnObjectIdentifier MIB_routedest= { OID_SIZEOF(OID_routedest), OID_routedest};
  439.  
  440.   UINT OID_routemask[] = {1,3,6,1,2,1,4,21,1,11};
  441.   AsnObjectIdentifier MIB_routemask= { OID_SIZEOF(OID_routemask), OID_routemask};
  442.    UINT OID_routenexthop[] = {1,3,6,1,2,1,4,21,1,7};
  443.   AsnObjectIdentifier MIB_routenexthop= { OID_SIZEOF(OID_routenexthop), OID_routenexthop};
  444.  
  445.  
  446.  
  447.  
  448.   varBindList = &BindList;
  449.  
  450.   ret = OpenMib("inetmib1.dll",&Mib);
  451.   if(!ret){
  452.     printf("\nCan't find INETMIB1.DLL");
  453.     return -1;
  454.   }
  455.  
  456.    dwTimeZeroReference = GetTickCount();
  457.   SupportedView[0] = MIB_NULL;
  458.  
  459.   SupportedViewCount = 0;
  460.  
  461.   dwTimeZeroReference = 0;
  462.   ret = Mib.m_Init(dwTimeZeroReference,&PollForTrapEvent,&SupportedView[0]);
  463.   SupportedViewCount = 1;
  464.  
  465.   if(!ret){
  466.     printf("\nInit Fail");
  467.     return -1;
  468.   }
  469.   varBindList->list = varBind;
  470.   varBindList->len  = 4;
  471.   varBind[0].name  = MIB_NULL;
  472.   varBind[1].name  = MIB_NULL;
  473.   varBind[2].name  = MIB_NULL;
  474.   varBind[3].name  = MIB_NULL;
  475.   
  476.  
  477.   SNMP_oidcpy(&varBind[0].name,&MIB_routeid);
  478.   SNMP_oidcpy(&varBind[1].name,&MIB_routedest);
  479.   SNMP_oidcpy(&varBind[2].name,&MIB_routemask);
  480.   SNMP_oidcpy(&varBind[3].name,&MIB_routenexthop);
  481.  
  482.     
  483.   Exit = FALSE;
  484.   i = 0;
  485.   while(!Exit)
  486.   {
  487.     memset(&routelist[i],0,sizeof(struct myroute));
  488.     ret = Mib.m_Query(ASN_RFC1157_GETNEXTREQUEST,varBindList,&errorStatus,&errorIndex);
  489.     if(!ret) Exit=TRUE;
  490.     else
  491.     {
  492.       ret = SNMP_oidncmp(&varBind[0].name,&MIB_routeid,MIB_routeid.idLength);    
  493.       if(ret!=0)
  494.       {
  495.         Exit=TRUE;
  496.       }
  497.       else
  498.       {
  499.         
  500.         routelist[i].ifid = varBind[0].value.asnValue.number;
  501.       }
  502.       ret = SNMP_oidncmp(&varBind[1].name,&MIB_routedest,MIB_routedest.idLength);    
  503.       if(ret!=0)
  504.       {
  505.         Exit=TRUE;
  506.       }
  507.       else
  508.       {
  509.           memcpy(&routelist[i].dest,varBind[1].value.asnValue.address.stream,4);
  510.         //strncpy(arlist[i].desc,varBind[1].value.asnValue.address.stream,512);
  511.       }
  512.       ret = SNMP_oidncmp(&varBind[2].name,&MIB_routemask,MIB_routemask.idLength);    
  513.       if(ret!=0)
  514.       {
  515.         Exit=TRUE;
  516.       }
  517.       else
  518.       {
  519.         memcpy(&routelist[i].mask,varBind[2].value.asnValue.address.stream,4);
  520.       }
  521.       ret = SNMP_oidncmp(&varBind[3].name,&MIB_routenexthop,MIB_routenexthop.idLength);    
  522.       if(ret!=0)
  523.       {
  524.         Exit=TRUE;
  525.       }
  526.       else
  527.       {
  528.         memcpy(&routelist[i].nexthop,varBind[3].value.asnValue.address.stream,4);
  529.       }
  530.      i++;
  531.      }
  532.   }
  533.   SNMP_FreeVarBind(&varBind[0]);
  534.   SNMP_FreeVarBind(&varBind[1]);
  535.   SNMP_FreeVarBind(&varBind[2]);
  536.   SNMP_FreeVarBind(&varBind[3]);
  537.   return i-1;
  538. }
  539.