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)"),