snmp.c
上传用户:lewson58
上传日期:2007-01-05
资源大小:7k
文件大小:17k
源码类别:

扫描程序

开发平台:

Unix_Linux

  1. /*********** ADMsnmp (c) The ADM Crew ***************/
  2. /* snmp audit scanner                               */
  3. /* venus c faite femme et le grand pan est mort     */
  4. /* without libsnmp (that was hard :)                */
  5. /* i wonder why nobody wrote this one before ?      */
  6. /* action of this scanner                           */
  7. /*    {                                             */
  8. /*    guess  community names's                      */
  9. /*            from the hostname                     */
  10. /*            from a list of password               */
  11. /*        test if u have writable access to the MIB */
  12. /*   }                                              */
  13. /* Greets going to: #!ADM,el8.org and ansia my love */
  14. /* ftp://ADM.isp.at/ADM/                            */
  15. /*  we g0t the -1 day'z  :))                        */
  16. /****************************************************/
  17. /* g bien peur que la fin du monde soit bien triste */
  18. #define VERSION "beta 0.1"
  19. /** include :> **/ 
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <unistd.h>
  24. #include <ctype.h>
  25. #include <fcntl.h>
  26. #include <sys/types.h>
  27. #include <sys/time.h>
  28. #include <errno.h>
  29. #include <sys/stat.h>
  30. #include <netdb.h>
  31. #include <netinet/in.h>
  32. struct snmpchex
  33.   {
  34.     char name[16]; /* name of the community */
  35.     int id;        /* id of the request     */
  36.     int ret;       /* return code of the request */
  37.     u_char rw;     /*  writable or no ?          */
  38.   };
  39. struct optionz       /* option of the program's    */
  40.   {                   
  41.     u_long utimeout;
  42.     u_long uwait;
  43.     u_long host;
  44.     char *wordfile;
  45.     char *outputfile;
  46.     u_char guess;
  47.     int manysend;
  48.     u_long inter;
  49.   }
  50. opz;
  51. struct snmpchex sntab[255];
  52. char oldbanner[1024];
  53. char *guess[1024];
  54. int guess_i = 0;
  55. /** functions used make a list of password's from the hostname **/
  56. /** eg. www.toto.com will have toto,TOTO01,www.toto,toto.com etc. **/
  57. void
  58. addguess (char *str)
  59. {
  60.   guess[guess_i] = (char *) calloc (1, strlen (str) + 1);
  61.   strcpy (guess[guess_i], str);
  62.   guess_i++;
  63. }
  64. int
  65. guessname (char *namez)
  66. {
  67.   char *ptrhost[255];
  68.   char *begin;
  69.   char *end;
  70.   char *hostz;
  71.   char *h00st;
  72.   char tmp[255];
  73.   u_char nodot = 2;
  74.   int i;
  75.   int x;
  76.   int a = 0;
  77.   h00st = hostz = namez;
  78.   begin = h00st;
  79.   if (strchr (hostz, (int) '.') == NULL)
  80.     {
  81.       nodot = 1;
  82.       ptrhost[0] = strdup (namez);
  83.     }
  84.   else
  85.     while (1)
  86.       {
  87. end = NULL;
  88. end = (char *) strchr (hostz, (int) '.');
  89. if (end != NULL)
  90.   {
  91.     ptrhost[a] = (char *) calloc (1, 255);
  92.     for (i = 0; begin != end; begin = begin + 1)
  93.       if (*begin != '.')
  94. ptrhost[a][i++] = *begin;
  95.     a++;
  96.     hostz = begin + 1;
  97.   }
  98. else if (strlen (begin) > 0)
  99.   {
  100.     ptrhost[a] = (char *) calloc (1, 255);
  101.     strcpy (ptrhost[a], begin + 1);
  102.     break;
  103.   }
  104. else
  105.   break;
  106.       }
  107.   if (nodot == 2)
  108.     {
  109.       addguess (ptrhost[0]);
  110.       addguess (ptrhost[a - 1]);
  111.       memset (tmp, 0, sizeof (tmp));
  112.       sprintf (tmp, "%s.%s", ptrhost[a - 1], ptrhost[a]);
  113.       addguess (tmp);
  114.       memset (tmp, 0, sizeof (tmp));
  115.       sprintf (tmp, "%s.%s", ptrhost[0], ptrhost[1]);
  116.       addguess (tmp);
  117.       memset (tmp, 0, sizeof (tmp));
  118.       sprintf (tmp, "%s%s", ptrhost[0], ptrhost[1]);
  119.       addguess (tmp);
  120.       memset (tmp, 0, sizeof (tmp));
  121.       sprintf (tmp, "%s%s", ptrhost[a - 1], ptrhost[a]);
  122.       addguess (tmp);
  123.     }
  124.   for (i = 0; i < nodot; i++)
  125.     for (x = 95; x < 100; x++)
  126.       {
  127. memset (tmp, 0, sizeof (tmp));
  128. sprintf (tmp, "%s%i", ptrhost[i], x);
  129. addguess (tmp);
  130.       }
  131.   for (i = 0; i < nodot; i++)
  132.     for (x = 0; x < 11; x++)
  133.       {
  134. memset (tmp, 0, sizeof (tmp));
  135. sprintf (tmp, "%s%i", ptrhost[i], x);
  136. addguess (tmp);
  137.       }
  138.   for (i = 0; i < nodot; i++)
  139.     for (x = 0; x < 11; x++)
  140.       {
  141. memset (tmp, 0, sizeof (tmp));
  142. sprintf (tmp, "%s%02i", ptrhost[i], x);
  143. addguess (tmp);
  144.       }
  145.   a = guess_i;
  146.   for (x = 0; x != a; x++)
  147.     {
  148.       memset (tmp, 0, sizeof (tmp));
  149.       strcpy (tmp, guess[x]);
  150.       for (i = 0; i < strlen (tmp); i++)
  151. tmp[i] = (char) toupper ((int) tmp[i]);
  152.       addguess (tmp);
  153.     }
  154.   return (0);
  155. }
  156. /** resolve a hostname to an ip  **/
  157. unsigned long
  158. host2ip (char *serv)
  159. {
  160.   struct sockaddr_in sinn;
  161.   struct hostent *hent;
  162.   hent = gethostbyname (serv);
  163.   if (hent == NULL)
  164.     return 0;
  165.   bzero ((char *) &sinn, sizeof (sinn));
  166.   memcpy ((char *) &sinn.sin_addr, hent->h_addr, hent->h_length);
  167.   return sinn.sin_addr.s_addr;
  168. }
  169. /** look into the snmpd packet and get the return code the ID and the **/
  170. /** community name and return an offset to the end  return code of the paket **/
  171. /** in ASN.1 language 0x4 [sizeof the string] = string
  172.       0x2 [sizeof of the interger] = integer
  173. **/          
  174.           
  175. int
  176. getret (u_char * buf, int size, struct snmpchex *sn)
  177. {
  178.   int i;
  179.   for (i = 0; i < size; i++)
  180.     if (buf[i] == 'x04')
  181.       {
  182. /** Search the comunity name **/
  183. memset ((char *) &sn->name, 0, sizeof (sn->name));
  184. if (buf[i + 1] < (sizeof (sn->name) - 1))
  185.   memcpy ((char *) &sn->name, (char *) &buf[i + 2], buf[i + 1]);
  186. else
  187.   return (-1);
  188. i = i + (buf[i + 1] + 1);
  189. for (; i < size && i + 2 < size; i++)
  190.   if (buf[i] == 0xa2)
  191.     { 
  192.     /** ok we enter into the PDU **/
  193.       for (; i < size && i + 2 < size; i++)
  194. if (buf[i] == 'x02')
  195.   {
  196.    /** get the ID **/
  197.     sn->id = buf[i + 2];
  198.     for (i = i + (buf[i + 1] + 2); i < size && i + 2 < size; i++)
  199.       if (buf[i] == 'x02')
  200. if (buf[i + 1] == 'x01')
  201.   {
  202.     /** return code **/
  203.     sn->ret = buf[i + 2];
  204.     return (i + 2);
  205.   }
  206. else
  207.   return (-1);
  208.   }
  209.     }
  210.       }
  211.   return (-1);
  212. }
  213. /** here we make a GERREQ and SETREQ paket */
  214. /** read a good book about snmp protocol or rfc for the meaning :) */
  215. int
  216. getreq (u_char * buf, char *name, int longid, u_char id, int set_req)
  217. {
  218.   int i = 0;
  219.   buf[0] = 0x30;
  220.   buf[1] = 0x82;
  221.   buf[2] = 0x00;
  222.   buf[3] = 16 + longid + strlen (name);
  223.   /* printf ("buf[1]=%in", 19 + longid + strlen (name)); */
  224.   buf[4] = 0x02;
  225.   buf[5] = 0x01;
  226.   buf[6] = 0x00;
  227.   buf[7] = 0x04;            /* we copy the community name */
  228.   buf[8] = strlen (name); 
  229.   strcpy ((buf + 9), name);
  230.   i = 9 + strlen (name);
  231.   if (set_req == 0)
  232.     buf[i++] = 0xa0;     /* a0 = getreq a3 = setreq */
  233.   else              
  234.     buf[i++] = 0xa3;
  235. /** get req **/
  236. /* printf ("buf[%i]=%in", i, 12 + longid); */
  237.   buf[i++] = 9 + longid;
  238.   buf[i++] = 0x02;
  239.   buf[i++] = 0x1;
  240.   buf[i++] = (u_char) id;
  241.   buf[i++] = 0x02;
  242.   buf[i++] = 0x01;
  243.   buf[i++] = 0x00;
  244.   buf[i++] = 0x02;
  245.   buf[i++] = 0x01;
  246.   buf[i++] = 0x00;
  247.   return (20 + strlen (name));
  248. }
  249. /** make the paket snmp :> */
  250. int
  251. makepktsnmp (int sock, u_char * sysdec, int sizeofsysdec, char *buf, int sizeofbuf, char *namez, int id, struct sockaddr_in *sin, int set_req)
  252. {
  253.   int i;
  254.   int GETREQ_SYSDEC;
  255.   GETREQ_SYSDEC = sizeofsysdec - 1;
  256.   memset (buf, 0, sizeofbuf);
  257.   i = getreq (buf, namez, GETREQ_SYSDEC, id, set_req);
  258.   memcpy ((buf + i), sysdec, GETREQ_SYSDEC);
  259.   return (sendto (sock, buf, i + GETREQ_SYSDEC, 0, sin, sizeof (struct sockaddr_in)));
  260. }
  261. /** getreq paket **/
  262. int
  263. req_makepktsnmp (int sock, char *buf, int sizeofbuf, char *namez, int id, struct sockaddr_in *sin)
  264. {
  265.   /** system.sysName.0 :> **/
  266.   u_char sysdec[] = "x30x10x30x82x0x0cx06x08x2bx06x01x02x01x01x05x00x05x00";
  267.   return (makepktsnmp (sock, (u_char *) & sysdec, sizeof (sysdec), buf, sizeofbuf, namez, id, sin, 0));
  268. }
  269. /** setreq paket **/
  270. int
  271. set_makepktsnmp (int sock, char *buf, int sizeofbuf, char *name,
  272.  char *namez, int id, struct sockaddr_in *sin)
  273. {
  274.   int i;
  275.   u_char *save;
  276.   u_char sysdec[] = "x30x10x30x82x0x09x06x08x2bx06x01x02x01x01x05x00";
  277.   save = (u_char *) calloc (1, sizeof (sysdec) + strlen (namez) + 2);
  278.   i = sizeof (sysdec);
  279.   memcpy (save, (u_char *) & sysdec, i);
  280.   i--;
  281.   save[i++] = 'x04';
  282.   save[i++] = strlen (namez);
  283.   memcpy ((save + i), namez, strlen (namez));
  284.   i = strlen (namez) + 3;
  285.   save[1] = save[1] + strlen (namez);
  286.   save[5] = save[5] + i;
  287.   i--;
  288.   return (makepktsnmp (sock, save, sizeof (sysdec) + i, buf, sizeofbuf, name, id, sin, 1));
  289. }
  290. /** keep in memory good community name **/
  291. /** return -2 if we have an Writable access **/
  292. /** return 0 for any good community name **/
  293. /** return -1 for error or  any else     **/
  294. int
  295. snadd (struct snmpchex *sn, int taboff)
  296. {
  297.   int i;
  298.   if (sn->id > 127)
  299.     for (i = 0; i < 255; i++)
  300.       if (strcmp ((char *) &sntab[i].name, sn->name) == 0)
  301. {
  302.   sntab[i].rw = 2;
  303.   return (-2);
  304. }
  305.   for (i = 0; i < 255; i++)
  306.     if (sntab[i].id == sn->id)
  307.       {
  308. return (-1);
  309.       }
  310.     else if (strcmp ((char *) &sntab[i].name, sn->name) == 0)
  311.       return (-1);
  312.   strncpy ((char *) &sntab[taboff].name, (char *) &sn->name, 16);
  313.   sntab[taboff].id = sn->id;
  314.   sntab[taboff].ret = sn->ret;
  315.   return (0);
  316. }
  317. /** main function **/
  318. int 
  319. snmpcheck (u_long ip, FILE * f)
  320. {
  321.   struct snmpchex sn;
  322.   struct sockaddr_in sin;
  323.   int sock;
  324.   int i = 0, x;
  325.   u_char buf[255];
  326.   char namez[24];
  327.   
  328.   int the_id = 10;
  329.   int nd;
  330.   int sntab_off = 0;
  331.   int manysend = 0;
  332.   struct timeval tv2, tv3;
  333.   sin.sin_family = AF_INET;
  334.   sin.sin_port = htons (161);
  335.   sin.sin_addr.s_addr = ip;
  336.   sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); /* gimme a socket */
  337.   fcntl (sock, F_SETFL, O_NONBLOCK);
  338.   the_id = 1;
  339.   memset ((u_char *) & buf, 0, sizeof (buf));
  340.   while (1)
  341.     {
  342.       if (the_id > 127)
  343. the_id = 0;
  344.       if (!feof (f)) /** get community name to test from the wordfile **/
  345. {
  346.   memset ((char *) &namez, 0, sizeof (namez));
  347.   fgets ((char *) &namez, sizeof (namez), f);
  348.   if (strlen (namez) > 0 && namez [0] != 'n')
  349.     {
  350.       namez[strlen (namez) - 1] = '';
  351.       the_id++;
  352.       printf ("33[0m33[01m33[31m>>>>>>>>>>> get req name=%s  id = %i >>>>>>>>>>>33[0mn", namez, the_id);
  353.       for (manysend = 0; manysend < opz.manysend; manysend++)
  354. {
  355.   if (the_id > 127)
  356.     the_id = 0;
  357.   else
  358.     the_id++;
  359.                                  /* send the request */   
  360.               if (req_makepktsnmp (sock, (char *) &buf, sizeof (buf), namez, the_id, &sin) < 0)
  361.     {
  362.       perror ("sendto");
  363.       exit (-1);
  364.     }
  365.   usleep (opz.uwait);
  366. }
  367.     }
  368. }
  369.       usleep (opz.inter);
  370.       memset ((u_char *) & buf, 0, sizeof (buf));
  371.       x = sizeof (sin);
  372.      if (feof(f)) 
  373.        {
  374.         /** time to wait before quit  this function  **/
  375.          gettimeofday (&tv3, NULL);
  376.          if ( (tv2.tv_sec + opz.utimeout) < tv3.tv_sec)
  377.            break;
  378.        }   
  379.      else  gettimeofday (&tv2, NULL);
  380.      
  381.       i = 0;
  382.       /** we get an answer !!!! */
  383.       
  384.       if ((i = recvfrom (sock, (char *) &buf, sizeof (buf), 0, &sin, &x)) > 0)
  385. {
  386.   nd = 0;
  387.  /** extract the ID the return code and the community name **/
  388.   nd = getret ((char *) &buf, i, &sn);
  389.   printf ("33[0m33[1m33[32m<<<<<<<<<<< recv snmpd paket id = %i name = %s ret =%i <<<<<<<<<<33[0mn", sn.id, sn.name, sn.ret);
  390.   if (nd > 0 && sn.ret == 0)
  391.     {
  392.               /** here we will save our first awnser and trying to see if the
  393.                   we can write with the community name  **/
  394.                    
  395.       for (; nd < i; nd++)
  396. if (buf[nd] == 0x04)
  397.   {
  398.     if (oldbanner[0] == '')
  399.       for (i = 0; i < buf[nd + 1]; i++)
  400. {
  401.   /** save the old system.sysName.0  **/
  402.   oldbanner[i] = buf[nd + 2 + i];
  403. }
  404.     memset ((u_char *) & buf, 0, sizeof (buf));
  405.     if (snadd (&sn, sntab_off++) == 0)
  406.       {
  407. printf ("33[0m33[01m33[33m>>>>>>>>>>>> send setrequest id = %i name = %s >>>>>>>> 33[0mn", sn.id, sn.name);
  408. for (manysend = 0; manysend < opz.manysend; manysend++)
  409.   {
  410. /** set  paket **/    
  411.     set_makepktsnmp (sock, (char *) &buf, sizeof (buf), (char *) &sn.name, "ADMsnmp", the_id + 127, &sin);
  412.     usleep (opz.uwait);
  413.   }
  414.       }
  415.   }
  416.     }
  417.   memset ((u_char *) & buf, 0, sizeof (buf));
  418.   i = 0;
  419. }
  420.     }
  421. /** we look if we have writable community access **/
  422. /** and we setup the old commnunity name (important ;)    **/
  423.   for (i = 0; i < 255; i++)
  424.     if (sntab[i].id != -666)
  425.       if (sntab[i].rw == 2)
  426. {
  427.   set_makepktsnmp (sock, (char *) &buf, sizeof (buf), (char *) &sntab[i].name, (char *) &oldbanner, the_id + 127, &sin);
  428.   sleep (1);
  429.   set_makepktsnmp (sock, (char *) &buf, sizeof (buf), (char *) &sntab[i].name, (char *) &oldbanner, the_id + 127, &sin);
  430.   sleep (1);
  431. }
  432. return (0);
  433. }
  434. /** give you the hostname from the ip **/
  435. char *
  436. ip2host (u_long ip)
  437. {
  438.   struct hostent *ht;
  439.   char *c;
  440.   c = calloc (1, 255);
  441.   ht = gethostbyaddr ((char *) &ip, sizeof (u_long), AF_INET);
  442.   if (ht == NULL)
  443.     return (NULL);
  444.   strncpy (c, ht->h_name, 254);
  445.   return (c);
  446. }
  447. void
  448. usage (char *name)
  449. {
  450.   printf ("ADMsnmp v %s (c) The ADM crewn", "0.1");
  451.   printf ("%s: <host> [-g,-wordf,-out <name>, [-waitf,-sleep, -manysend,-inter <#>] ] n", name);
  452.   printf ("<hostname>     : host to scan n"
  453.   "[-guessname]   : guess password with hostname n"
  454.   "[-wordfile]    : wordlist of password to tryn"
  455.   "[-outputfile] <name>: output filen"
  456.      "[-waitfor] <mili>  : time in milisecond in each send of snmprequestn"
  457.   "[-sleep]   <second> : time in second of the scan process lifen"
  458.   "[-manysend] <number>: how many paket to send by request n"
  459.      "[-inter] <mili>     : time to wait in milisecond after each request");
  460. }
  461. int
  462. main (int argc, char **argv)
  463. {
  464.   FILE *f;
  465.   FILE *fout;
  466.   int i;
  467.   char *c;
  468.   char *fname;
  469. /** clean all ;) **/
  470.   for (i = 0; i < 255; i++)
  471.     {
  472.       memset ((char *) &sntab[i].name, 0, 16);
  473.       sntab[i].id = -666;
  474.       sntab[i].rw = 0;
  475.       sntab[i].ret = -666;
  476.     }
  477.   if (argc < 2)
  478.     {
  479.       usage (argv[0]);
  480.       exit (-1);
  481.     }
  482. /** default setup **/
  483.   opz.utimeout = 10;
  484.   opz.uwait = 100000;
  485.   opz.host = host2ip (argv[1]);
  486.   if (opz.host == 0)
  487.     {
  488.       printf ("cant resolve hostname!n");
  489.       exit (-1);
  490.     }
  491.   opz.wordfile = strdup ("snmp.passwd");
  492.   opz.outputfile = NULL;
  493.   opz.guess = -1;
  494.   opz.manysend = 2;
  495.   opz.inter = 100000;
  496. /* eleet parser :) */
  497.   for (i = 0; i < argc; i++)
  498.     {
  499.       if (strncmp (argv[i], "-g", 2) == 0)
  500. opz.guess = 1;
  501.       if (strncmp (argv[i], "-wo", 3) == 0)
  502. opz.wordfile = strdup (argv[++i]);
  503.       if (strncmp (argv[i], "-out", 4) == 0)
  504. opz.outputfile = strdup (argv[++i]);
  505.       if (strncmp (argv[i], "-wai", 4) == 0)
  506. opz.uwait = 100 * atoi (argv[++i]);
  507.       if (strncmp (argv[i], "-sle", 4) == 0)
  508. opz.utimeout = atoi (argv[++i]);
  509.       if (strncmp (argv[i], "-man", 4) == 0)
  510. opz.manysend = atoi (argv[++i]);
  511.       if (strncmp (argv[i], "-int", 4) == 0)
  512. opz.inter = 100 * atoi (argv[++i]);
  513.     }
  514. /*
  515.  *  printf ("wordfile = %s sleep = %u waitfor = %u guess = %i outputfile = %s manysend = %in",
  516.  *  opz.wordfile, opz.utimeout, opz.uwait, opz.guess, opz.outputfile, opz.manysend);
  517.  */
  518.   
  519. /** if we have the guessname option we make a new wordfile from it result +
  520.  **    the wordfile  choosed  **/
  521.  
  522.   if (opz.guess == 1)
  523.     {
  524.       c = ip2host (opz.host);
  525.       if (c != NULL)
  526. {
  527.   guessname (c);
  528.   c = calloc (1, 255);
  529.   sprintf (c, "/tmp/.ADMsnmp.%i", getpid ());
  530.   fname = strdup (c);
  531.   f = fopen (c, "w+");
  532.   fout = fopen (opz.wordfile, "r");
  533.   if (fout == NULL)
  534.     {
  535.       printf ("cant open wordfile!n");
  536.       perror ("fopen");
  537.       exit (-1);
  538.     }
  539.   while (!feof (fout))
  540.     {
  541.       memset (c, 0, 255);
  542.       fgets (c, 255, fout);
  543.       fwrite (c, strlen (c), 1, f);
  544.     }
  545.   for (i = 0; i < guess_i; i++)
  546.     {
  547.       memset (c, 0, 255);
  548.       fwrite (guess[i], strlen (guess[i]), 1, f);
  549.       fwrite ("n", 1, 1, f);
  550.     }
  551.   fclose (fout);
  552.   rewind (f);
  553. }
  554.     }
  555.   if (opz.guess != 1)
  556.     {
  557.       f = fopen (opz.wordfile, "r");
  558.       if (f == NULL)
  559. {
  560.   printf ("cant open wordfile!n");
  561.   perror ("fopen");
  562.   exit (-1);
  563. }
  564.     }
  565. fout = NULL;
  566.   
  567.   if (opz.outputfile != NULL)
  568.     {
  569.       fout = fopen (opz.outputfile, "w");
  570.       if (fout == NULL)
  571. {
  572.   printf ("cant open outpufile!n");
  573.   exit (-1);
  574. }
  575.     }
  576.   memset ((char *) &oldbanner, 0, sizeof (oldbanner));
  577. /*** the true MAIN :) **/
  578.  printf ("ADMsnmp v%s (c) The ADM crewn",VERSION);
  579.  printf ("ftp://ADM.isp.at/ADM/ngreets: !ADM, el8.org, ansian");
  580.  
  581.  
  582.  snmpcheck (host2ip (argv[1]), f);
  583.  
  584.   if (fout != NULL) 
  585.       fprintf (fout,"nn<!ADM!>ttsnmp check on %stt<!ADM!>n",argv [1]);
  586.  
  587.   printf ("nn<!ADM!>ttsnmp check on %stt<!ADM!>n",argv[1]);
  588.   if (strlen (oldbanner) > 0) 
  589.    {
  590.     printf ("33[1msys.sysName.033[0m:%sn", oldbanner);
  591.     if (fout != NULL) 
  592.         fprintf (fout,"33[1msys.sysName.033[0m:%sn", oldbanner);
  593.    }
  594.    
  595.   for (i = 0; i < 255; i++)
  596.     {
  597.       if (sntab[i].id != -666)
  598. {
  599.   printf ("name = 33[1m33[31m%s33[0m", (char *) &sntab[i].name);
  600.   if (fout != NULL) 
  601.          fprintf (fout,"name = 33[1m33[31m%s33[0m", (char *) &sntab[i].name);
  602.   if (sntab[i].rw == 2)
  603.     {
  604.     printf (" 33[133[5mwrite33[0m accessn");
  605.     if (fout != NULL)fprintf (fout," 33[133[5mwrite33[0m accessn");
  606.     }
  607.   else 
  608.    {
  609.     printf (" readonly accessn");
  610.     if (fout != NULL)fprintf (fout," readonly accessn");
  611.    }
  612. }
  613.     }
  614.   if (opz.guess == 1)
  615.     unlink (fname);
  616. exit (0);
  617. /* bye :) */
  618. }