Сохранение адресов jmp и call при патче

Тема в разделе "WASM.BEGINNERS", создана пользователем Demon13, 31 окт 2019.

Метки:
  1. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Здравствуйте, я хочу написать программу, которая будет в автоматическом режиме патчить PE файлы. Мне необходимо изменять размер некоторых инструкций, но при изменении размера jmp и call будут прыгать уже не на ту команду, которая планировалась изначально. Как мне сделать так, чтобы при патче сохранить работоспособность программы?
     
  2. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Прости за глупый вопрос: что это означает?
     
  3. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Возможно, я не так выразился. Я имел ввиду, что мне нужно будет добавлять инструкции, тем самым, изменяя размер кода в некоторых местах
     
  4. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Могу предположить, что ты опять не так выразился....)
    Странно что ты этого не знаешь, но ладно...

    В общем, не знаю как делают более осведомленные "товарищи", я делаю это так:
    Ищешь место для джампа, ставишь его на пустой участок, восстанавливаешь там затертые инструкции, дописываешь свои, возвращаешься куда надо.
     
  5. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Боюсь,это не подойдёт, мне нужно заменить одну инструкцию несколькими в том же месте. Т.е есть mov rax,rbx, мне, допустим, нужно заменить это на mov rax,1 mov rdx, rax. Но в таком случае все jmp и call слетят. Можно ли как-то попытаться их восстановить?
    P.s все вышеописанные действия должны выполняться в автоматическом режиме для любой прогрыммы.
     
  6. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Demon13, всего ничего:
    переписать все смещения J&C, почти все.... для мест выше изменения которые ведут во вторую часть файла, для тех которые во второй части - и те и другие....

    И повторюсь, то что я написал выше, можно сделать и в авто-режиме, проще.
     
  7. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    41
    Буду благодарен, если сможете поделиться какими-нибудь статьями, книгами или ссылками по поводу вашего способа.
     
  8. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Мне ж не жалко....
    ravesli.com/uroki-cpp/ - уроки программирования;
    vxlab.info/wasm/publist.php-list=23.htm#series_17 - исследование программ Нарвахи.
    + Голова 1 штука и для этой цели должно хватить.
    Забыл еще Гугл и Яндекс - для уточнения промежуточных деталей.

    Удачи!
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Тебе нужен дизассемблер длин инструкций и переходов по оффсету. Везде, где твой переход невпихуемый, нужно выдергивать оригинальные инструкции (совокупной длины не меньше длины перехода), расширять секцию кода (или добавлять новую), ставить переход в нее, переносить эти инструкции туда и далее генерировать какой хочешь код.

    ЗЫ: идеально будет работать на прологах функции, в середине переходы могут смотреть в одну из перенесенных инструкций, это придется обрабатывать сложней.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    ну это не особо тривиально в общем случае, нужен дизассемблер полноценный, патчить надо интеллектуально (смотреть нет ли джампов на патченное место, пересчитывать все джампы/коллы, если втавил патч со смещением инструкций и тд)... наверное можно воспользоваться библиотеками для DBI/SBI типа DynInst, DynamoRIO, PIN и тд...
     
    ormoulu нравится это.
  11. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    во, про это забыл....)
     
  12. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    32
    И нет ли релоков в патченном месте.
     
  13. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Кстати, а насколько часто подобное можно встретить, знаю КуТэ подобными гадостями промышляет, в смысле в незащищенных приложениях?
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    ТС не понимает что спрашивает, те свою задачу не знает и не может сформулировать. А цель соответственно скрывает.

    Вообще ничего не понятно. Что за ветвления, куда и откуда - нагадать вариантов можно много. Какие инструкции меняются, что с размером и как они связаны.. никакой нет инфы.

    Что бы не спрашивал тс, варианта есть два.

    1. Любые манипуляции с блоками кода выполняются через граф для него. Это многосвязанное дерево, в котором описаны все связи между блоками или единичными инструкциями. Для этого вначале код дизасмится и строится граф конструктором. Далее вся работа чисто алгоритмическая с этим графом. В конце он собирается сборщиком в бинарный код(компилируется). Вычислением размера ветвлений занимается сборщик. Только этим путём полноценно выполняется патч кода.

    2. Перезапись кода(сборка) в ограниченные по размеру области. Это теоретическая задача не имеющая практического применения https://exelab.ru/f/index.php?action=vthread&forum=6&topic=24378#1. Всегда можно выделить память.
     
  15. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    + за dbi
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    ormoulu,

    А причём динамика к работе с графом в статике. В задаче что то про мод кода. Зачем его исполнять.. всё ясно с тобой, ты даже не знаешь что есть дби :preved:
     
  17. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Ну извините, читаю по диагонали :blush2: Пожалуй, вы правы, хотя вариант таскать с собой dbi и запускать с ним каждый раз - вполне себе рабочий, кстати, может быть решением в случае подписи либо разных юридических тонкостей.
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    DynInst поддерживает статическую инстументацию так то, в DynamoRio хороший движок для дизасма/замены инструкций, который вероятно можно и в статике применять...
    --- Сообщение объединено, 1 ноя 2019 ---
    есть еще Miasm, который умеет поднимать код до своего промежуточного представления, проводить модификации и обратно собирать промежуточное представление в бинарщину... возможно имеет смысл посмотреть, если любишь Питон...
    --- Сообщение объединено, 1 ноя 2019 ---
    https://miasm.re/blog/2016/03/24/re150_rebuild.html
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Rel,

    Хороший диз это ксед. А DIO это похоже на бинарный транслятор, но реализация убогая мягко говоря. Это не рабочий инструмент. Его приводят в пример только ради пиара себя и дби, их слишком мало рабочих. Почему же вы не упоминаете мой дий, под которым заводится любой протектор ?
     
  20. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    а кому он нужон то? есть нормальные дизасмы и дби, которые используются на практике... есть те, которые сделаны на коленке и работают только в сферических вакуумах, такие не имеет смысла упоминать...