Есть shell скрипт который ищет бинарный файл и выполняет в нем поиск и замену байт.
Выполняется это в macOS Monterey.
spoiler#!/bin/bash
set -x
declare -r dir=$( dirname "$0" )
declare -r -a plugs=(
"Melodyne"
)
function replace() {
declare -r -i count=$2
declare -i c="$( perl -0777ne 'END {print $c} ++$c while /'$3'/gs' "$1" )"
if [[ $c -ne $count ]]; then echo "Replace failed, found $c occurrences. Patch: $3"; return; fi
sudo perl -0777pi -e 's|'$3'|'$4'|gs' "$1"
return
}
function patchPlugins() {
replace "$1" 1 '\x21\x02\x80\x52(.{4})\xF8\x03\x00\xAA\xE0\x1B\x40\xF9' '\x21\x02\x80\x52\x00\x00\x80\x52\xF8\x03\x00\xAA\xE0\x1B\x40\xF9'
replace "$1" 1 '\xA8\x03\x5A\xF8\x1F\x20\x03\xD5' '\xA8\x03\x5A\xF8\x20\x00\x80\x52'
replace "$1" 1 '\xFF\xFF\xBE\x11\x00\x00\x00(.{3})\x00\x00\x89\xC3\x48\x8B\xBD\x70\xFB\xFF\xFF\xE8' '\xFF\xFF\xBE\x11\x00\x00\x00\xB8\x00\x00\x00\x00\x89\xC3\x48\x8B\xBD\x70\xFB\xFF\xFF\xE8'
replace "$1" 1 '\x31\xC0\x48\x8B\x0D(.{9})\x4D\xD0\x0F\x85\xFC\x00' '\xB0\x01\x48\x8B\x0D${1}\x4D\xD0\x0F\x85\xFC\x00'
}
echo "DIR $dir"
for plug in "${plugs[@]}"; do
echo "PLUG $plug"
find "$dir" -name "$plug"* -type d -maxdepth 3 -print | sort | while read dname; do
echo "dname $dname"
find "$dname" -name "$plug" -type f | grep "Contents/MacOS" | while read fname; do
echo "Patching: $fname"
sudo chown -R "$USER" "$dname"
patchPlugins "$fname"
done
done
done
echo "Patching complete."
В ходе выполнения скрипта заметил, что в его выводе пишется, что определенные паттерны байт не найдены в файле
Replace failed, found 0 occurrences. Patch: \x01\x00\x80\x52\x9E\xA5\x79\x94\xF4\x03\x00\xAA
Replace failed, found 0 occurrences. Patch: \xC0\x03\x5F\xD6\xFC\x6F\xBA\xA9\xFA\x67\x01\xA9\xF8\x5F\x02\xA9\xF6\x57\x03\xA9\xF4\x4F\x04\xA9\xFD\x7B\x05\xA9\xFD\x43\x01\x91\xFF\x03\x07\xD1\xB7
Хотя я проверял вручную и эти шаблоны байт там есть.
Начал дебажить и выяснил, что первый find в цикле сначала выдает текущую папку, внутри которой должен производиться поиск,
/Users/USER/Desktop/Melodyne 5
а на следующей итерации уже находит необходимую вложенную
/Users/USER/Desktop/Melodyne 5/Melodyne.app
Вопросы:
1. Почему так происходит?
Если я правильно понимаю утилита find должна искать внутри указанной директории, а не брать указанную директорию за результат
2. Как можно исправить эту ситуацию (чтобы утилита find не использовала указанную для поиска директорию в качестве результата) не редактирую указанную для поиска диреторию?
Может быть есть какие-то параметры настройки поиска с помосщью find для такого случая?
P.S.
Вот архив со скриптом и подопытными "данными".
Я просто распаковываю на рабочий стол папку "Melodyne 5" и запускаю файл .command