104 self.__data.seek(0) |
104 self.__data.seek(0) |
105 self.__data.read(2) |
105 self.__data.read(2) |
106 sLenData = self.__data.read(4) |
106 sLenData = self.__data.read(4) |
107 lenData, = struct.unpack(">L", sLenData) # unsigned long, big-endian |
107 lenData, = struct.unpack(">L", sLenData) # unsigned long, big-endian |
108 if lenSolData != lenData + 6: |
108 if lenSolData != lenData + 6: |
109 print("Warning: data length doesn't match.") |
109 raise FlashCookieReaderError( |
|
110 "Flash cookie data lengths don't match\n" |
|
111 " file length: {0}\n" |
|
112 " data length: {1}" |
|
113 .format(lenSolData - 6, lenData)) |
110 sDataType = self.__data.read(4).decode("utf-8") # 'TCSO' |
114 sDataType = self.__data.read(4).decode("utf-8") # 'TCSO' |
111 if sDataType != "TCSO": |
115 if sDataType != "TCSO": |
112 raise FlashCookieReaderError( |
116 raise FlashCookieReaderError( |
113 "Flash cookie type is not 'TCSO'; found '{0}'." |
117 "Flash cookie type is not 'TCSO'; found '{0}'." |
114 .format(sDataType)) |
118 .format(sDataType)) |
166 b = self.__data.read(8) |
170 b = self.__data.read(8) |
167 if b == b"\x7F\xF0\x00\x00\x00\x00\x00\x00": |
171 if b == b"\x7F\xF0\x00\x00\x00\x00\x00\x00": |
168 value = "Infinity" |
172 value = "Infinity" |
169 elif b == b"\xFF\xF0\x00\x00\x00\x00\x00\x00": |
173 elif b == b"\xFF\xF0\x00\x00\x00\x00\x00\x00": |
170 value = "-Infinity" |
174 value = "-Infinity" |
171 elif value == b"\x7F\xF8\x00\x00\x00\x00\x00\x00": |
175 elif b == b"\x7F\xF8\x00\x00\x00\x00\x00\x00": |
172 value = "NaN" |
176 value = "NaN" |
173 else: |
177 else: |
174 value, = struct.unpack(">d", b) # double, big-endian |
178 value, = struct.unpack(">d", b) # double, big-endian |
175 value = str(value) |
179 value = str(value) |
176 parent[variableName] = ("number", value) |
180 parent[variableName] = ("number", value) |
423 else: |
427 else: |
424 raise FlashCookieReaderError( |
428 raise FlashCookieReaderError( |
425 "Unexpected Data Type: " + hex(ord(variableType))) |
429 "Unexpected Data Type: " + hex(ord(variableType))) |
426 lenVariableName, = struct.unpack(">H", self.__data.read(2)) |
430 lenVariableName, = struct.unpack(">H", self.__data.read(2)) |
427 self.__data.read(1) # '\x09' |
431 self.__data.read(1) # '\x09' |
|
432 |
|
433 def toString(self, indent=0, parent=None): |
|
434 """ |
|
435 Public method to convert the parsed cookie to a string representation. |
|
436 |
|
437 @param indent indentation level |
|
438 @type int |
|
439 @param parent reference to the dictionary to be converted |
|
440 @type dict |
|
441 @return string representation of the cookie |
|
442 @rtype str |
|
443 """ |
|
444 indentStr = " " * indent |
|
445 strArr = [] |
|
446 |
|
447 if parent is None: |
|
448 parent = self.__result |
|
449 |
|
450 if not parent: |
|
451 return "" |
|
452 |
|
453 for variableName in sorted(parent.keys()): |
|
454 variableType, value = parent[variableName] |
|
455 if isinstance(value, dict): |
|
456 resultStr = self.toString(indent + 1, value) |
|
457 if resultStr: |
|
458 strArr.append("{0}{1}:\n{2}" |
|
459 .format(indentStr, variableName, resultStr)) |
|
460 else: |
|
461 strArr.append("{0}{1}:" |
|
462 .format(indentStr, variableName)) |
|
463 else: |
|
464 strArr.append("{0}{1}: {2}" |
|
465 .format(indentStr, variableName, value)) |
|
466 |
|
467 return "\n".join(strArr) |