Основные форумы > RusMe - РусМи!
Удлинение "неудлиняемых" строк
(1/1)
миха04:
Поздравляю всех с Днём Победы! Коварный iZotope RX7 постоянно подкидывает проблемы. В меню Transport строки Rewind, Play, например, не хотят удлиняться ни с помощью IDA, ни переносом на новый адрес в x64dbg. Всё строго ограничено количеством байт, а вот слово Файл уложилось при переносе. Также проблема со строками в подменю Paste Special меню Edit, это Insert и так далее. У них нет ссылок. Вот такая заморочка. Есть ли решение проблемы? Пытался искать по размерам полей, куда вписаны строки, но там просто гигантское число констант выскакивает. Для меня, как человека малосведущего в коде, это просто непонятный набор символов. Файл https://yadi.sk/d/h7umphumB4NN9A
leserg73:
У строк подменю "Paste Special" есть ссылки, только они не прямые, а косвенные (посредством другого адреса/ссылки). Возьмем строку "Insert", Обращение к этой строке выполняется инструкцией вида lea r15, ds:[0x00000001415D1910]. Причем, адрес 00000001415D1910 является ссылочным и указывает не на строку, а на следующий адрес 00000001415CB758, по которому уже находится сама строка "Insert".
Рис. 1
Таким образом, вам нужно сделать перевод данной строки в другом месте, например в новой секции, и изменить в коде только прямой адрес к этой строке, а ссылочный адрес оставить без изменений. Вот как ниже показан пример со строкой "Insert". В новом месте добавлен перевод и скорректирован прямой адрес к этой строке. Ссылочный адрес остался без изменений.
Рис. 2
Обратите внимание, что порядок записи байт адреса обратный (от младшего к старшему). Аналогично нужно поступить и по остальным строкам этого подменю. Как видно из рис.1 (см. панель дампа), все прямые адреса на строки этого подменю находятся в одном месте и следуют друг за другом. Вот эти адреса вам необходимо скорректировать в отладчике с учётом адресации переведенных строк для подменю.
Касательно пунктов подменю "Rewind", "Play" в меню "Transport". По строке "Rewind" я проблем не увидел, просто для неё исправьте указатель длины в соответствии с длиной переведенной строки. Аналогично для строки "Play", но с небольшим нюансом. Эта строка является динамической. Если обратили внимание, то при включении воспроизведения она изменяется на "Stop" и наоборот. Также, полагаю, вы обратили внимание на то, что длина этих строк, "Play" и "Stop", одинаковая - 5 байт (длина строк 4 байта плюс 1 байт на признак клавиши быстрого доступа (&)). Из-за этого у них в коде общий указатель длины. Он находится перед блоками кода с выбором установки соответствующих строк. Смотрите участок кода, представленный на рисунке ниже. Сначала командой mov r8d, 0x5 в регистр r8d заносится значение длины строки, а затем выбирается та или иная строка для установки в меню.
Рис. 3
Что делать? Можно немного переделать код так, чтобы для каждой их строк устанавливался указатель длины, соответствующий переведенным строкам. Это не сложно, если разбираетесь в ассемблере. А можно пойти другим путём. Сделать переводы строк одинаковой длины и потом на это значение скорректировать указатель длины. Например, переведем строки следующим образом: "Воспроизвести" и "Остановить". В кодировке UTF-8 длина первой строки - 1Ah байт, а второй - 14h байт. Строку "Остановить" дополняем пробелами до размера 1Ah байт. Вот так: "Остановить " (6 пробелов). Затем корректируем в коде значение указателя длины для этих строк.
Рис. 4
Вы можете сделать перевод этих строк в Radialix, а потом в отладчике или НЕХ-редакторе изменить значение длины. Главное сделайте длину строку одинаковой, иначе более короткая строка потеряет клавишу управления (Space). Сохраняете изменения в файле; проверяете в работе.
Рис. 5
миха04:
Большое спасибо. Вот таких тонкостей я как раз и не знал. Будет добавка в мою копилку статей. :dance:
Навигация
Перейти к полной версии