返回列表 回复 发帖

msndump.pl - a quick msn messenger sniffer source code

信息来源:miscname
  1. #!/usr/bin/perl -w
  2. # quick dirty msn sniffer
  3. # [url]http://miscname.com/[/url]
  4. # $Id: msndump.pl,v 1.4 2004/11/18 11:52:41 meh Exp $

  5. # you need Net::Pcap and Net::Packet
  6. # use cpan or get manually
  7. # [url]http://search.cpan.org/CPAN/authors/id/A/AT/ATRAK/NetPacket-0.04.tar.gz[/url]
  8. # [url]http://search.cpan.org/CPAN/authors/id/K/KC/KCARNUT/Net-Pcap-0.05.tar.gz[/url]

  9. my $filter = 'tcp and port 1863';

  10. # no modify below
  11. use Getopt::Std;
  12. use Net::Pcap;
  13. use NetPacket::IP qw (:strip);
  14. use NetPacket::Ethernet qw (:strip);
  15. use NetPacket::TCP;
  16. use Fcntl;
  17. $|=1;
  18. my $flags |= O_NONBLOCK;

  19. my %opts;
  20. getopt("wicr",\%opts);
  21. if ( (!($opts{i})) && (!($opts{r})) ) {
  22.      print "[ msndump - miscname.com ]\n Usage:\n\t-i rl0 || -r file.pcap\n\t-c X - capture X packets\n\t-w freshIMz.txt\n\t-v show all msn IM data\n\n";
  23.      exit;
  24. }

  25. if ((!$opts{r}) && ($> != '0')) {
  26.      die ("you need uid 0\n");
  27. }

  28. # trap sigs
  29. $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&exitd;

  30. # create pcap
  31. my $pcap = &cap_pkt;
  32. if (!($pcap)) {
  33.      die ("cant capture\n");
  34. }

  35. # open fh if -w set
  36. if ($opts{w}) {
  37.      open (FILEOUT,">$opts{w}") || die ("cant open $opts{w} ($!)\n");
  38.      fcntl(FILEOUT, F_SETFL, $flags) or die ("couldn't set nonblock for $opts{w} ($!)\n");
  39. }

  40. # main capture
  41. if (($opts{c}) && ($opts{c} =~ /(\d+)/)) {
  42.      print "stopping after $1 packets\n";
  43.          Net::Pcap::loop($pcap, $1, \&proc_pkt, 0);
  44.      &exitd;
  45. } else {
  46.          Net::Pcap::loop($pcap, -1, \&proc_pkt, 0);
  47.      my %stats;
  48.      Net::Pcap::stats($pcap, \%stats);
  49.      unless ($opts{r}) {
  50.            print "saw $stats{ps_recv} packets, dropped $stats{ps_drop}\n";
  51.      }
  52. }


  53. # sub procs
  54. sub exitd {
  55.      # free
  56.      Net::Pcap::close($pcap);
  57.      # close fh
  58.      if ($opts{w}) {
  59.            print "wrote $opts{w}.\n";
  60.            close FILEOUT;
  61.      }
  62. }

  63. sub cap_pkt {

  64.      my ($pcap,$dev,$err,$mask,$net,$filter2);
  65.      my $snaplen = 4096; # seen some big im's :(
  66.      my $promisc = 1; # promisc of course
  67.      my $timeout = 0; # timeout

  68.      # file.pcap?
  69.      if ($opts{r}) {
  70.            # open offline
  71.            $pcap = Net::Pcap::open_offline($opts{r}, \$err);
  72.            if (!($pcap)) {
  73.                  die("error opening $opts{r} ($err)\n");
  74.              } else {
  75.                  print "reading from '$opts{r}'\n";
  76.            }      
  77.      } else {
  78.            # set dev from cmdline
  79.            $dev = $opts{i};
  80.      
  81.            # get netmask for filter
  82.            if ((Net::Pcap::lookupnet($dev, \$net, \$mask, \$err)) == -1 ) {
  83.                      die ("Net::Pcap::lookupnet failed ($err) for device '$dev'\n");
  84.              }
  85.   
  86.            # open it
  87.            $pcap = Net::Pcap::open_live($dev, $snaplen, $promisc, $timeout, \$err);
  88.            if (!($pcap)) {
  89.                  die ("can't create packet fd ($err) on device '$dev'\n");
  90.            } else {
  91.                  print "dumping on '$dev'\n";
  92.            }
  93.      }
  94.   
  95.      # sanity check
  96.      if (!($pcap)) {
  97.            die ("sanity check failed - \$pcap null\n");
  98.      } elsif (!($mask)) {
  99.            $mask = '0'; # for open_offline
  100.      }

  101.      # make filter struct
  102.      if (Net::Pcap::compile($pcap, \$filter2, $filter, 1, $mask) != '0') {
  103.            die ("broken filter ($filter)\n");
  104.      }
  105.      # apply
  106.      Net::Pcap::setfilter($pcap, $filter2);

  107.      return $pcap;
  108. }

  109. sub proc_pkt {

  110.      my($user_data, $hdr, $pkt) = @_;
  111.      my ($user,$msg);

  112.      # get tcp section only from packet
  113.      my $tcp_obj = NetPacket::TCP->decode(ip_strip(eth_strip($pkt))); # stripping ip header makes =~ faster

  114.      # verbose shows all traf
  115.      if ($opts{v}) {
  116.            if (!($opts{w})) {
  117.                  print "$tcp_obj->{data}\n";
  118.            } else {
  119.                  print FILEOUT "$tcp_obj->{data}\n";
  120.            }
  121.      } elsif (($tcp_obj->{data} !~ /MSG/m) || ($tcp_obj->{data} =~ /P2P-Dest:/m)) {
  122.            # skip if its a message (or a p2p file transfer)
  123.            # if your reading this, include 'P2P-Dest:' in your message body to avoid sniffer ;)
  124.            ;
  125.      } else {
  126.            # extract goodies
  127.            if ( $tcp_obj->{data} =~ /MSG (.*)\s|TypingUser: (.*)\s|P4-Context: (.*)\s/ ) {
  128.                  $user = $1;
  129.            }
  130.            if ($tcp_obj->{data} =~ /X-MMS-IM-Format:\s\S*\s\S*\s\S*\s\S*\s\S*\s*(.*)/m) {
  131.                  $msg = $1;
  132.            }
  133.            # display if we have both
  134.            if (($user) && ($msg)) {
  135.                  if (!($opts{w})) {
  136.                        print "\n----------------------------------------------------\n";
  137.                        print "TIME: " . localtime($hdr->{tv_sec}) . "\n";
  138.                        print "TO/FROM: $user\nMESSAGE:\n$msg\n";
  139.                  } else {
  140.                        print FILEOUT "\n----------------------------------------------------\n";
  141.                        print FILEOUT "TIME: " . localtime($hdr->{tv_sec}) . "\n";
  142.                        print FILEOUT "TO/FROM: $user\nMESSAGE: \n$msg\n\n";
  143.                  }
  144.            }
  145.      }
  146. }

  147. #e0f
复制代码
返回列表