Бинарные патчи¶
Бинарные патчи используются для исправления файлов или программ на устройстве. Поиск и замена выполняются с использованием шестнадцатеричных шаблонов с подстановочными знаками, поддерживаются подстановки по старшему и младшему полубайтам. Например, ?? обозначает любой байт, а B? обозначает любой байт со старшим полубайтом B (то есть B0–BF), например BA, B1, B9. Шаблон 49 BA ?? ?C будет соответствовать любой последовательности байтов в файле, совпадающей с этим шаблоном. Следующий вызов заменит все последовательности байтов в test.bin, совпадающие с AA BB CC D?, на AA BB CC DD. Интерфейс вернёт количество замен и смещение каждой замены.
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
>>> result = d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
>>> print(result.count)
1
>>> print(result.replaces[0].offset)
8123
Примечание
В демонстрации показаны только совпадение и замена четырёх байтов. На самом деле интерфейс поддерживает совпадение и замену произвольной длины с несколькими байтами, но шаблон поиска должен содержать как минимум два допустимых шестнадцатеричных символа (то есть как минимум один байт без подстановочного знака).
Если необходимо ограничить максимальное количество замен, задайте параметр maxreplace; по умолчанию заменяются все совпадения.
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin", maxreplace=2)
Также можно включить тестовый режим с помощью параметра dryrun: в этом случае для вас будут только найдены позиции совпадений в файле, без выполнения фактической замены.
d.hex_patch("AA BB ?? ??", "AA BB 00 00", "/data/test.bin", dryrun=True)
Подсказка
Путь к файлу поддерживает подстановочные знаки (glob). Например, /data/app/*/test.bin будет соответствовать файлу test.bin в любом подкаталоге первого уровня каталога /data/app.