diff --git a/extra/sqlharvest/sqlharvest.py b/extra/sqlharvest/sqlharvest.py
index 582110641..212ba0fca 100644
--- a/extra/sqlharvest/sqlharvest.py
+++ b/extra/sqlharvest/sqlharvest.py
@@ -43,7 +43,7 @@ def main():
if not config.has_option("options", "index"):
config.set("options", "index", "0")
- i = int(config.get("options", "index"))
+ i = int(config.get("options", "index"))
try:
with open(TABLES_FILE, 'r') as f:
diff --git a/lib/controller/controller.py b/lib/controller/controller.py
index 0f57eb631..ad9e44b3a 100644
--- a/lib/controller/controller.py
+++ b/lib/controller/controller.py
@@ -294,7 +294,7 @@ def start():
if conf.forms:
message = "[#%d] form:\n%s %s" % (hostCount, conf.method or HTTPMETHOD.GET, targetUrl)
else:
- message = "url %d:\n%s %s%s" % (hostCount, conf.method or HTTPMETHOD.GET, targetUrl, " (PageRank: %s)" % get_pagerank(targetUrl) if conf.googleDork and conf.pageRank else "")
+ message = "url %d:\n%s %s%s" % (hostCount, conf.method or HTTPMETHOD.GET, targetUrl, " (PageRank: %s)" % get_pagerank(targetUrl) if conf.googleDork and conf.pageRank else "")
if conf.cookie:
message += "\nCookie: %s" % conf.cookie
@@ -617,4 +617,3 @@ def start():
logger.info(infoMsg)
return True
-
diff --git a/lib/controller/handler.py b/lib/controller/handler.py
index 1c3cfe042..045c4c0d5 100644
--- a/lib/controller/handler.py
+++ b/lib/controller/handler.py
@@ -56,7 +56,7 @@ def setHandler():
("Firebird", FIREBIRD_ALIASES, FirebirdMap, FirebirdConn),
("SAP MaxDB", MAXDB_ALIASES, MaxDBMap, MaxDBConn),
("Sybase", SYBASE_ALIASES, SybaseMap, SybaseConn),
- ("IBM DB2", DB2_ALIASES, DB2Map, DB2Conn)
+ ("IBM DB2", DB2_ALIASES, DB2Map, DB2Conn),
]
_ = max(_ if (Backend.getIdentifiedDbms() or "").lower() in _[1] else None for _ in items)
diff --git a/lib/core/agent.py b/lib/core/agent.py
index 53cbaf8fc..4b1693ee4 100644
--- a/lib/core/agent.py
+++ b/lib/core/agent.py
@@ -223,7 +223,7 @@ class Agent(object):
_ = (
("[DELIMITER_START]", kb.chars.start), ("[DELIMITER_STOP]", kb.chars.stop),\
("[AT_REPLACE]", kb.chars.at), ("[SPACE_REPLACE]", kb.chars.space), ("[DOLLAR_REPLACE]", kb.chars.dollar),\
- ("[HASH_REPLACE]", kb.chars.hash_)
+ ("[HASH_REPLACE]", kb.chars.hash_),
)
payload = reduce(lambda x, y: x.replace(y[0], y[1]), _, payload)
diff --git a/lib/core/defaults.py b/lib/core/defaults.py
index ed51735b0..03d070ae4 100644
--- a/lib/core/defaults.py
+++ b/lib/core/defaults.py
@@ -8,21 +8,21 @@ See the file 'doc/COPYING' for copying permission
from lib.core.datatype import AttribDict
_defaults = {
- "csvDel": ",",
- "timeSec": 5,
- "googlePage": 1,
- "cpuThrottle": 5,
- "verbose": 1,
- "delay": 0,
- "timeout": 30,
- "retries": 3,
- "saFreq": 0,
- "threads": 1,
- "level": 1,
- "risk": 1,
- "dumpFormat": "CSV",
- "tech": "BEUSTQ",
- "torType": "HTTP"
- }
+ "csvDel": ",",
+ "timeSec": 5,
+ "googlePage": 1,
+ "cpuThrottle": 5,
+ "verbose": 1,
+ "delay": 0,
+ "timeout": 30,
+ "retries": 3,
+ "saFreq": 0,
+ "threads": 1,
+ "level": 1,
+ "risk": 1,
+ "dumpFormat": "CSV",
+ "tech": "BEUSTQ",
+ "torType": "HTTP",
+}
defaults = AttribDict(_defaults)
diff --git a/lib/core/dicts.py b/lib/core/dicts.py
index 842314783..926395d6a 100644
--- a/lib/core/dicts.py
+++ b/lib/core/dicts.py
@@ -34,7 +34,7 @@ FIREBIRD_TYPES = {
"12": "DATE",
"13": "TIME",
"35": "TIMESTAMP",
- "37": "VARCHAR"
+ "37": "VARCHAR",
}
SYBASE_TYPES = {
@@ -109,7 +109,7 @@ FIREBIRD_PRIVS = {
"U": "UPDATE",
"D": "DELETE",
"R": "REFERENCES",
- "E": "EXECUTE"
+ "E": "EXECUTE",
}
DB2_PRIVS = {
@@ -120,7 +120,7 @@ DB2_PRIVS = {
5: "INSERTAUTH",
6: "REFAUTH",
7: "SELECTAUTH",
- 8: "UPDATEAUTH"
+ 8: "UPDATEAUTH",
}
DUMP_REPLACEMENTS = {" ": NULL, "": BLANK}
@@ -135,7 +135,7 @@ DBMS_DICT = {
DBMS.FIREBIRD: (FIREBIRD_ALIASES, "python-kinterbasdb", "http://kinterbasdb.sourceforge.net/"),
DBMS.MAXDB: (MAXDB_ALIASES, None, None),
DBMS.SYBASE: (SYBASE_ALIASES, "python-pymssql", "http://pymssql.sourceforge.net/"),
- DBMS.DB2: (DB2_ALIASES, "python ibm-db", "http://code.google.com/p/ibm-db/")
+ DBMS.DB2: (DB2_ALIASES, "python ibm-db", "http://code.google.com/p/ibm-db/"),
}
FROM_DUMMY_TABLE = {
@@ -143,11 +143,11 @@ FROM_DUMMY_TABLE = {
DBMS.ACCESS: " FROM MSysAccessObjects",
DBMS.FIREBIRD: " FROM RDB$DATABASE",
DBMS.MAXDB: " FROM VERSIONS",
- DBMS.DB2: " FROM SYSIBM.SYSDUMMY1"
+ DBMS.DB2: " FROM SYSIBM.SYSDUMMY1",
}
SQL_STATEMENTS = {
- "SQL SELECT statement": (
+ "SQL SELECT statement": (
"select ",
"show ",
" top ",
@@ -162,44 +162,46 @@ SQL_STATEMENTS = {
" offset ",
" union all ",
" rownum as ",
- "(case ", ),
+ "(case ", ),
- "SQL data definition": (
+ "SQL data definition": (
"create ",
"declare ",
"drop ",
"truncate ",
- "alter ", ),
+ "alter ", ),
- "SQL data manipulation": (
+ "SQL data manipulation": (
"bulk ",
"insert ",
"update ",
"delete ",
"merge ",
- "load ", ),
+ "load ", ),
- "SQL data control": (
+ "SQL data control": (
"grant ",
- "revoke ", ),
+ "revoke ", ),
- "SQL data execution": (
+ "SQL data execution": (
"exec ",
- "execute ", ),
+ "execute ", ),
- "SQL transaction": (
+ "SQL transaction": (
"start transaction ",
"begin work ",
"begin transaction ",
"commit ",
- "rollback ", ),
+ "rollback ", ),
}
POST_HINT_CONTENT_TYPES = {
POST_HINT.JSON: "application/json",
POST_HINT.MULTIPART: "multipart/form-data",
POST_HINT.SOAP: "application/soap+xml",
- POST_HINT.XML: "application/xml"
+ POST_HINT.XML: "application/xml",
}
-DEPRECATED_HINTS = {"--replicate": "use '--dump-format=SQLITE' instead"}
+DEPRECATED_HINTS = {
+ "--replicate": "use '--dump-format=SQLITE' instead",
+ }
diff --git a/lib/core/enums.py b/lib/core/enums.py
index bd606d080..a5b649013 100644
--- a/lib/core/enums.py
+++ b/lib/core/enums.py
@@ -178,7 +178,7 @@ class PAYLOAD:
3: "UNION query",
4: "stacked queries",
5: "AND/OR time-based blind",
- 6: "inline query"
+ 6: "inline query",
}
PARAMETER = {
@@ -186,14 +186,14 @@ class PAYLOAD:
2: "Single quoted string",
3: "LIKE single quoted string",
4: "Double quoted string",
- 5: "LIKE double quoted string"
+ 5: "LIKE double quoted string",
}
RISK = {
0: "No risk",
1: "Low risk",
2: "Medium risk",
- 3: "High risk"
+ 3: "High risk",
}
CLAUSE = {
@@ -205,7 +205,7 @@ class PAYLOAD:
5: "OFFSET",
6: "TOP",
7: "Table name",
- 8: "Column name"
+ 8: "Column name",
}
class METHOD:
diff --git a/lib/core/option.py b/lib/core/option.py
index 2a9bcaaaf..19f4ff2c4 100644
--- a/lib/core/option.py
+++ b/lib/core/option.py
@@ -244,7 +244,7 @@ def _feedTargetsDict(reqFile, addedTargetUrls):
else:
scheme, port = None, None
- if not re.search (r"^[\n]*(GET|POST).*?\sHTTP\/", request, re.I | re.M):
+ if not re.search(r"^[\n]*(GET|POST).*?\sHTTP\/", request, re.I | re.M):
continue
if re.search(r"^[\n]*(GET|POST).*?\.(%s)\sHTTP\/" % "|".join(CRAWL_EXCLUDE_EXTENSIONS), request, re.I | re.M):
@@ -353,6 +353,7 @@ def _loadQueries():
class DictObject(object):
def __init__(self):
self.__dict__ = {}
+
def __contains__(self, name):
return name in self.__dict__
@@ -1247,7 +1248,7 @@ def _setHTTPUserAgent():
if count == 1:
userAgent = kb.userAgents[0]
else:
- userAgent = kb.userAgents[randomRange(stop=count-1)]
+ userAgent = kb.userAgents[randomRange(stop=count - 1)]
userAgent = sanitizeStr(userAgent)
conf.httpHeaders.append((HTTPHEADER.USER_AGENT, userAgent))
@@ -1821,7 +1822,7 @@ class LogRecorder(logging.StreamHandler):
"""
self.loghist.append({'levelname': record.levelname,
'text': record.msg % record.args if record.args else record.msg,
- 'id': len(self.loghist)+1})
+ 'id': len(self.loghist) + 1})
if conf.fdLog:
# TODO: this is very heavy operation and slows down a lot the
@@ -2009,7 +2010,7 @@ def _basicOptionValidation():
errMsg = "maximum number of used threads is %d avoiding possible connection issues" % MAX_NUMBER_OF_THREADS
raise SqlmapSyntaxException(errMsg)
- if conf.forms and not any ((conf.url, conf.bulkFile)):
+ if conf.forms and not any((conf.url, conf.bulkFile)):
errMsg = "switch '--forms' requires usage of option '-u' (--url) or '-m'"
raise SqlmapSyntaxException(errMsg)
diff --git a/lib/core/optiondict.py b/lib/core/optiondict.py
index 4278c1214..44825d5cd 100644
--- a/lib/core/optiondict.py
+++ b/lib/core/optiondict.py
@@ -18,7 +18,7 @@ optDict = {
"requestFile": "string",
"sessionFile": "string",
"googleDork": "string",
- "configFile": "string"
+ "configFile": "string",
},
"Request": {
@@ -47,7 +47,7 @@ optDict = {
"safUrl": "string",
"saFreq": "integer",
"skipUrlEncode": "boolean",
- "evalCode": "string"
+ "evalCode": "string",
},
"Optimization": {
@@ -55,7 +55,7 @@ optDict = {
"predictOutput": "boolean",
"keepAlive": "boolean",
"nullConnection": "boolean",
- "threads": "integer"
+ "threads": "integer",
},
"Injection": {
@@ -69,7 +69,7 @@ optDict = {
"prefix": "string",
"suffix": "string",
"skip": "string",
- "tamper": "string"
+ "tamper": "string",
},
"Detection": {
@@ -80,7 +80,7 @@ optDict = {
"regexp": "string",
"code": "integer",
"textOnly": "boolean",
- "titles": "boolean"
+ "titles": "boolean",
},
"Techniques": {
@@ -89,11 +89,11 @@ optDict = {
"uCols": "string",
"uChar": "string",
"dnsName": "string",
- "secondOrder": "string"
+ "secondOrder": "string",
},
"Fingerprint": {
- "extensiveFp": "boolean"
+ "extensiveFp": "boolean",
},
"Enumeration": {
@@ -126,23 +126,23 @@ optDict = {
"lastChar": "integer",
"query": "string",
"sqlShell": "boolean",
- "sqlFile": "string"
+ "sqlFile": "string",
},
"Brute": {
"commonTables": "boolean",
- "commonColumns": "boolean"
+ "commonColumns": "boolean",
},
"User-defined function": {
"udfInject": "boolean",
- "shLib": "string"
+ "shLib": "string",
},
"File system": {
"rFile": "string",
"wFile": "string",
- "dFile": "string"
+ "dFile": "string",
},
"Takeover": {
@@ -153,7 +153,7 @@ optDict = {
"osBof": "boolean",
"privEsc": "boolean",
"msfPath": "string",
- "tmpPath": "string"
+ "tmpPath": "string",
},
"Windows": {
@@ -163,7 +163,7 @@ optDict = {
"regKey": "string",
"regVal": "string",
"regData": "string",
- "regType": "string"
+ "regType": "string",
},
"General": {
@@ -208,7 +208,7 @@ optDict = {
"smart": "boolean",
"testFilter": "string",
"wizard": "boolean",
- "verbose": "integer"
+ "verbose": "integer",
},
"Hidden": {
"profile": "boolean",
@@ -217,6 +217,6 @@ optDict = {
"smokeTest": "boolean",
"liveTest": "boolean",
"stopFail": "boolean",
- "runCase": "string"
+ "runCase": "string",
}
}
diff --git a/lib/core/settings.py b/lib/core/settings.py
index d43cc5ba0..dbc6241ee 100644
--- a/lib/core/settings.py
+++ b/lib/core/settings.py
@@ -201,7 +201,7 @@ BASIC_HELP_ITEMS = (
"checkTor",
"flushSession",
"tor",
- "wizard"
+ "wizard",
)
# String representation for NULL value
@@ -218,7 +218,7 @@ ERROR_PARSING_REGEXES = (
r"[^<]*(fatal|error|warning|exception)[^<]*:?\s*(?P.+?)
",
r"(?m)^(fatal|error|warning|exception):?\s*(?P.+?)$",
r"Error Type:
(?P.+?)",
- r"error '[0-9a-f]{8}'((<[^>]+>)|\s)+(?P[^<>]+)"
+ r"error '[0-9a-f]{8}'((<[^>]+>)|\s)+(?P[^<>]+)",
)
# Regular expression used for parsing charset info from meta html headers
diff --git a/lib/core/subprocessng.py b/lib/core/subprocessng.py
index a8e5a56ea..717b52190 100644
--- a/lib/core/subprocessng.py
+++ b/lib/core/subprocessng.py
@@ -49,7 +49,7 @@ def blockingReadFromFD(fd):
break
if not output:
- raise EOFError("fd %s has been closed." % fd )
+ raise EOFError("fd %s has been closed." % fd)
return output
diff --git a/lib/parse/cmdline.py b/lib/parse/cmdline.py
index b55d856bd..96c9e5c6a 100644
--- a/lib/parse/cmdline.py
+++ b/lib/parse/cmdline.py
@@ -517,7 +517,7 @@ def cmdLineParser():
# General options
general = OptionGroup(parser, "General", "These options can be used "
- "to set some general working parameters" )
+ "to set some general working parameters")
#general.add_option("-x", dest="xmlFile",
# help="Dump the data into an XML file")
diff --git a/lib/parse/headers.py b/lib/parse/headers.py
index 48da4fed3..5f2a80069 100644
--- a/lib/parse/headers.py
+++ b/lib/parse/headers.py
@@ -30,7 +30,7 @@ def headersParser(headers):
"servlet-engine": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "servlet.xml"),
"set-cookie": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "cookie.xml"),
"x-aspnet-version": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "x-aspnet-version.xml"),
- "x-powered-by": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "x-powered-by.xml")
+ "x-powered-by": os.path.join(paths.SQLMAP_XML_BANNER_PATH, "x-powered-by.xml"),
}
for header in itertools.ifilter(lambda x: x in kb.headerPaths, headers):
diff --git a/lib/request/basic.py b/lib/request/basic.py
index 30c226cdc..f4be97091 100644
--- a/lib/request/basic.py
+++ b/lib/request/basic.py
@@ -111,7 +111,7 @@ def checkCharEncoding(encoding, warn=True):
return encoding
# Reference: http://www.destructor.de/charsets/index.htm
- translate = { "windows-874": "iso-8859-11", "en_us": "utf8", "macintosh": "iso-8859-1", "euc_tw": "big5_tw", "th": "tis-620", "unicode": "utf8", "utc8": "utf8", "ebcdic": "ebcdic-cp-be"}
+ translate = {"windows-874": "iso-8859-11", "en_us": "utf8", "macintosh": "iso-8859-1", "euc_tw": "big5_tw", "th": "tis-620", "unicode": "utf8", "utc8": "utf8", "ebcdic": "ebcdic-cp-be"}
for delimiter in (';', ',', '('):
if delimiter in encoding:
diff --git a/lib/request/connect.py b/lib/request/connect.py
index 17f12fada..e4bcd7b34 100644
--- a/lib/request/connect.py
+++ b/lib/request/connect.py
@@ -189,7 +189,7 @@ class Connect(object):
ua = kwargs.get('ua', None)
referer = kwargs.get('referer', None)
host = kwargs.get('host', conf.host)
- direct_ = kwargs.get('direct', False)
+ direct_ = kwargs.get('direct', False)
multipart = kwargs.get('multipart', False)
silent = kwargs.get('silent', False)
raise404 = kwargs.get('raise404', True)
diff --git a/lib/takeover/metasploit.py b/lib/takeover/metasploit.py
index 5037ea075..bf9e93b34 100644
--- a/lib/takeover/metasploit.py
+++ b/lib/takeover/metasploit.py
@@ -86,7 +86,7 @@ class Metasploit:
2: ("Reverse TCP: Try to connect back from the database host to this machine, on all ports between the specified and 65535", "reverse_tcp_allports"),
3: ("Reverse HTTP: Connect back from the database host to this machine tunnelling traffic over HTTP", "reverse_http"),
4: ("Reverse HTTPS: Connect back from the database host to this machine tunnelling traffic over HTTPS", "reverse_https"),
- 5: ("Bind TCP: Listen on the database host for a connection", "bind_tcp")
+ 5: ("Bind TCP: Listen on the database host for a connection", "bind_tcp"),
},
"linux": {
1: ("Reverse TCP: Connect back from the database host to this machine (default)", "reverse_tcp"),
diff --git a/lib/takeover/registry.py b/lib/takeover/registry.py
index 23dc099bc..d6a8f38c6 100644
--- a/lib/takeover/registry.py
+++ b/lib/takeover/registry.py
@@ -33,18 +33,18 @@ class Registry:
self._batRead = (
"@ECHO OFF\r\n",
- readParse
- )
+ readParse,
+ )
self._batAdd = (
"@ECHO OFF\r\n",
- "REG ADD \"%s\" /v \"%s\" /t %s /d %s /f" % (self._regKey, self._regValue, self._regType, self._regData)
- )
+ "REG ADD \"%s\" /v \"%s\" /t %s /d %s /f" % (self._regKey, self._regValue, self._regType, self._regData),
+ )
self._batDel = (
"@ECHO OFF\r\n",
- "REG DELETE \"%s\" /v \"%s\" /f" % (self._regKey, self._regValue)
- )
+ "REG DELETE \"%s\" /v \"%s\" /f" % (self._regKey, self._regValue),
+ )
def _createLocalBatchFile(self):
self._batPathFp = open(self._batPathLocal, "w")
diff --git a/lib/utils/getch.py b/lib/utils/getch.py
index 1fa7b94c4..52ebd2c99 100644
--- a/lib/utils/getch.py
+++ b/lib/utils/getch.py
@@ -28,7 +28,10 @@ class _GetchUnix(object):
import tty
def __call__(self):
- import sys, tty, termios
+ import sys
+ import termios
+ import tty
+
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
diff --git a/lib/utils/hash.py b/lib/utils/hash.py
index 769f9bc3d..64974960d 100644
--- a/lib/utils/hash.py
+++ b/lib/utils/hash.py
@@ -298,7 +298,7 @@ __functions__ = {
HASH.MD5_GENERIC: md5_generic_passwd,
HASH.SHA1_GENERIC: sha1_generic_passwd,
HASH.CRYPT_GENERIC: crypt_generic_passwd,
- HASH.WORDPRESS: wordpress_passwd
+ HASH.WORDPRESS: wordpress_passwd,
}
def storeHashesToFile(attack_dict):
diff --git a/plugins/dbms/access/fingerprint.py b/plugins/dbms/access/fingerprint.py
index 20e8a9f12..3290ae374 100644
--- a/plugins/dbms/access/fingerprint.py
+++ b/plugins/dbms/access/fingerprint.py
@@ -52,7 +52,7 @@ class Fingerprint(GenericFingerprint):
"97": ("MSysModules2", "MSysAccessObjects"),
"2000" : ("!MSysModules2", "MSysAccessObjects"),
"2002-2003" : ("MSysAccessStorage", "!MSysNavPaneObjectIDs"),
- "2007" : ("MSysAccessStorage", "MSysNavPaneObjectIDs")
+ "2007" : ("MSysAccessStorage", "MSysNavPaneObjectIDs"),
}
# MSysAccessXML is not a reliable system table because it doesn't always exist
# ("Access through Access", p6, should be "normally doesn't exist" instead of "is normally empty")
diff --git a/plugins/dbms/firebird/fingerprint.py b/plugins/dbms/firebird/fingerprint.py
index 46beba669..21a4adcea 100644
--- a/plugins/dbms/firebird/fingerprint.py
+++ b/plugins/dbms/firebird/fingerprint.py
@@ -73,7 +73,7 @@ class Fingerprint(GenericFingerprint):
("1.0", ("EXISTS(SELECT CURRENT_USER FROM RDB$DATABASE)",)),
("1.5", ("NULLIF(%d,%d) IS NULL", "EXISTS(SELECT CURRENT_TRANSACTION FROM RDB$DATABASE)")),
("2.0", ("EXISTS(SELECT CURRENT_TIME(0) FROM RDB$DATABASE)", "BIT_LENGTH(%d)>0", "CHAR_LENGTH(%d)>0")),
- ("2.1", ("BIN_XOR(%d,%d)=0", "PI()>0.%d", "RAND()<1.%d", "FLOOR(1.%d)>=0"))
+ ("2.1", ("BIN_XOR(%d,%d)=0", "PI()>0.%d", "RAND()<1.%d", "FLOOR(1.%d)>=0")),
)
for i in xrange(len(table)):
diff --git a/plugins/dbms/mssqlserver/takeover.py b/plugins/dbms/mssqlserver/takeover.py
index 09415cfa5..7d2e971d1 100644
--- a/plugins/dbms/mssqlserver/takeover.py
+++ b/plugins/dbms/mssqlserver/takeover.py
@@ -41,7 +41,7 @@ class Takeover(GenericTakeover):
#"2003-2": ("CHAR(0xe4)+CHAR(0x37)+CHAR(0xea)+CHAR(0x7c)", "CHAR(0x15)+CHAR(0xc9)+CHAR(0x93)+CHAR(0x7c)", "CHAR(0x96)+CHAR(0xdc)+CHAR(0xa7)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x17)+CHAR(0xf5)+CHAR(0x83)+CHAR(0x7c)", "CHAR(0x1b)+CHAR(0xa0)+CHAR(0x86)+CHAR(0x7c)", "CHAR(0x1b)+CHAR(0xa0)+CHAR(0x86)+CHAR(0x7c)" ),
# 2003 Service Pack 2 updated at 05/2009
- "2003-2": ("CHAR(0xc3)+CHAR(0xdb)+CHAR(0x67)+CHAR(0x77)", "CHAR(0x15)+CHAR(0xc9)+CHAR(0x93)+CHAR(0x7c)", "CHAR(0x96)+CHAR(0xdc)+CHAR(0xa7)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x47)+CHAR(0xf5)+CHAR(0x83)+CHAR(0x7c)", "CHAR(0x0f)+CHAR(0x31)+CHAR(0x8e)+CHAR(0x7c)", "CHAR(0x0f)+CHAR(0x31)+CHAR(0x8e)+CHAR(0x7c)")
+ "2003-2": ("CHAR(0xc3)+CHAR(0xdb)+CHAR(0x67)+CHAR(0x77)", "CHAR(0x15)+CHAR(0xc9)+CHAR(0x93)+CHAR(0x7c)", "CHAR(0x96)+CHAR(0xdc)+CHAR(0xa7)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x73)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x47)+CHAR(0xf5)+CHAR(0x83)+CHAR(0x7c)", "CHAR(0x0f)+CHAR(0x31)+CHAR(0x8e)+CHAR(0x7c)", "CHAR(0x0f)+CHAR(0x31)+CHAR(0x8e)+CHAR(0x7c)"),
# 2003 Service Pack 2 updated at 09/2009
#"2003-2": ("CHAR(0xc3)+CHAR(0xc2)+CHAR(0xed)+CHAR(0x7c)", "CHAR(0xf3)+CHAR(0xd9)+CHAR(0xa7)+CHAR(0x7c)", "CHAR(0x99)+CHAR(0xc8)+CHAR(0x93)+CHAR(0x7c)", "CHAR(0x63)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x63)+CHAR(0x1e)+CHAR(0x8f)+CHAR(0x7c)", "CHAR(0x17)+CHAR(0xf5)+CHAR(0x83)+CHAR(0x7c)", "CHAR(0xa4)+CHAR(0xde)+CHAR(0x8e)+CHAR(0x7c)", "CHAR(0xa4)+CHAR(0xde)+CHAR(0x8e)+CHAR(0x7c)"),