1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-16 20:59:02 +00:00

Updated by Zhao to support 2nd generation os fingerprints, I think

This commit is contained in:
fyodor
2006-07-04 21:25:47 +00:00
parent 0354f3da89
commit da0ee2db09

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl
# $Id$
sub max($$) {
my ($a, $b) = @_;
if ($a >= $b) { return $a;}
@@ -19,7 +17,7 @@ while(<>) {
$line = $_;
if ($line eq "." || $line eq "") { last; }
if (!$line =~ /(Fingerprint\s+\S)|(Class\s+\S)|(^T[1-7])|(^PU)|(^Contributed by)/i) { next; }
if (!$line =~ /(Fingerprint\s+\S)|(Class\s+\S)|(^SEQ)|(^OPS)|(^WIN)|(^ECN)|(^T[1-7])|(^U1)|(^IE)|(^Contributed by)/i) { next; }
if ($line =~ /Contributed by (.*)/) {
if (!$fp{contrib}) {
@@ -37,11 +35,11 @@ while(<>) {
}
}
elsif ($line =~ /TSeq\(Class=([^%\)]+)(%gcd=([^%]+)%SI=([^%\)]+))?(%Val=([A-F0-9]+))?(%IPID=([^%\)]+))?(%TS=([^%\)]+))?\)/) {
elsif ($line =~ /SEQ\(CL=([^%\)]+)(%SP=([^%]+)%GCD=([^%\)]+))?(%Val=([A-F0-9]+))?(%IPID=([^%\)]+))?(%TS=([^%\)]+))?\)/) {
$cls = $1;
if ($cls ne "C") {
$gcd = hex($3);
$si = $4;
$si = $3;
$gcd = hex($4);
} else { $cval=$6; }
$ipid = $8;
$ts = $10;
@@ -100,7 +98,7 @@ while(<>) {
# print "oldhighlim: $oldhighlim oldlowlim: $oldlowlim newhighlim: $newhighlim newlowlim: $newlowlim oldsi: $fp{tseq}{si}";
if ($newlowlim > 0) {
$fp{tseq}{si} = sprintf("<%X&>%X", $newhighlim, $newlowlim);
$fp{tseq}{si} = sprintf("%X-%X", $newhighlim, $newlowlim);
} else {
$fp{tseq}{si} = sprintf("<%X", $newhighlim);
}
@@ -124,7 +122,147 @@ while(<>) {
}
}
} elsif ($line =~ /^T([1-7])/) {
} elsif ($line =~ /^OPS/) {
$o1 = $o2 = $o3 = $o4 = $o5= $o6 = "";
if ($line =~ /O1=([0-9A-Z]*)/) {
$o1 = $1;
if (!$o1) { $o1 = "NULL"; }
}
if ($line =~ /O2=([0-9A-Z]*)/) {
$o2 = $1;
if (!$o2) { $o2 = "NULL"; }
}
if ($line =~ /O3=([0-9A-Z]*)/) {
$o3 = $1;
if (!$o3) { $o3 = "NULL"; }
}
if ($line =~ /O4=([0-9A-Z]*)/) {
$o4 = $1;
if (!$o4) { $o4 = "NULL"; }
}
if ($line =~ /O5=([0-9A-Z]*)/) {
$o5 = $1;
if (!$o5) { $o5 = "NULL"; }
}
if ($line =~ /O6=([0-9A-Z]*)/) {
$o6 = $1;
if (!$o6) { $o6 = "NULL"; }
}
} elsif ($line =~ /^WIN/) {
$w1 = $w2 = $w3 = $w4 = $w5= $w6 = "";
if ($line =~ /W1=([0-9A-F]+)/) {
$w1 = $1;
if (!$w1) { $w1 = "NULL"; }
}
if ($line =~ /W2=([0-9A-F]+)/) {
$w2 = $1;
if (!$w2) { $w2 = "NULL"; }
}
if ($line =~ /W3=([0-9A-F]+)/) {
$w3 = $1;
if (!$w3) { $w3 = "NULL"; }
}
if ($line =~ /W4=([0-9A-F]+)/) {
$w4 = $1;
if (!$w4) { $w4 = "NULL"; }
}
if ($line =~ /W5=([0-9A-F]+)/) {
$w5 = $1;
if (!$w5) { $w5 = "NULL"; }
}
if ($line =~ /W6=([0-9A-F]+)/) {
$w6 = $1;
if (!$w6) { $w6 = "NULL"; }
}
} elsif ($line =~ /^ECN/) {
$resp = $df = $ttl = $cc = $quirk = "";
if ($line =~ /R=([NY])/) {
$resp = $1;
}
if ($line =~ /[(%]DF=([NY])/) {
$df = $1;
}
if ($line =~ /[(%]TG+=([0-9A-F]+)/) {
$ttl = $1;
}
if ($line =~ /[(%]CC=([NY])/) {
$cc = $1;
}
if ($line =~ /[(%]Q=([RU]*)/) {
$quirk = $1;
}
} elsif ($line =~ /^T1)/) {
$test = "T1";
$resp = $df = $ttl = $seq = $ack = $flags = $rd = $quirk = "";
if ($line =~ /Resp=([NY])/) {
$resp = $1;
}
if ($line =~ /[(%]DF=([NY])/) {
$df = $1;
}
if ($line =~ /[(%]W=([^%]+)/) {
$w = $1;
if (!$w) { $w = "NULL"; }
}
if ($line =~ /[(%]ACK=([^%]+)/) {
$ack = $1;
}
if ($line =~ /[(%]Flags=([^%]*)/) {
$flags = $1;
if (!$flags) { $flags = "NULL"; }
}
if ($line =~ /Ops=([A-Z|]*)/) {
$ops = $1;
if (!$ops) { $ops = "NULL"; }
}
if ($resp eq "Y" or !$resp) {
$fp{$test}{resp} = "Y";
if ($df and index($fp{$test}{df}, $df) == -1) {
if ($fp{$test}{df}) {
$fp{$test}{df} .= qq^|$df^;
} else {
$fp{$test}{df} = $df;
}
}
if (index($fp{$test}{w}, $w) == -1) {
if ($fp{$test}{w}) {
$fp{$test}{w} = $fp{$test}{w} . qq^|$w^;
} else {
$fp{$test}{w} = $w;
}
}
if ($ack and index($fp{$test}{ack}, $ack) == -1) {
if ($fp{$test}{ack}) {
$fp{$test}{ack} = $fp{$test}{ack} . qq^|$ack^;
} else {
$fp{$test}{ack} = $ack;
}
}
if (!($fp{$test}{flags} =~ /(^|\|)$flags($|\|)/)) {
if ($fp{$test}{flags}) {
$fp{$test}{flags} = $fp{$test}{flags} . qq^|$flags^;
} else {
$fp{$test}{flags} = $flags;
}
}
if (!($fp{$test}{ops} =~ /(^|\|)$ops($|\|)/)) {
if ($fp{$test}{ops}) {
$fp{$test}{ops} = $fp{$test}{ops} . qq^|$ops^;
} else {
$fp{$test}{ops} = $ops;
}
}
} elsif ($fp{$test}{resp} ne "Y") {
$fp{$test}{resp} = "N";
}
} elsif ($line =~ /^T([2-7])/) {
$num = $1;
$test = "T$num";
$resp = $df = $w = $ack = $flags = $ops = "";
@@ -370,7 +508,7 @@ if ($fp{pu}{resp} eq "Y") {
$fp{pu}{ripck} =~ s/NULL/0/;
if ($fp{pu}{rid}) {
$rid = "RID=$fp{pu}{rid}\%";
} else { $ridwarning = 1; $rid = "RID=E|F\%"; }
} else { $ridwarning = 1; $rid = "RID=G\%"; }
print "DF=$fp{pu}{df}%TOS=$fp{pu}{tos}%IPLEN=$fp{pu}{iplen}%RIPTL=$fp{pu}{riptl}%${rid}RIPCK=$fp{pu}{ripck}%UCK=$fp{pu}{uck}%ULEN=$fp{pu}{ulen}%DAT=$fp{pu}{dat})\n";
} else {
print "PU(Resp=N)\n";
@@ -384,7 +522,3 @@ if ($ridwarning == 1) {
"* may want to get RID from similar fingerprints *\n" .
"*******************************************************\n";
}