Skip to content

Instantly share code, notes, and snippets.

@s1341
Created November 10, 2022 14:49
Show Gist options
  • Save s1341/36320fcb1aebbcb9688672585150c1e7 to your computer and use it in GitHub Desktop.
Save s1341/36320fcb1aebbcb9688672585150c1e7 to your computer and use it in GitHub Desktop.
import binascii
import struct
import hexdump
import glob
from collections import namedtuple, OrderedDict
def xorbytes(a, b):
c = bytearray()
for i in range(len(a)):
c.append(a[i] ^ b[i])
return c
FILE_HEADER = struct.Struct("<BBHI4xI")
FileHeader = namedtuple('FileHeader', ['minor_version', 'major_version', 'magic', 'crc32',
'num_blocks'])
BLOCK = struct.Struct("<III4x 260s")
Block = namedtuple('Block', ['crc32', 'index', 'unknown', 'data'])
def read_file(filename):
with open(filename, "rb") as fil:
filedata = fil.read()
file_header = FileHeader(*FILE_HEADER.unpack(filedata[:FILE_HEADER.size]))
blocks = OrderedDict()
offset = FILE_HEADER.size
for i in range(file_header.num_blocks):
block = Block(*BLOCK.unpack(filedata[offset:offset + BLOCK.size]))
blocks[block.crc32] = block
offset += BLOCK.size
return file_header, blocks
if 1:
files = {}
for filename in glob.glob("./UpdateT48*.dat"):
files[filename] = read_file(filename)
for i in files.keys():
fil1 = files[i]
for j in files.keys():
if i == j:
continue
fil2 = files[j]
identical = len(fil1[1].keys())
for k, crc32 in enumerate(fil1[1].keys()):
if crc32 in fil2[1].keys():
xored = xorbytes(fil1[1][crc32].data, fil2[1][crc32].data)
if fil1[1][crc32].index != fil2[1][crc32].index and b"\x00\x00" in xored:
print(hex(k), hex(crc32), i, hex(fil1[1][crc32].index), j,
hex(fil2[1][crc32].index))
# if crc32 in ffs:
# print("FOUND!")
# print(i, j)
print(hexdump.hexdump(xorbytes(fil1[1][crc32].data, fil2[1][crc32].data)))
# break
identical -= 1
# print("%s and %s are identical: %d" % (i, j, identical))
# fil1 = read_file("UpdateT48_V1223.dat")
# fil2 = read_file("UpdateT48_V1225.dat")
# identical = len(fil1[1].keys())
# for k, crc32 in enumerate(fil1[1].keys()):
# if crc32 in fil2[1].keys():
# print(hex(k), hex(crc32), hex(fil1[1][crc32].index), hex(fil2[1][crc32].index))
# # if crc32 in ffs:
# # print("FOUND!")
# # print(i, j)
# print(hexdump.hexdump(xorbytes(fil1[1][crc32].data, fil2[1][crc32].data)))
# # break
# open("1230x1232.dat", "wb").write(xorbytes(open("UpdateT48_V1232.dat", "rb").read(),
# open("UpdateT48_V1230.dat", "rb").read()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment