package com.netifera.platform.net.internal.services.detection.basic;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import com.netifera.platform.net.services.detection.INetworkServiceDetector;
import com.netifera.platform.util.PortSet;
@SuppressWarnings("boxing")
public class MSSQLDetector implements INetworkServiceDetector {
private final Pattern responsePattern = Pattern.compile("(^\\x04\\x01\\x00\\x25|^\\x05\\x6e\\x00|;MSSQLSERVER;).*", Pattern.MULTILINE|Pattern.DOTALL);
static Map<Integer, String> versionToOS = new HashMap<Integer, String>();
static {
versionToOS.put(0x09000c6e, "2005 SP2+Q940128"); // 9.00.3182
versionToOS.put(0x09000c6b, "2005 SP2+Q938243"); // 9.00.3179
versionToOS.put(0x09000c69, "2005 SP2+Q939563"); // 9.00.3177
versionToOS.put(0x09000c63, "2005 SP2+Q937745"); // 9.00.3171
versionToOS.put(0x09000c57, "2005 SP2+Q934459"); // 9.00.3159
versionToOS.put(0x09000c54, "2005 SP2+Q934226"); // 9.00.3156
versionToOS.put(0x09000c51, "2005 SP2+Q933564"); // 9.00.3153
versionToOS.put(0x09000c50, "2005 SP2+Q933097 (Cumulative HF1)"); // 9.00.3152
versionToOS.put(0x09000bee, "2005 SP2+Q934458"); // 9.00.3054
versionToOS.put(0x09000bea, "2005 SP2+Q933508"); // 9.00.3050
versionToOS.put(0x09000be3, "2005 SP2+Q933508 (use this if SP2 was applied prior to 3/8)"); // 9.00.3043
versionToOS.put(0x09000be2, "2005 'Fixed' SP2 (use this if SP2 was NOT applied yet - orig. RTM removed)"); // 9.00.3042
versionToOS.put(0x09000bd3, "2005 SP2 CTP (November)"); // 9.00.3027
versionToOS.put(0x09000bd2, "2005 SP1+Q929376"); // 9.00.3026
versionToOS.put(0x090008c5, "2005 SP1+Q933573"); // 9.00.2245
versionToOS.put(0x090008ba, "2005 SP1+Q937343"); // 9.00.2234
versionToOS.put(0x090008b8, "2005 SP1+Q937277"); // 9.00.2232
versionToOS.put(0x090008b5, "2005 SP1+Q935446"); // 9.00.2229
versionToOS.put(0x090008af, "2005 SP1+Q932393"); // 9.00.2223
versionToOS.put(0x090008ad, "2005 SP1+Q931593"); // 9.00.2221
versionToOS.put(0x090008a8, "2005 SP1+Q931821"); // 9.00.2216
versionToOS.put(0x090008a7, "2005 SP1+Q931666"); // 9.00.2215
versionToOS.put(0x090008a1, "2005 SP1+Q929278"); // 9.00.2209
versionToOS.put(0x0900089a, "2005 SP1+Q927643"); // 9.00.2202
versionToOS.put(0x09000899, "2005 SP1+Q927289"); // 9.00.2201
versionToOS.put(0x09000893, "2005 SP1+Q926240"); // 9.00.2195
versionToOS.put(0x09000892, "2005 SP1+Q925744"); // 9.00.2194
versionToOS.put(0x09000890, "2005 SP1+Q924954/925335"); // 9.00.2192
versionToOS.put(0x0900088f, "2005 SP1+Q925135"); // 9.00.2191
versionToOS.put(0x0900088e, "2005 SP1+Q925227"); // 9.00.2190
versionToOS.put(0x0900088d, "2005 SP1+Q925153"); // 9.00.2189
versionToOS.put(0x0900088b, "2005 SP1+Q923849"); // 9.00.2187
versionToOS.put(0x0900086c, "2005 SP1+Q919611"); // 9.00.2156
versionToOS.put(0x09000802, "2005 SP1+.NET Vulnerability fix"); // 9.00.2050
versionToOS.put(0x090007ff, "2005 SP1 RTM"); // 9.00.2047
versionToOS.put(0x090007f8, "2005 SP1 CTP"); // 9.00.2040
versionToOS.put(0x090007ed, "SP1 Beta"); // 9.00.2029
versionToOS.put(0x09000619, "2005 RTM+Q932556"); // 9.00.1561
versionToOS.put(0x09000616, "2005 RTM+Q926493"); // 9.00.1558
versionToOS.put(0x09000612, "2005 RTM+Q926292"); // 9.00.1554
versionToOS.put(0x0900060f, "2005 RTM+Q922804"); // 9.00.1551
versionToOS.put(0x0900060b, "2005 RTM+Q918276"); // 9.00.1547
versionToOS.put(0x09000603, "2005 RTM+Q917738"); // 9.00.1539
versionToOS.put(0x09000602, "2005 RTM+Q917824"); // 9.00.1538
versionToOS.put(0x09000600, "2005 RTM+Q917016"); // 9.00.1536
versionToOS.put(0x090005fe, "2005 RTM+Q916706"); // 9.00.1534
versionToOS.put(0x090005fd, "2005 RTM+Q916086"); // 9.00.1533
versionToOS.put(0x090005fc, "2005 RTM+Q916046"); // 9.00.1532
versionToOS.put(0x090005fb, "2005 RTM+Q915918"); // 9.00.1531
versionToOS.put(0x090005ef, "2005 RTM+Q913494"); // 9.00.1519
versionToOS.put(0x090005ea, "2005 RTM+Q912471"); // 9.00.1514
versionToOS.put(0x090005df, "2005 RTM+Q911662"); // 9.00.1503
versionToOS.put(0x090005de, "2005 RTM+Q915793"); // 9.00.1502
versionToOS.put(0x090005dc, "2005 RTM+Q910416"); // 9.00.1500
versionToOS.put(0x0900057e, "2005 RTM+Q932557"); // 9.00.1406
versionToOS.put(0x09000577, "2005 RTM"); // 9.00.1399
versionToOS.put(0x09000522, "September CTP Release"); // 9.00.1314
versionToOS.put(0x090004a3, "June CTP Release"); // 9.00.1187
versionToOS.put(0x0900045c, "April CTP Release"); // 9.00.1116
versionToOS.put(0x09000442, "March CTP Release (may list as Feb.)"); // 9.00.1090
versionToOS.put(0x090003d5, "December CTP Release"); // 9.00.981
versionToOS.put(0x090003b7, "October CTP Release"); // 9.00.951
versionToOS.put(0x09000395, "Internal build (?)"); // 9.00.917
versionToOS.put(0x09000354, "Beta 2"); // 9.00.852
versionToOS.put(0x09000351, "Internal build (?)"); // 9.00.849
versionToOS.put(0x0900034c, "Internal build (?)"); // 9.00.844
versionToOS.put(0x09000344, "Express Ed. Tech Preview"); // 9.00.836
versionToOS.put(0x09000337, "Internal build (IDW4)"); // 9.00.823
versionToOS.put(0x09000316, "Internal build (IDW3)"); // 9.00.790
versionToOS.put(0x090002ff, "Internal build (IDW2)"); // 9.00.767
versionToOS.put(0x090002eb, "Internal build (IDW)"); // 9.00.747
versionToOS.put(0x09000285, "MS Internal (?)"); // 9.00.645
versionToOS.put(0x09000260, "Beta 1"); // 9.00.608
versionToOS.put(0x0700047e, "7.0 SP4+Q891116"); // 7.00.1150
versionToOS.put(0x07000478, "7.0 SP4+Q830233"); // 7.00.1144
versionToOS.put(0x07000477, "7.0 SP4+Q829015"); // 7.00.1143
versionToOS.put(0x07000449, "7.0 SP4+Q822756"); // 7.00.1097
versionToOS.put(0x07000446, "7.0 SP4+Q815495"); // 7.00.1094
versionToOS.put(0x07000437, "329499"); // 7.00.1079
versionToOS.put(0x07000436, "7.0 SP4+Q327068"); // 7.00.1078
versionToOS.put(0x07000435, "7.0 SP4+Q316333"); // 7.00.1077
versionToOS.put(0x07000427, "7.0 SP4 - All languages"); // 7.00.1063
versionToOS.put(0x07000409, "7.0 SP3+Q324469"); // 7.00.1033
versionToOS.put(0x07000402, "7.0 SP3+Q319851"); // 7.00.1026
versionToOS.put(0x070003ec, "7.0 SP3+Q304851"); // 7.00.1004
versionToOS.put(0x070003e4, "7.0 SP3+Q299717"); // 7.00.996
versionToOS.put(0x070003d2, "7.0 SP3+Q285870"); // 7.00.978
versionToOS.put(0x070003d1, "7.0 SP3+Q284351"); // 7.00.977
versionToOS.put(0x070003ca, "7.0 SP3+Q283837/282243"); // 7.00.970
versionToOS.put(0x070003c1, "7.0 SP3 - All languages"); // 7.00.961
versionToOS.put(0x07000399, "7.0 SP2+Q283837"); // 7.00.921
versionToOS.put(0x07000397, "7.0 SP2+Q282243"); // 7.00.919
versionToOS.put(0x07000396, "7.0 SP2+Q280380"); // 7.00.918
versionToOS.put(0x07000395, "7.0 SP2+Q279180"); // 7.00.917
versionToOS.put(0x0700038e, "7.0 SP2+Q275901"); // 7.00.910
versionToOS.put(0x07000389, "7.0 SP2+Q274266"); // 7.00.905
versionToOS.put(0x07000379, "7.0 SP2+Q243741"); // 7.00.889
versionToOS.put(0x0700036f, "7.0 SP2+Q281185"); // 7.00.879
versionToOS.put(0x07000359, "7.0 SP2+Q260346"); // 7.00.857
versionToOS.put(0x0700034a, "7.0 SP2"); // 7.00.842
versionToOS.put(0x07000347, "7.0 SP2 Unidentified"); // 7.00.839
versionToOS.put(0x07000343, "7.0 SP2 Beta"); // 7.00.835
versionToOS.put(0x07000308, "7.0 SP1+Q258087"); // 7.00.776
versionToOS.put(0x07000302, "7.0 SP1+Q252905"); // 7.00.770
versionToOS.put(0x070002e9, "7.0 SP1+Q253738"); // 7.00.745
versionToOS.put(0x070002d2, "7.0 SP1+Q239458"); // 7.00.722
versionToOS.put(0x070002bb, "7.0 SP1"); // 7.00.699
versionToOS.put(0x070002b1, "7.0 SP1 Beta"); // 7.00.689
versionToOS.put(0x070002a5, "7.0 MSDE O2K Dev"); // 7.00.677
versionToOS.put(0x07000296, "7.0 Gold+Q232707"); // 7.00.662
versionToOS.put(0x07000292, "7.0 Gold+Q244763"); // 7.00.658
versionToOS.put(0x07000291, "7.0 Gold+Q229875"); // 7.00.657
versionToOS.put(0x07000283, "7.0 Gold+Q220156"); // 7.00.643
versionToOS.put(0x0700026f, "7.0 Gold (RTM), no SP"); // 7.00.623
versionToOS.put(0x07000247, "7.0 RC1"); // 7.00.583
versionToOS.put(0x07000205, "7.0 Beta 3"); // 7.00.517
versionToOS.put(0x063201df, "6.5 Post SP5a"); // 6.50.479
versionToOS.put(0x063201a0, "6.5 Bad SP5a"); // 6.50.416
versionToOS.put(0x0632019f, "6.5 Bad SP5"); // 6.50.415
versionToOS.put(0x06320153, "6.5 Y2K Hotfix"); // 6.50.339
versionToOS.put(0x06320129, "6.5 Site Server 3"); // 6.50.297
versionToOS.put(0x06320119, "6.5 SP4"); // 6.50.281
versionToOS.put(0x06320103, "6.5 SP3 SBS Only"); // 6.50.259
versionToOS.put(0x06320102, "6.5 SP3"); // 6.50.258
versionToOS.put(0x063200fc, "6.5 Bad SP3"); // 6.50.252
versionToOS.put(0x063200f0, "6.5 SP2"); // 6.50.240
versionToOS.put(0x063200d5, "6.5 SP1"); // 6.50.213
versionToOS.put(0x063200c9, "6.5 Gold"); // 6.50.201
versionToOS.put(0x06000097, "6.0 SP3"); // 6.00.151
versionToOS.put(0x0600008b, "6.0 SP2"); // 6.00.139
versionToOS.put(0x0600007c, "6.0 SP1"); // 6.00.124
versionToOS.put(0x06000079, "6.0 No SP"); // 6.00.121
versionToOS.put(0x080008c9, "2000 SP4+Q936232"); // 8.00.2249
versionToOS.put(0x080008c8, "2000 SP4+Q935950"); // 8.00.2248
versionToOS.put(0x080008c5, "2000 SP4+Q933573"); // 8.00.2245
versionToOS.put(0x080008c4, "2000 SP4+Q934203"); // 8.00.2244
versionToOS.put(0x080008be, "2000 SP4+Q931932"); // 8.00.2238
versionToOS.put(0x080008b8, "2000 SP4+Q928568"); // 8.00.2232
versionToOS.put(0x080008b7, "2000 SP4+Q928079"); // 8.00.2231
versionToOS.put(0x080008aa, "2000 SP4+Q925297"); // 8.00.2218
versionToOS.put(0x080008a1, "2000 SP4+Q923797"); // 8.00.2209
versionToOS.put(0x0800089f, "2000 SP4+Q923344"); // 8.00.2207
versionToOS.put(0x08000899, "2000 SP4+Q920930"); // 8.00.2201
versionToOS.put(0x08000897, "2000 SP4+Q919221"); // 8.00.2199
versionToOS.put(0x08000894, "2000 SP4+Q919165"); // 8.00.2196
versionToOS.put(0x08000890, "2000 SP4+Q917606"); // 8.00.2192
versionToOS.put(0x08000884, "2000 SP4+Q913684 (64bit)"); // 8.00.2180
versionToOS.put(0x0800087c, "2000 SP4+Q910707"); // 8.00.2172
versionToOS.put(0x0800087b, "2000 SP4+Q909369"); // 8.00.2171
versionToOS.put(0x08000878, "2000 SP4+Q907813"); // 8.00.2168
versionToOS.put(0x08000877, "2000 SP4+Q921293"); // 8.00.2167
versionToOS.put(0x08000876, "2000 SP4+Q909734"); // 8.00.2166
versionToOS.put(0x08000872, "2000 SP4+Q904660"); // 8.00.2162
versionToOS.put(0x0800086c, "2000 SP4+Q906790"); // 8.00.2156
versionToOS.put(0x08000864, "2000 SP4+Q899430/31/900390/404/901212/902150/955"); // 8.00.2148
versionToOS.put(0x08000863, "2000 SP4+Q899410"); // 8.00.2147
versionToOS.put(0x08000861, "2000 SP4+Q826906/836651"); // 8.00.2145
versionToOS.put(0x080007f8, "2000 SP4+Q899761"); // 8.00.2040
versionToOS.put(0x080007f7, "2000 SP4 "); // 8.00.2039
versionToOS.put(0x080007ea, "2000 SP4 Beta"); // 8.00.2026
versionToOS.put(0x0800060b, "2000 SP3+Q899410"); // 8.00.1547
versionToOS.put(0x0800040d, "2000 SP3+Q930484"); // 8.00.1037
versionToOS.put(0x0800040c, "2000 SP3+Q929410"); // 8.00.1036
versionToOS.put(0x0800040b, "2000 SP3+Q917593"); // 8.00.1035
versionToOS.put(0x0800040a, "2000 SP3+Q915328"); // 8.00.1034
versionToOS.put(0x08000405, "2000 SP3+Q902852"); // 8.00.1029
versionToOS.put(0x08000403, "2000 SP3+Q900416"); // 8.00.1027
versionToOS.put(0x08000401, "2000 SP3+Q899428/899430"); // 8.00.1025
versionToOS.put(0x08000400, "2000 SP3+Q898709"); // 8.00.1024
versionToOS.put(0x080003fd, "2000 SP3+Q887700"); // 8.00.1021
versionToOS.put(0x080003fc, "2000 SP3+Q896985"); // 8.00.1020
versionToOS.put(0x080003fb, "2000 SP3+Q897572"); // 8.00.1019
versionToOS.put(0x080003f9, "2000 SP3+Q896425"); // 8.00.1017
versionToOS.put(0x080003f6, "2000 SP3+Q895123/187"); // 8.00.1014
versionToOS.put(0x080003f5, "2000 SP3+Q891866"); // 8.00.1013
versionToOS.put(0x080003f1, "2000 SP3+Q894257"); // 8.00.1009
versionToOS.put(0x080003ef, "2000 SP3+Q893312"); // 8.00.1007
versionToOS.put(0x080003e8, "2000 SP3+Q891585"); // 8.00.1000
versionToOS.put(0x080003e5, "2000 SP3+Q891311"); // 8.00.997
versionToOS.put(0x080003e4, "2000 SP3+Q891017/891268"); // 8.00.996
versionToOS.put(0x080003e2, "2000 SP3+Q890942/768/767"); // 8.00.994
versionToOS.put(0x080003e1, "2000 SP3+Q890925/888444/890742"); // 8.00.993
versionToOS.put(0x080003df, "2000 SP3+Q889314"); // 8.00.991
versionToOS.put(0x080003de, "2000 SP3+Q890200"); // 8.00.990
versionToOS.put(0x080003dc, "2000 SP3+Q889166"); // 8.00.988
versionToOS.put(0x080003d9, "2000 SP3+Q889239"); // 8.00.985
versionToOS.put(0x080003d4, "2000 SP3+Q887974"); // 8.00.980
versionToOS.put(0x080003d1, "2000 SP3+Q888007 "); // 8.00.977
versionToOS.put(0x080003cd, "2000 SP3+Q884554"); // 8.00.973
versionToOS.put(0x080003cc, "2000 SP3+Q885290"); // 8.00.972
versionToOS.put(0x080003ca, "2000 SP3+Q872842"); // 8.00.970
versionToOS.put(0x080003c7, "2000 SP3+Q878501"); // 8.00.967
versionToOS.put(0x080003c2, "2000 SP3+Q883415"); // 8.00.962
versionToOS.put(0x080003c1, "2000 SP3+Q873446"); // 8.00.961
versionToOS.put(0x080003bf, "2000 SP3+Q878500"); // 8.00.959
versionToOS.put(0x080003bd, "2000 SP3+Q870994"); // 8.00.957
versionToOS.put(0x080003bb, "2000 SP3+Q867798"); // 8.00.955
versionToOS.put(0x080003ba, "2000 SP3+Q843282"); // 8.00.954
versionToOS.put(0x080003b8, "2000 SP3+Q867878/867879/867880"); // 8.00.952
versionToOS.put(0x080003b0, "2000 SP3+Q839280"); // 8.00.944
versionToOS.put(0x080003a9, "2000 SP3+Q841776"); // 8.00.937
versionToOS.put(0x080003a8, "2000 SP3+Q841627"); // 8.00.936
versionToOS.put(0x080003a7, "2000 SP3+Q841401"); // 8.00.935
versionToOS.put(0x080003a6, "2000 SP3+Q841404"); // 8.00.934
versionToOS.put(0x080003a5, "2000 SP3+Q840856"); // 8.00.933
versionToOS.put(0x080003a1, "2000 SP3+Q839529"); // 8.00.929
versionToOS.put(0x080003a0, "2000 SP3+Q839589"); // 8.00.928
versionToOS.put(0x0800039f, "2000 SP3+Q839688"); // 8.00.927
versionToOS.put(0x0800039e, "2000 SP3+Q839523"); // 8.00.926
versionToOS.put(0x0800039b, "2000 SP3+Q838460"); // 8.00.923
versionToOS.put(0x0800039a, "2000 SP3+Q837970"); // 8.00.922
versionToOS.put(0x08000397, "2000 SP3+Q837957"); // 8.00.919
versionToOS.put(0x08000394, "2000 SP3+Q317989"); // 8.00.916
versionToOS.put(0x08000393, "2000 SP3+Q837401"); // 8.00.915
versionToOS.put(0x08000391, "2000 SP3+Q836651"); // 8.00.913
versionToOS.put(0x0800038f, "2000 SP3+Q837957"); // 8.00.911
versionToOS.put(0x0800038e, "2000 SP3+Q834798"); // 8.00.910
versionToOS.put(0x0800038c, "2000 SP3+Q834290"); // 8.00.908
versionToOS.put(0x08000388, "2000 SP3+Q834453"); // 8.00.904
versionToOS.put(0x0800037c, "2000 SP3+Q833710"); // 8.00.892
versionToOS.put(0x0800037b, "2000 SP3+Q836141"); // 8.00.891
versionToOS.put(0x0800036f, "2000 SP3+Q832977"); // 8.00.879
versionToOS.put(0x0800036e, "2000 SP3+Q831950"); // 8.00.878
versionToOS.put(0x0800036c, "2000 SP3+Q830912/831997/831999"); // 8.00.876
versionToOS.put(0x08000369, "2000 SP3+Q830887"); // 8.00.873
versionToOS.put(0x08000367, "2000 SP3+Q830767/830860"); // 8.00.871
versionToOS.put(0x08000366, "2000 SP3+Q830262"); // 8.00.870
versionToOS.put(0x08000365, "2000 SP3+Q830588"); // 8.00.869
versionToOS.put(0x08000363, "2000 SP3+Q830366"); // 8.00.867
versionToOS.put(0x08000362, "2000 SP3+Q830366"); // 8.00.866
versionToOS.put(0x08000361, "2000 SP3+Q830395/828945"); // 8.00.865
versionToOS.put(0x0800035f, "2000 SP3+Q829205/829444"); // 8.00.863
versionToOS.put(0x0800035b, "2000 SP3+Q821334 *May contain errors*"); // 8.00.859
versionToOS.put(0x0800035a, "2000 SP3+Q828637"); // 8.00.858
versionToOS.put(0x08000359, "2000 SP3+Q828017/827714/828308"); // 8.00.857
versionToOS.put(0x08000358, "2000 SP3+Q828096"); // 8.00.856
versionToOS.put(0x08000356, "2000 SP3+Q828699"); // 8.00.854
versionToOS.put(0x08000354, "2000 SP3+Q830466/827954"); // 8.00.852
versionToOS.put(0x08000353, "2000 SP3+Q826754"); // 8.00.851
versionToOS.put(0x08000352, "2000 SP3+Q826860/826815/826906"); // 8.00.850
versionToOS.put(0x08000350, "2000 SP3+Q826822"); // 8.00.848
versionToOS.put(0x0800034f, "2000 SP3+Q826433"); // 8.00.847
versionToOS.put(0x0800034d, "2000 SP3+Q826364/825854"); // 8.00.845
versionToOS.put(0x0800034c, "2000 SP3+Q826080"); // 8.00.844
versionToOS.put(0x0800034a, "2000 SP3+Q825043"); // 8.00.842
versionToOS.put(0x08000349, "2000 SP3+Q825225"); // 8.00.841
versionToOS.put(0x08000348, "2000 SP3+Q319477/319477"); // 8.00.840
versionToOS.put(0x08000347, "2000 SP3+Q823877/824027/820788"); // 8.00.839
versionToOS.put(0x08000345, "2000 SP3+Q821741/548/740/823514"); // 8.00.837
versionToOS.put(0x08000333, "2000 SP3+Q826161"); // 8.00.819
versionToOS.put(0x08000332, "2000 SP3+Q821277/337/818388/826161/821280"); // 8.00.818
versionToOS.put(0x08000330, "2000 SP3+Q818766"); // 8.00.816
versionToOS.put(0x0800032e, "2000 SP3+Q819662"); // 8.00.814
versionToOS.put(0x0800032b, "2000 SP3+Q819248/819662/818897"); // 8.00.811
versionToOS.put(0x08000327, "2000 SP3+Q818899"); // 8.00.807
versionToOS.put(0x08000324, "2000 SP3+Q818729"); // 8.00.804
versionToOS.put(0x08000321, "2000 SP3+Q818540"); // 8.00.801
versionToOS.put(0x08000320, "2000 SP3+Q818414/097/188"); // 8.00.800
versionToOS.put(0x0800031e, "2000 SP3+Q817464"); // 8.00.798
versionToOS.put(0x0800031a, "2000 SP3+Q817464/813524/816440/817709"); // 8.00.794
versionToOS.put(0x08000317, "2000 SP3+Q815249"); // 8.00.791
versionToOS.put(0x08000316, "2000 SP3+Q817081"); // 8.00.790
versionToOS.put(0x08000315, "2000 SP3+Q816840"); // 8.00.789
versionToOS.put(0x08000314, "2000 SP3+Q816985"); // 8.00.788
versionToOS.put(0x0800030d, "2000 SP3+Q815057"); // 8.00.781
versionToOS.put(0x0800030c, "2000 SP3+Q816084/810185"); // 8.00.780
versionToOS.put(0x0800030b, "2000 SP3+Q814035"); // 8.00.779
versionToOS.put(0x08000308, "2000 SP3+Unidentified"); // 8.00.776
versionToOS.put(0x08000307, "2000 SP3+Q815115"); // 8.00.775
versionToOS.put(0x08000301, "2000 SP3+Q814889/93"); // 8.00.769
versionToOS.put(0x080002fb, "2000 SP3+Q814113"); // 8.00.763
versionToOS.put(0x080002fa, "2000 SP3+Q814032"); // 8.00.762
versionToOS.put(0x080002f8, "2000 SP3/SP3a"); // 8.00.760
versionToOS.put(0x080002e7, "2000 SP2+Q818406/763"); // 8.00.743
versionToOS.put(0x080002e5, "2000 SP2+Q818096"); // 8.00.741
versionToOS.put(0x080002e0, "2000 SP2+Q816937"); // 8.00.736
versionToOS.put(0x080002df, "2000 SP2+Q814889"); // 8.00.735
versionToOS.put(0x080002dd, "2000 SP2+Q813759"); // 8.00.733
versionToOS.put(0x080002da, "2000 SP2+Q813769"); // 8.00.730
versionToOS.put(0x080002d8, "2000 SP2+Q814460"); // 8.00.728
versionToOS.put(0x080002d5, "2000 SP2+Q812995/813494"); // 8.00.725
versionToOS.put(0x080002d3, "2000 SP2+Q812798"); // 8.00.723
versionToOS.put(0x080002d1, "2000 SP2+Q812250/812393"); // 8.00.721
versionToOS.put(0x080002ce, "2000 SP2+Q811703"); // 8.00.718
versionToOS.put(0x080002cb, "2000 SP2+Q810688/811611"); // 8.00.715
versionToOS.put(0x080002ca, "2000 SP2+Q811478"); // 8.00.714
versionToOS.put(0x080002c9, "2000 SP2/3+Q811205"); // 8.00.713
versionToOS.put(0x080002c6, "2000 SP2/3+Q811052"); // 8.00.710
versionToOS.put(0x080002c1, "2000 SP2+Q810920"); // 8.00.705
versionToOS.put(0x080002bf, "2000 SP2+Q810526"); // 8.00.703
versionToOS.put(0x080002be, "2000 SP2+Q328551"); // 8.00.702
versionToOS.put(0x080002bd, "2000 SP2+Q810026/810163"); // 8.00.701
versionToOS.put(0x080002bc, "2000 SP2+Q810072"); // 8.00.700
versionToOS.put(0x080002b8, "2000 SP2+Q810052/10"); // 8.00.696
versionToOS.put(0x080002b7, "2000 SP2+Q331885/965/968"); // 8.00.695
versionToOS.put(0x080002b5, "2000 SP2+Q330212"); // 8.00.693
versionToOS.put(0x080002b1, "2000 SP2+Q329499"); // 8.00.689
versionToOS.put(0x080002b0, "2000 SP2+Q329487"); // 8.00.688
versionToOS.put(0x080002ae, "2000 SP2+Q316333"); // 8.00.686
versionToOS.put(0x080002aa, "2000 SP3+Q319851"); // 8.00.682
versionToOS.put(0x080002a7, "2000 SP2+Q316333"); // 8.00.679
versionToOS.put(0x080002a6, "2000 SP2+Q328354"); // 8.00.678
versionToOS.put(0x0800029b, "2000 SP2+8/14 fix"); // 8.00.667
versionToOS.put(0x08000299, "2000 SP2+8/8 fix"); // 8.00.665
versionToOS.put(0x08000295, "2000 SP2+Q326999"); // 8.00.661
versionToOS.put(0x0800028f, "2000 SP2+7/24 fix"); // 8.00.655
versionToOS.put(0x0800028c, "2000 SP2+Q810010?"); // 8.00.652
versionToOS.put(0x0800028a, "2000 SP2+Q322853"); // 8.00.650
versionToOS.put(0x08000284, "2000 SP2+Q324186"); // 8.00.644
versionToOS.put(0x08000260, "2000 SP2+Q319507"); // 8.00.608
versionToOS.put(0x0800025c, "2000 SP2+3/29 fix"); // 8.00.604
versionToOS.put(0x08000252, "2000 SP2+Q319477/319477"); // 8.00.594
versionToOS.put(0x08000242, "2000 SP2+Q317979/318045"); // 8.00.578
versionToOS.put(0x08000231, "2000 SP2+1/29 fix"); // 8.00.561
versionToOS.put(0x0800022e, "2000 SP2+Q314003/315395"); // 8.00.558
versionToOS.put(0x08000228, "2000 SP2+Q313002/5"); // 8.00.552
versionToOS.put(0x08000216, "2000 SP2.01"); // 8.00.534
versionToOS.put(0x08000214, "2000 SP2"); // 8.00.532
versionToOS.put(0x080001db, "2000 SP1+1/29 fix"); // 8.00.475
versionToOS.put(0x080001da, "2000 SP1+Q315395"); // 8.00.474
versionToOS.put(0x080001d9, "2000 SP1+Q314003"); // 8.00.473
versionToOS.put(0x080001d7, "2000 SP1+Q313302"); // 8.00.471
versionToOS.put(0x080001d5, "2000 SP1+Q313005"); // 8.00.469
versionToOS.put(0x080001c4, "2000 SP1+Q308547"); // 8.00.452
versionToOS.put(0x080001bc, "2000 SP1+Q307540/307655"); // 8.00.444
versionToOS.put(0x080001bb, "2000 SP1+Q307538"); // 8.00.443
versionToOS.put(0x080001ac, "2000 SP1+Q304850"); // 8.00.428
versionToOS.put(0x08000180, "2000 SP1"); // 8.00.384
versionToOS.put(0x0800011f, "2000 No SP+Q297209"); // 8.00.287
versionToOS.put(0x080000fb, "2000 No SP+Q300194"); // 8.00.251
versionToOS.put(0x080000fa, "2000 No SP+Q291683"); // 8.00.250
versionToOS.put(0x080000f9, "2000 No SP+Q288122"); // 8.00.249
versionToOS.put(0x080000ef, "2000 No SP+Q285290"); // 8.00.239
versionToOS.put(0x080000e9, "2000 No SP+Q282416"); // 8.00.233
versionToOS.put(0x080000e7, "2000 No SP+Q282279"); // 8.00.231
versionToOS.put(0x080000e2, "2000 No SP+Q278239"); // 8.00.226
versionToOS.put(0x080000e1, "2000 No SP+Q281663"); // 8.00.225
versionToOS.put(0x080000df, "2000 No SP+Q280380"); // 8.00.223
versionToOS.put(0x080000de, "2000 No SP+Q281769"); // 8.00.222
versionToOS.put(0x080000da, "2000 No SP+Q279183"); // 8.00.218
versionToOS.put(0x080000d9, "2000 No SP+Q279293/279296"); // 8.00.217
versionToOS.put(0x080000d3, "2000 No SP+Q276329"); // 8.00.211
versionToOS.put(0x080000d2, "2000 No SP+Q275900"); // 8.00.210
versionToOS.put(0x080000cd, "2000 No SP+Q274330"); // 8.00.205
versionToOS.put(0x080000cc, "2000 No SP+Q274329"); // 8.00.204
versionToOS.put(0x080000c2, "2000 RTM/No SP"); // 8.00.194
versionToOS.put(0x080000be, "2000 Gold, no SP"); // 8.00.190
versionToOS.put(0x08000064, "2000 Beta 2"); // 8.00.100
versionToOS.put(0x0800004e, "2000 EAP5"); // 8.00.078
versionToOS.put(0x0800002f, "2000 EAP4"); // 8.00.047
}
public Map<String,String> detect(String trigger, String response) {
if (!responsePattern.matcher(response).matches()) return null;
Map<String,String> answer = new HashMap<String,String>();
answer.put("serviceType", "MSSQL");
byte[] data = null;
try {
data = response.getBytes("iso-8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// XXX data = ?, return?
}
if (data == null || data.length == 0) {
return answer;
}
ByteBuffer buffer = ByteBuffer.wrap(data);
if (buffer.get() != 0x04) {
return answer;
}
if (buffer.get() != 0x01) {
return answer;
}
int buflen = buffer.getShort() & 0xffff;
if (buflen < 19) {
return answer;
}
buffer.position(0x0b);
if (buffer.getShort() != 6) {
return answer;
}
buffer.position(0x09);
int index = buffer.getShort() + 8;
if ((index + 6) > buflen) {
return answer;
}
buffer.position(index);
int version = buffer.getInt();
String versionString = String.format("%d.%d.%d", version >> 24, (version >> 16) & 0xff, version & 0xffff);
answer.put("version", versionString);
String banner = versionString;
String os = versionToOS.get(version);
if (os != null) {
answer.put("os", "Windows "+os);
banner = banner+" "+os;
} else {
answer.put("os", "Windows");
}
answer.put("arch", "i386"); // FIXME x86_64
answer.put("banner", banner);
return answer;
}
public PortSet getPorts() {
return new PortSet("1433");
}
public String getProtocol() {
return "tcp";
}
}