сплайсинг. обработка команд с относительными аргументами

Тема в разделе "WASM.X64", создана пользователем stranger_eco5, 2 май 2011.

  1. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    hello

    пишу код реализующий перехват вызова функций для x64 кода. столкнулся с subj'ем

    т.е. к примеру, нужно перехватить user32!MessageBoxA():

    потребуется 14 байт места под:
    * оператор jmp ( FF 25 )
    * 4-х байтовое относительное смещение, указывающее на 8-байтовый адрес перехода ( 00 00 00 00 )
    * 8-байтовое значение адреса

    даже с учётом 6-ти NOP'ов чуть выше начала функции, всё равно потребуется затронуть 3-ю команду с оператором cmp, которая работает с относительным смещением

    таким образом, необходимо написать код, который будет обрабатывать команды с "относительными операндами" при построении кода моста (bridge) для передачи управления перехваченной функции

    я так понимаю, самый простой способ - это динамически выделить память под мост таким образом, чтобы этот блок памяти оказался в пределах ближайших 2 ГБ (чтобы применить фиксап для операнда при переносе кода функции на мост)

    вопрос: существуют ли какие-то более простые и элегантные способы построения кода при решении задачи сплайсинга под x64 ?
     
  2. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    int3(kernelmode)
    int3/sti/cli/...(usermode)
     
  3. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    пытался нагуглить готовый солюшен, но все решения в таком духе:

    http://code.google.com/p/libsplice/source/browse/trunk/src/libsplice_km/splice.c

    так что делать-то в итоге? действительно придётся выделять блок памяти в пределах 2 ГБ от хукаемой функции?
     
  4. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    fsd
    речь идёт о usermode. я же в качестве примера привёл функцию из usermode dll'ки user32.dll.

    и вообще, вышеприведённые прерывания как могут помочь в чисто теоретических рассуждениях о проблематике сплайсинга x64 кода ?

    добавлено:
    ставить обработчик прерывания какой-то ?
    это приведёт к сокращению кода, необходимого для патчинга начала хукаемой функции ?
    и что? нормально работает такое на практике ?
     
  5. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    ну а отладчику как помогают если поставить?
     
  6. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    можете не переживать
    ну 1 байт против ваших хз скольки
     
  7. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
  8. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    fsd
    ну, не совсем 1 байт потребуется минимум 3, чтобы в каком-то регистре ещё хранить идентификатор хукнутой функции, чтобы в обработчике исключений отличать из какой функции получено управление
     
  9. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    т. е. по контексту это невозможно?)
     
  10. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    fsd
    немного не понял. по какому контексту? контексту потока?
     
  11. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    при обработке исключения вы получите описатель исключения и контекст прерванного потока
     
  12. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    fsd
    ok, благодарю. попробую этот способ
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    int3 это медленно.

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

    та же проблема была и при сплайсинге х32 кода %)
     
  14. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    не "та же"

    ну вот текущий пример. cmp на что менять, при условии, что код от начала хукаемой функции будет выполняться не в пределах 2 ГБ от адреса, откуда он был взят ?

    добавлено:
    я так понимаю, придётся дополнительно 8 байт где-то резервировать и фиксапать (операнд инструкции cmp моста для вызова хукаемой функции) на них
    а это слишком накладно, я так думаю
     
  15. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    но вообще конечно желательно выделять память в пределах 2ГБ,
    14 байт это перебор, с большой вероятностью попадется функция меньшего размера
     
  16. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    ну да, очень
     
  17. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    ну да, если в пределах 2ГБ выделять, то потребуется 5 байт на относительный JMP и 4-х байтовый операнд

    но я склоняюсь к мысли, что всё равно это слишком накладно (надо будет выделять отдельный блок памяти под каждую хукаемую функцию)

    а вот если через исключения делать - не потребуется код для выставления фиксапов (т.к. в начале функции всегда длинная инструкция по модификации стекового регистра)
    однако, это медленнее, т.к. постоянно идёт переключение в ядро
    остаётся понять насколько медленнее это будет на практике
     
  18. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    заметить это врядли выйдет
     
  19. stranger_eco5

    stranger_eco5 New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    14
    fsd
    VEH для этих целей нормально юзать?
    или надёжнее похукать что-то вроде KiUserExceptionDispatcher?
     
  20. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    угу