import binascii
import logging

# Configure logging to display messages on the console
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Chemin du fichier d'entrée
input_file = "/var/www/html/modification_carto/volkswagensimospcr2.1_bench_fullbackup_41048480128019348206001024fade00_20230407173439_int_flash.bin"

# Lire le fichier en mode binaire
with open(input_file, 'rb') as file:
    file_content = file.read()

# Convertir le contenu binaire en hexadécimal pour une meilleure lisibilité
hex_content = binascii.hexlify(file_content).decode('utf-8')

# Afficher les 1000 premiers caractères pour analyse initiale
logging.info("First 1000 characters of the file in hex:")
logging.info(hex_content[:1000])

# Définir la taille du segment
segment_size = 8
num_segments = len(file_content) // segment_size

def apply_transformations(segment, candidate_bytes):
    transformations = []
    for i in range(len(segment)):
        original_byte = segment[i]
        candidate_byte = candidate_bytes[i]
        results = {
            "addition_mod": (candidate_byte + original_byte) % 256,
            "xor": candidate_byte ^ original_byte,
            "subtraction_mod": (candidate_byte - original_byte) % 256
        }
        transformations.append(results)
    return transformations

def verify_candidate(segment, transformations):
    for i, trans in enumerate(transformations):
        if not (trans["addition_mod"] == (segment[i] + segment[i]) % 256 or
                trans["xor"] == (segment[i] ^ segment[i]) or
                trans["subtraction_mod"] == (segment[i] - segment[i]) % 256):
            return False
    return True

def analyze_file(file_content, segment_size=8):
    num_segments = len(file_content) // segment_size
    potential_mcuids = {}
    
    for i in range(num_segments):
        segment = file_content[i * segment_size: (i + 1) * segment_size]
        
        if segment.count(0) > segment_size / 2:
            continue
        
        for j in range(len(file_content) - segment_size):
            candidate = file_content[j: j + segment_size]
            transformations = apply_transformations(segment, candidate)
            if verify_candidate(segment, transformations):
                candidate_hex = candidate.hex()
                if candidate_hex not in potential_mcuids:
                    potential_mcuids[candidate_hex] = 0
                potential_mcuids[candidate_hex] += 1
    
    sorted_candidates = sorted(potential_mcuids.items(), key=lambda x: x[1], reverse=True)
    return {
        "first_1000_chars_hex": hex_content[:1000],
        "sorted_candidates": sorted_candidates,
        "total_segments": num_segments
    }

def main():
    results = analyze_file(file_content)
    
    logging.info("First 1000 characters of the file in hex:")
    logging.info(results["first_1000_chars_hex"])
    
    logging.info("Potential MCU IDs (sorted by frequency):")
    for candidate, frequency in results["sorted_candidates"][:10]:  # Show only top 10 for brevity
        logging.info(f"Candidate MCUID: {candidate}, Frequency: {frequency}")

    logging.info(f"Total segments analyzed: {results['total_segments']}")

if __name__ == "__main__":
    main()
