Сплайсинг

Тема в разделе "WASM.X64", создана пользователем vx1d, 21 мар 2017.

  1. vx1d

    vx1d Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    118
    Нужно залогировать входные параметры у функции и продолжить ее выполнение
    1: с помощью дизасма длин инструкций получаю количество байт для сохранения, чтобы вставить код трамплина
    2: сохраняю оригинальные байты в буфер
    3: после сохраненных байт дописываю в буфер
    Код (Text):
    1.  
    2. Trampoline:             push    rax
    3.                         mov    rax,1122334455667788h
    4. @TrampolineAddress =    ($ - Trampoline - 8)
    5.                         mov    [rsp-8],rax
    6.                         pop    rax
    7.                         jmp    qword [rsp-10h]
    8. @TrampolineSize    =    ($ - Trampoline)
    9.  
    где: 1122334455667788 патчится абсолютным адресом следующей инструкции после сохраненных
    4: записываю код трамплина в начало перехватываемой функции, только 1122334455667788 заменяю на абсолютный адрес функции логирования
    5: после отработки функции логирования, управление передаю на буфер с сохраненными байтами, после их исполнения получает управление код трамплина из буфера, который передает управление на инструкцию следующую за трамплином в перехватываемой функции

    как можно сделать получше?
    c прерываниями код выше не дружит
     
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.144
    дрова писать + смотри ав коды с открытыми сорцами.
     
  3. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Если логировать надо одну-две функции, то лучше использовать отладочные регистры, ИМХО. Тогда танцев с бубном будет меньше. Например, не надо менять код туда-обратно, права доступа к страницам, меньше проблем с антивирусом, не будет проблем с многопоточными приложениями и можно отслеживать вызовы функции только из нужных потоков.

    Вопрос только, что означает фраза - "c прерываниями код выше не дружит" ?
     
  4. Indy_

    Indy_ Well-Known Member

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

    В x64 релатив адресация данных, поэтому невозможно выполнить патч без полной пересборки кода. Это просто морф без изменения кода, только смещений.
     
  5. vx1d

    vx1d Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    118
    ну я сделал так:
    - ищу подходящее место в функе чтобы не было вначале переходов, работы с глобальными переменными и т.п.
    - с помощью дизасма длин инструкций определяю количество байт большее 5 для сохранения оригинальных инструкций
    - записываю относительный jmp (5 байт) на код в пределах 2Гб на код1 (размещяется в свободном месте PE)
    - в коде1 в динамике пишу:
    Код (Text):
    1.  
    2. push rax
    3. mov rax,(адрес за пределами 2Гб на мой код2)
    4. call rax (на код2 в мою библиотеку)
    5. pop rax
    6. (сохраненные инструкции)
    7. jmp (обратно после сохранненных инструкций)
     
  6. vx1d

    vx1d Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    118
    ну там работа со стеком выше указателя стека, если между инструкциями произойдет что-то то стек может потереца
     
  7. Indy_

    Indy_ Well-Known Member

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

    Посмотрите это https://github.com/Worobow/MakeLib

    Обсуждение было на rsdn, заявлено что это конструктор(умеет создавать граф и билдить).
     
  8. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Можно поподробнее про работу выше указателя стека - я что то такого не припомню. И что может произойти между инструкциями? Хотелось бы пример.

    Вообще, когда RIP окажется на указанном в отладочных регистрах адресе, просто произойдёт исключение по всем правилам (естественно нужно заранее установить обработчик) в обработчике которого логируем всё что надо. Вопрос только в "c прерываниями код выше не дружит" - это означает, что использовать исключения проца нельзя или нет?
     
  9. xdf

    xdf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    сожрать стек, сохранить туда ВСЕ регистры, сохранить часть стека с возможными аргументами, передать управление своей функции, единственным аргументом которой будет указатель на все это

    зыж https://en.wikipedia.org/wiki/X86_calling_conventions
    ззыж во все регистры входит xmm