Автор Тема: Вопросы по замене ассемблерных инструкций в asi.  (Прочитано 5087 раз)

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Я имею ввиду строки команд, которые создает IDA PRO. Я смогу заменить например 1-байтовую команду 5-байтовой? Cоответственно вторая команда у меня начнется уже с 6-го байта, а не со 2-го как в оригинале, остальное подкорректирую нупами. Или нужно менять только один к одному 1 на 1, 5 на 5 и никакой сдвиг не допустим внутри законченного блока?

Вобщем мне нужно понять, эти варианты замены идентичны или один из них ошибочный?

Замена команд такой же длины

Код: ASM
  1.                                байты
  2.          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
  3. оригинал |___|_________|___|_________|_________|_|_____|___|_____|
  4. замена   |x x|_________|x x|_________|x x x x x|_|x x x|___|x x x|   // работает

Последовательная замена

Код: ASM
  1.                                байты
  2.          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
  3. оригинал |___|_________|___|_________|_________|_|_____|___|_____|
  4. замена   |_________|_________|_|___|x x x x x x x x x x x x x x x|   // не работает
« Последнее редактирование: Апрель 01, 2014, 08:29:27 pm от xanser »

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 512
  • Репутация: +33/-0
    • Просмотр профиля
Один вопрос. Это все дело статичного патчинга или опять через плагин?

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Через плагин, а есть разница? Так-то я пробовал оба способа, результат одинаковый

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 512
  • Репутация: +33/-0
    • Просмотр профиля
Тогда все просто:

выделаем строку выше

Код: C++
  1. char str[] = "тут пишем что угодно";

а далее получаем адрес str, и записываем заместо того.

.text:00601A57 68 F8 3E 78 00      push    userdir_path
F8 3E 78 00 - эти байты, просто патчим на свой адрес строки та что в памяти.

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Мы о разных вещах говорим, менять значения, менять адреса это действительно просто. Как правильно писать команды ассемблера в очищенном блоке. Туда можно писать произвольный асм-код подряд? потом сделать jmp куда нужно? У меня сложилось впечатление, что подряд нельзя, а только в определенные места с сохранением длины команд, несмотря на то, что весь блок уже очищен.

Наверное я не могу правильно объяснить, что мне нужно
« Последнее редактирование: Апрель 02, 2014, 07:59:48 am от xanser »

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 212
  • Репутация: +311/-0
    • dk22pac
    • Просмотр профиля
xanser, это делается асм-вставкой.
Plugin-SDK
gta_sa.idb
Skype-конференция по моддингу https://join.skype.com/jqGbs97avigh

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 512
  • Репутация: +33/-0
    • Просмотр профиля
Цитировать
это делается асм-вставкой.
Ты имеешь введу ему, голый код юзать? Т.е __declspec(naked) ?

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 212
  • Репутация: +311/-0
    • dk22pac
    • Просмотр профиля
Зависит от того, что надо менять и где.
Plugin-SDK
gta_sa.idb
Skype-конференция по моддингу https://join.skype.com/jqGbs97avigh

Оффлайн graveman

  • Прохожий
  • *
  • Сообщений: 50
  • Репутация: +2/-0
  • Its cool! Man
    • Просмотр профиля
Пытался поменять инструкцию ассемблера и даже просто заменить функцию. Обычно был вылет. Но несколько удивляло, что когда изменение прокатывало, измененная функция (в ней был вывод сообщения в лог) не вызывалась. Стал проверять значения ячеек, которые заменяю. Обнаружил, что вместо тех значений, которые должны быть судя по базе Alien'а, там смещенные на 0x20. То есть, чтобы поменять в exe значение ячейки, нужно к адресу в базе Alien прибавить 0x20. Может это уже известно, не знаю. Я только вчера обнаружил.
Вопрос еще такой. Инструкция call принимает разность между адресом функции, которая вызывается и адресом следующей за call инструкцией (где об этом почитать)?


Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Пытался поменять инструкцию ассемблера и даже просто заменить функцию. Обычно был вылет...
У меня пока все инструкции получилось поменять, но при условии, что длина байт в строке остается такой же (я этот вопрос так и не прояснил, иначе у меня вылет)

Цитировать
Стал проверять значения ячеек, которые заменяю. Обнаружил, что вместо тех значений, которые должны быть судя по базе Alien'а, там смещенные на 0x20

Очень похоже на версию exe 1.1, там многое сдвинуто на 0x20, база для 1.0.

Цитировать
Инструкция call принимает разность между адресом функции, которая вызывается и адресом следующей за call инструкцией...
Именно так, если функция впереди, но она может быть и до, тогда там обратное смещение.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 212
  • Репутация: +311/-0
    • dk22pac
    • Просмотр профиля
xanser, можно заменять участки любой длины.
Plugin-SDK
gta_sa.idb
Skype-конференция по моддингу https://join.skype.com/jqGbs97avigh