Загрузка данных


#!/usr/bin/env python3
import sys
import os

def patch_file_hex(file_path, old_hex_str, new_hex_str):
    # Очищаем строки от возможных пробелов, двоеточий или префиксов 0x
    old_hex_str = old_hex_str.replace(" ", "").replace(":", "").replace("0x", "").replace("0X", "")
    new_hex_str = new_hex_str.replace(" ", "").replace(":", "").replace("0x", "").replace("0X", "")

    # Проверяем корректность длины HEX-строк
    if len(old_hex_str) % 2 != 0 or len(new_hex_str) % 2 != 0:
        print("[-] Ошибка: HEX-строки должны иметь четное количество символов.")
        return False

    if len(old_hex_str) != len(new_hex_str):
        print("[-] Предупреждение: Длины заменяемой и новой строк не совпадают!")
        print(f"    Исходная: {len(old_hex_str)//2} байт, Новая: {len(new_hex_str)//2} байт.")
        print("    В структурах битстримов это может нарушить смещения. Продолжаем...")

    try:
        old_bytes = bytes.fromhex(old_hex_str)
        new_bytes = bytes.fromhex(new_hex_str)
    except ValueError as e:
        print(f"[-] Ошибка парсинга HEX: {e}")
        return False

    if not os.path.exists(file_path):
        print(f"[-] Ошибка: Файл '{file_path}' не найден.")
        return False

    print(f"[*] Чтение файла: {file_path}")
    with open(file_path, 'rb') as f:
        data = f.read()

    count = data.count(old_bytes)
    if count == 0:
        print(f"[-] Ошибка: Последовательность {old_hex_str} не найдена в файле.")
        return False

    print(f"[+] Найдено совпадений: {count}. Заменяем на {new_hex_str}...")
    patched_data = data.replace(old_bytes, new_bytes)

    # Создаем новый файл, добавляя суффикс _patched к имени
    base, ext = os.path.splitext(file_path)
    output_file = f"{base}_patched{ext}"

    print(f"[*] Сохранение результата в: {output_file}")
    with open(output_file, 'wb') as f:
        f.write(patched_data)

    print("[+] Готово! Файл успешно изменен.")
    return True

if __name__ == "__main__":
    if len(sys.argv) < 4:
        print("Использование:")
        print("  python3 hex_patch.py [путь_к_файлу] [что_заменить_HEX] [на_что_заменить_HEX]")
        print("\nПример для вашего CrossLink-NX:")
        print("  python3 hex_patch.py csi2_aggr_vc_RD_NX_impl_1.bit 110F1043 010F1043")
        sys.exit(1)

    file_path = sys.argv[1]
    old_hex = sys.argv[2]
    new_hex = sys.argv[3]

    patch_file_hex(file_path, old_hex, new_hex)