Автор Тема: Удлинение "неудлиняемых" строк  (Прочитано 5552 раз)

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Всем добрый день. Давно мучает проблема - как удлинить строки не имеющие ни прямых, ни косвенных ссылок, ни лишних байт для замены в UTF-8. Файл iZotope RX7 https://yadi.sk/d/h7umphumB4NN9A

Оффлайн Krig

  • Новичок
  • *
  • Сообщений: 5
Re: Удлинение "неудлиняемых" строк
« Ответ #1 : 09 Июня 2020, 23:46:23 »
Добрый день.
Строки не могут не иметь ссылок. Иначе такие строки не были бы показаны и использованы. Кроме прямых и не прямых ссылок могут быть еще регистровые, относительные и смешанные ссылки. Нужный тип адресации устанавливает компилятор в зависимости от представления, объявления и размещения строк в коде. Поэтому ссылки есть, вам нужно просто их найти.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Удлинение "неудлиняемых" строк
« Ответ #2 : 10 Июня 2020, 10:11:59 »
К сожалению у меня это не получается, не хватает опыта, а информации по данной теме абсолютный ноль.

Оффлайн Krig

  • Новичок
  • *
  • Сообщений: 5
Re: Удлинение "неудлиняемых" строк
« Ответ #3 : 10 Июня 2020, 18:34:49 »
К сожалению у меня это не получается, не хватает опыта, а информации по данной теме абсолютный ноль.
Это не удивительно, т.к. обычно дальше ресурсов и языковых файлов никто не лезет, а инструменты для работы с жесткими строками можно пересчитать на пальцах одной руки. Регистровые и смешанные (относительные) ссылки доступны только при выполнении программы, только в определенный момент времени и зависят от области памяти, в которой был развернут образ приложения. Поэтому при анализе программы в статике такие ссылки найти невозможно. Строки есть, а ссылок как-бы и нету.

Пример прямой ссылки: mov eax,009C44AC
Пример косвенной ссылки: lea eax,[014521FA]

В обоих вариантах используется прямое указание адреса, который ведет непосредственно к строке или к другой ссылке, которая уже в свою очередь указывает на строку. Такие ссылки легко определяют отладчики и утилиты для работы жесткими строками, что позволяет без особых трудностей перенести строки на новое место без участия отладчика.

Совсем другое дело остальные типы ссылок. Их адрес вычисляется в процессе работы приложения. Примеры регистровых ссылок:

1) mov eax,dword ptr ds:[rbx] - здесь адрес берется из регистра rbx.
2) lea rcx,qword ptr ds:[rax+rbx] - здесь адрес получается при суммировании значений регистров rax и rbx.

При этом могут быть задействованы любые доступные регистры. Относительные ссылки, это те же регистровые ссылки, но адрес строки вычисляется относительно другого адреса, используемого в качестве константы. Пример такой ссылки:

lea edx,dword ptr ds:[edi+5A39] - здесь регистр edi содержит адрес, относительно которого на величину определенного значения смещения 5A39 находится искомая строка. Чтобы перенести такую строку на новое место, необходимо изменить значение смещения, которое следует вычислить исходя из нового адреса строки (практический пример, автор Tekton).

Смешанные ссылки - это регистровые и относительные вместе. Примеры смешанных ссылок:

1) lea rсx,qword ptr ds:[rax+rbx*4]
2) mov rdx,qword ptr ds:[rdx+rcx*8+10F]

Как видите адрес получается путем вычисления. Вариантов вычисления адресов ссылок бесконечное множество и в каждом конкретном случае следует разбираться индивидуально.

С вашим примером программы ситуация аналогичная с той, которая рассмотрена здесь в одноименной теме, за авторством leserg73 (ответ #1, Рис. 1). Отличие лишь в типе ссылки: вместо косвенной задействована смешанная. Вам также нужно изменить только прямые ссылки переносимых строк, а код вычисления ссылочных адресов оставить без изменений.

Прямой адрес на строку можно узнать под отладчиком, установив бряк на чтение интересуемой строки (De-ess). Так вы найдете код, в котором вычисляется ссылочный адрес к данной строке. Или же, также используя отладчик, открыть дамп с этой строкой. Взять адрес начала строки (например, для строки De-ess адресом её начала является 00000001415CC1C0 (у вас может быть другое значение)), перевернуть адрес побайтово задом наперед (00000001415CC1C0   >>  C0C15C4101000000) и задать в коде поиск полученной последовательности байт. Так вы найдете место размещения прямой ссылки на данную строку. Теперь переносите строку на новое место и изменяете её прямой адрес на тот, который показывает отладчик в месте нового размещения строки.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Удлинение "неудлиняемых" строк
« Ответ #4 : 10 Июня 2020, 22:07:50 »
Спасибо за подробный ответ. Буду разбираться.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Удлинение "неудлиняемых" строк
« Ответ #5 : 11 Июня 2020, 22:20:19 »
Что-то я совсем запутался с этими регистрами. Для примера: строки в коде идут подряд - De-clip, Declick, De-click. При переводе De-clip остальные строки смещаются. Declick тут не переводится. В интерфейсе появляется только De-clip(Срез пика) . Вместо переведённого De-click пустое место. В команде, обращающейся к адресу строки, есть [rdx+r8], где rdx это 0х141CBE508 - адрес предыдущей строки плюс смещение r8 (0х8) = 0х141CBE510, адрес оригинальной строки. Новый адрес 0х141CBE51A. Вычитаю из нового адреса RDX и меняю в модуле регистров данные R8. Сохранить изменения в файл можно, если что-то заменялось в самом коде. В итоге убил кучу времени, но результат нулевой. Смотрел ролик Tekton, однако там несколько иначе да и отладчик другой. OllyDbg не поддерживает х64. Что не так делаю?

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Удлинение "неудлиняемых" строк
« Ответ #6 : 12 Июня 2020, 17:41:23 »
Вот, что ещё заметил, если в регистре RDX заменить значение оригинальной строки на новую, то при запуске программы через отладчик x64dbg, видна изменённая строка. В сохранённом файле просто пустое место. При трассировке изменённой программы в отладчике, не находится точка останова на новой строке, идёт бесконечный поиск. В то время как бряк на старом адресе нормально срабатывает.

Оффлайн Krig

  • Новичок
  • *
  • Сообщений: 5
Re: Удлинение "неудлиняемых" строк
« Ответ #7 : 14 Июня 2020, 13:37:21 »
Что-то у вас совсем все плохо. Вам нужно только определить, откуда программа читаем прямые ссылки и изменять только их.  Вы нашли код цикла, где алгоритм вычисляет местоположение прямой ссылки для каждой конкретной строки. Он считывает этот прямой адрес и передает дальше по назначению. Вы проходите на место записи этой прямой ссылки и меняете только её.  :smoke:

Я не буду расписывать поиск нужных строк. С этим у вас проблем нет. Далее опишу действия без использования отладчика.

Искомая строка "De-ess" находится в файле по смещению: 15CA3C0
screen1.png

Определяем виртуальный адрес для этого смещения, используя инструмент CFF Explorer
screen2.png

Виртуальный адрес: 00000001415CC1C0
Переворачиваем байты виртуального адреса строки обратным порядком:
00 00 00 01 41 5C C1 C0 >> C0 C1 5C 41 01 00 00 00

Ищем полученную последовательность байт C0C15C4101000000 в файле и находим её по смещению 2129478.
screen3.png

Чтобы перенести строку на новое место, нужно изменить этот виртуальный адрес (00000001415CC1C0) на новый, по месту размещения переведенной строки.

Для примера я добавлю перевод строки в конце секции ресурсов.
screen4.png

Смещение новой строки: 2C55B80

Виртуальный адрес для этого смещения (используя CFF Explorer): 0000000142CA6180

Переворачиваем байты виртуального адреса строки обратным порядком:
00 00 00 01 42 CA 61 80 >> 80 61 CA 42 01 00 00 00

Идем на место записи исходного виртуального адреса и вместо него записываем новый
screen5.png

Сохраняем изменения и проверяем в работе.
screen6.png

Аналогично для остальных строк. Лучше добавить в файл новую секцию и все строки сносить туда. В итоге вы корректируете только прямые ссылки на строки. А в коде ничего не меняете.

Я вам показал, как это можно сделать без отладчика. Тоже самое можно сделать и в нем. Главное сначала нужно правильно определить формирование ссылок на строки, если они не прямые. После этого выбрать оптимальную стратегию по переносу необходимых строк. Разработчики ничего не мутят, они просто пишут код, где все прозрачно и структурировано. Я уже говорил, что в зависимости от многих факторов уже сам компилятор на этапе сборки приложения выбирает нужный алгоритм размещения данных и обращения к ним в коде. А еще берите во внимание, что каждый инструмент дизассемблер-отладчик интерпретирует данные, исходя из заложенных в него алгоритмов, и на самом деле все совсем не так, как он показывает.  :)

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Удлинение "неудлиняемых" строк
« Ответ #8 : 14 Июня 2020, 17:28:40 »
Вот теперь понятно  :super: Большое спасибо за разъяснение  :dance:

Оффлайн Flyer Dell

  • Новичок
  • *
  • Сообщений: 1
Re: Удлинение "неудлиняемых" строк
« Ответ #9 : 09 Августа 2020, 17:43:47 »
Что-то у вас совсем все плохо. Вам нужно только определить, откуда программа читаем прямые ссылки и изменять только их.  Вы нашли код цикла, где алгоритм вычисляет местоположение прямой ссылки для каждой конкретной строки. Он считывает этот прямой адрес и передает дальше по назначению. Вы проходите на место записи этой прямой ссылки и меняете только её.  :smoke:

Я не буду расписывать поиск нужных строк. С этим у вас проблем нет. Далее опишу действия без использования отладчика.

Искомая строка "De-ess" находится в файле по смещению: 15CA3C0
screen1.png

Определяем виртуальный адрес для этого смещения, используя инструмент CFF Explorer
screen2.png

Виртуальный адрес: 00000001415CC1C0
Переворачиваем байты виртуального адреса строки обратным порядком:
00 00 00 01 41 5C C1 C0 >> C0 C1 5C 41 01 00 00 00

Ищем полученную последовательность байт C0C15C4101000000 в файле и находим её по смещению 2129478.
screen3.png

Чтобы перенести строку на новое место, нужно изменить этот виртуальный адрес (00000001415CC1C0) на новый, по месту размещения переведенной строки.

Для примера я добавлю перевод строки в конце секции ресурсов.
screen4.png

Смещение новой строки: 2C55B80

Виртуальный адрес для этого смещения (используя CFF Explorer): 0000000142CA6180

Переворачиваем байты виртуального адреса строки обратным порядком:
00 00 00 01 42 CA 61 80 >> 80 61 CA 42 01 00 00 00

Идем на место записи исходного виртуального адреса и вместо него записываем новый
screen5.png

Сохраняем изменения и проверяем в работе.
screen6.png

Аналогично для остальных строк. Лучше добавить в файл новую секцию и все строки сносить туда. В итоге вы корректируете только прямые ссылки на строки. А в коде ничего не меняете.

Я вам показал, как это можно сделать без отладчика. Тоже самое можно сделать и в нем. Главное сначала нужно правильно определить формирование ссылок на строки, если они не прямые. После этого выбрать оптимальную стратегию по переносу необходимых строк. Разработчики ничего не мутят, они просто пишут код, где все прозрачно и структурировано. Я уже говорил, что в зависимости от многих факторов уже сам компилятор на этапе сборки приложения выбирает нужный алгоритм размещения данных и обращения к ним в коде. А еще берите во внимание, что каждый инструмент дизассемблер-отладчик интерпретирует данные, исходя из заложенных в него алгоритмов, и на самом деле все совсем не так, как он показывает.  :)

ОГРОМНОЕ ВАМ СПАСИБО!!!
У меня возникла аналогичная проблема, как в данной теме. Я очень долго искал её решение, перелопатив весь интернет. Но всё было безрезультатно! Всю голову себе уже переломал в борьбе с неудлинняемыми строками. И тут мне подвернулся форум ruslab. Моему счастью не было придела, когда я нашёл эту тему на нём. Я до сих пор очень рад этой находке!
ВЫ ЛУЧШИЕ!!! Сейчас большая редкость, когда грамотный, знающий человек, подробно всё расскажет, да ещё и покажет! БОЛЬШОЕ СПАСИБО вам ещё раз!!! Я бы хотел отблагодарить вас материально. Свяжитесь со мной, чтобы мы договорились как это сделать.