Хоок функций.

Тема в разделе "WASM.WIN32", создана пользователем gevara, 7 июн 2007.

  1. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    Необходимо прохучить АПИ. Наиболее разумно прописывать call в начало кода. Я вот думаю: после срабатывания хука необходимо отдать управление оригинальной функции. как тут быть? возможно написать дизассемблер длин. и выполнять затёртые комманды, после этого передавать управление... есть ещё вариант: после срабатывания хука восстановить первые байты функции, создать поток, передать управление на начало кода функции; после этого поток снова прохучит функцию.

    какие есть предложения?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Самое простое и надежное, имхо, - дизасм длин и выполнять затертые команды. Писать ниче не надо. Возьми хотя бы Catchy32 от sars'а (тока в инструкции написано, что надо юзать edi, а на самом деле - esi; в остальном работает нормально)
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Добавлю, что если в затёртые команды попадает call или jcc нужно пересчитать смещение.
     
  4. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    ...вот только дизассемблер писать не охота.
    Я про это думал.. в результате придётся писать даже не дизассемблер длин, а учитывать ещё и опкоды... хм. кстати, что если в начале кода идёт короткий jxx. я затираю, пересчитываю смещение - в результате у меня получится длинный :dntknw:. совсем плохо, если за ним идёт адресно зависимая комманда, скажем call...
    так что гемороя здесь не так уж и мало...

    Какие есть предложения насчёт создания дополнительного потока? думаю что единственной, но очень большой проблеммой здесь будет синхронизация..
     
  5. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    если я правильно пнимаю в случае с поток получется постонная последовательность hook\unhook? если так то это вовсе не есть гуд. БОлее склонен к варианту с дизассемблером длин. Что касается Catchy то скомпилить её, смешно признатся, все никак не удаётся... пишу свой
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    gevara
    Если надо много хучить, то вариант с дизасмом пожалуй единственый, иначе тормоза получишь нехилые. Аналичатор там простой нужен на опкоды, так что это не проблема. Если попадается кокоткий переход, то переделываешь его в длинный. А напару переход с Call не встретятся. Т.к. перед переходом наверняка стоит пролог и какая-то инструкция сравнения. Тебе же надо всего 5 или 6 байт в зависимости от реализации.
     
  7. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    Да хучить нужно много.. АПИ монитор пишу. Вообще я хочу добиться универсальности - какую АПИшку юзер попросит - ту и буду хучить..

    То есть все за дизассемблер.. хорошо. так и сделаю. тема закрыта.
     
  8. wasm_test

    wasm_test wasm test user

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