Bonjour voici le synopsis :
j'étais tranquillement en train de coder un bot MITM et je devais donc m'attaquer à la lecture des fichiers d2p pour en extraire toutes leurs précieuses informations. Tout se passa bien quand soudain un problème surgis de nulle part. Tout les headers de mes fichiers dlm récupérés valent 120 et non pas 77!
Voilà ma classe qui me permet de récupérer les .dlm, c'est un copié coller de PakProtocol2.as :
J'obtiens un dictionnaire de taille 11381 (= nbr de map ?)
Au début je pensais que c'était juste un problème d'offset mal réglé dans la lecture des .d2p, mais quand je cherche la valeurs 77 avec le code ci-dessous :
Je remarque parfois que j'ai un octect qui prend la valeur 77 mais décalé de 50 ou 51 places !
J'ai beau revérifier, je ne trouve pas mon erreur. La question est : Est-ce que vous avez bien aussi 11381 maps? Dans ce cas ma première class est juste. Sinon, avez vous une idée d'où l'erreur pourrait venir?
j'étais tranquillement en train de coder un bot MITM et je devais donc m'attaquer à la lecture des fichiers d2p pour en extraire toutes leurs précieuses informations. Tout se passa bien quand soudain un problème surgis de nulle part. Tout les headers de mes fichiers dlm récupérés valent 120 et non pas 77!
Voilà ma classe qui me permet de récupérer les .dlm, c'est un copié coller de PakProtocol2.as :
Code:
import os, io, struct
MAP_DIR = "C:/Users/Ascension/Documents/Coding/BotProject/MapsReader/D2MAPS"
class MapFiles:
"""Create a dictionary as attribute indexes[filePath] =
{"o":(fileOffset + dataOffset), "l":fileLength, "stream":f }
"""
def __init__(self):
self.indexes = self.getMapsFromD2P()
def getMapsFromD2P(self):
##Go to the right directory
os.chdir(MAP_DIR)
files_list = os.listdir(MAP_DIR)
properties = {}
indexes = {}
for file in files_list:
if os.path.splitext(file)[-1] == ".d2p" :
##open D2P file
f = io.FileIO(file, "r")
##read header
vMax = f.read(1)[0]
vMin = f.read(1)[0]
if vMax != 2 or vMin!=1:
return None
##read parametres at the end of the file
f.seek(self.getSize(f) - 24)
unpackedData = struct.unpack("!IIIIII", f.read(24))
dataOffset = unpackedData[0]
dataCount = unpackedData[1]
indexOffset = unpackedData[2]
indexCount = unpackedData[3]
propertiesOffset = unpackedData[4]
propertiesCount = unpackedData[5]
##read properties
f.seek(propertiesOffset)
i = 0
while i < propertiesCount :
length = struct.unpack("!h",f.read(2))[0]
propertyName = f.read(length).decode('utf-8')
length = struct.unpack("!H",f.read(2))[0]
propertyValue = f.read(length).decode('utf-8')
properties[propertyName+file] = propertyValue
if propertyName == "link":
#we take care of it
pass
i+=1
##read files
f.seek(indexOffset)
i = 0
while i < indexCount :
length = struct.unpack('!H', f.read(2))[0]
filePath = f.read(length).decode('utf-8')
fileOffset = struct.unpack("!I", f.read(4))[0]
fileLength = struct.unpack("!I", f.read(4))[0]
indexes[filePath] = {"o":(fileOffset + dataOffset),
"l":fileLength,
"stream":f }
i+=1
else:
pass
##Debug
print("%d maps have just been extracted"%len(indexes))
#for x in indexes: print(x)
return indexes
Au début je pensais que c'était juste un problème d'offset mal réglé dans la lecture des .d2p, mais quand je cherche la valeurs 77 avec le code ci-dessous :
Code:
class MapInfo(MapFiles):
def test(self):
ex1 = self.indexes['3/137253.dlm']
exMap1 = self.extractData(ex1['l'], ex1['o'], ex1['stream'])
def extractData(self, l, o, stream):
##init vars
decryptionKey = bytes("649ae451ca33ec53bbcbcc33becf15f4", "utf-8")
n = len(decryptionKey)
f = stream
f.seek(o)
##Read header
header = struct.unpack("!"+"b"*100, f.read(100)) #try to find 77 !
if 77 in header:
print("TRUE AT %d"%header.index(77))
if header == 77:
mapVersion = f.read(1)[0]
else:
print("ERROR")
##Debug
print(header)
print(f.read(l))
mapFiles = MapInfo()
mapFiles.test()
J'ai beau revérifier, je ne trouve pas mon erreur. La question est : Est-ce que vous avez bien aussi 11381 maps? Dans ce cas ma première class est juste. Sinon, avez vous une idée d'où l'erreur pourrait venir?