import sys
import binascii

# Vérification du nombre d'arguments
if len(sys.argv) != 2:
    print("Usage: python3 extract_mcuid.py <input_file>")
    sys.exit(1)

# Chemin du fichier à partir des arguments
file_path = sys.argv[1]

# Lire le contenu du fichier d'entrée
with open(file_path, 'rb') as file:
    original_bytes = list(file.read())

# Définir la position de départ
start_position = 82432

# Lire les octets finaux actuels
octets_actuels = original_bytes[start_position + 12:start_position + 16]

# Afficher les octets actuels
print("Octets actuels:", [hex(b) for b in octets_actuels])

# Fonction pour appliquer les transformations spécifiques
def apply_transformation(original_byte, transformation):
    return (original_byte + transformation) % 256

# Fonction pour trouver les transformations spécifiques pour les octets finaux
def find_transformations(octets_actuels, octets_attendus):
    transformations = []
    for i in range(len(octets_actuels)):
        actuel = octets_actuels[i]
        attendu = octets_attendus[i]
        for t in range(256):
            if apply_transformation(actuel, t) == attendu:
                transformations.append((actuel, attendu, t))
                break
    return transformations

# Valeurs attendues pour les octets finaux (à ajuster pour chaque fichier)
octets_attendus = [0x24, 0x0d, 0x05, 0x00]  # Exemple de valeurs attendues

# Trouver les transformations spécifiques
transformations = find_transformations(octets_actuels, octets_attendus)

# Afficher les transformations trouvées
print("Transformations trouvées:", transformations)

# Appliquer les transformations spécifiques aux octets finaux
for i, (actuel, correct_byte, t) in enumerate(transformations):
    original_bytes[start_position + 12 + i] = correct_byte

# Extraire le MCUID final à partir du fichier modifié
mcuid_extracted = original_bytes[start_position:start_position + 16]
mcuid_extracted_hex = binascii.hexlify(bytearray(mcuid_extracted)).decode('utf-8')

print(f"MCUID extrait: {mcuid_extracted_hex}")

# Écrire le fichier de sortie
with open("output_file.bin", "wb") as file:
    file.write(bytearray(original_bytes))

print("Transformations appliquées et fichier de sortie écrit avec succès.")
