#!/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)