Пишу свой API - шпион под W2K\XP на ассемблере

Тема в разделе "WASM.WIN32", создана пользователем Rustem, 11 ноя 2004.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Ключевой момент такой:



    API_FUNC_stub:

    push func_id ;5 байт

    jmp hook_prologue ;5 байт



    Для нормальной работы API функции сперва нужно восстановить первые 10 байт.

    Я делаю это по заранее сохраненным первым 10 байтам. И пишу в начало перехватываемой функции при

    помощи WriteProcessMemory.



    После вызова, опять, патчу начало функции.



    Так вот вопрос:

    Как перехватить вызов самой WriteProcessMemory.

    Т.к. она не сможет восстановить сама себя. (Получается зацикливание) Конечно можно не патчить её изначально

    , но из-за этого её вызовы не будут отслеживаться ;(((
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Rustem

    а про хук с использованием таблицы импорта ты слышал...?
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Конечно, слышал.

    Этот метод негодится. Т.к. не позволяет ставить хук

    на функции которых нет в таблице импорта...
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    В таблице какого модуля нет функции?

    WriteProcessMemory -> NtWriteVirtualMemory

    Можно смело ловить NtWriteVirtualMemory а она импортируется kernel32.dll
     
  5. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    >>Как перехватить вызов самой WriteProcessMemory.

    Патчи свою таблицу импорта.

    >>сохраненным первым 10 байтам

    Существуют функции размером меньше 10 байт.



    >>После вызова, опять, патчу начало функции.

    А если произошло переключение контекста и эта функция была вызванна ещё и другим приложением, пока ты не записал снова джамп в начало. Или ты пишешь хук для одной проги?
     
  6. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приблизительно понятно что делать.

    Будем пробовать...

    Правда появилось еще больше вопросов.
     
  7. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Вроде разобрался.

    Заглушка теперь не 10, а 5 байтов.

    А в память процесса пишу при помощи NtWriteVirtualMemory
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Только
    Код (Text):
    1. "WriteProcessMemory tries to modify the protection on the virtual memory to ensure
    2. that write access is granted and flushes the instruction cache after the write
    3. (by calling ZwFlushInstructionCache)"


    Поэтому лучше посмотреть код WriteProcessMemory и попробовать написать аналог,

    заюзав дополнительно NtProtectVirtualMemory, хотя может и не нужно, если не важно отработает функция или нет.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Есть способ патчинга таблицы экспорта библиотеки. Он достаточно надёжен. Если библиотека подгружается динамически перехватывай функцию LdrLoadDll из ntdll.dll.
     
  10. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Спасибо за разъяснения.

    Буду писать шпион дальше. Как только напишу, так выложу для тестирования.

    Шпион получается очень интересный. Есть возможность подключения собственных плагинов и перехвата собственных функций из собственных dll. Нужно только добавить ее в базу.



    Ну в общем как напишу, так выложу на суд.
     
  11. MoKC0DeR

    MoKC0DeR New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    136
    Адрес:
    Russia
    Rustem

    Это для самообразования или как ?

    Чем autodebug не устраивает ?
     
  12. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Неустраивает BoundsCheckер

    (Работает как отладчик, работает долго итп...)



    Пишу свой, чтобы был таким, какой хочу.



    PS что за autodebug такой?????
     
  13. MoKC0DeR

    MoKC0DeR New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    136
    Адрес:
    Russia
    http://www.autodebug.com



    У меня правда очень старая версия, но прога прикольная
     
  14. Tellur

    Tellur New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    21
    Адрес:
    Новокузнецк
    А если в то время как ты убрал хук что бы вызвать оригинальную функцию, например, другой треад вызовет ту же функцию, то твой хук не сработает :)
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Tellur

    Поэтому хуки, если по уму, никто и никогда не снимает, в драйверах чаще всего так, т.е. хукающие драйверы делают невыгружаемыми. Процедура обработки хука должна быть прозрачна для всего того что ей не требуется отлавливать, а обрабатывать только то для чего собсно ставился хук.
     
  16. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Тут еще один интересный момент есть с хуками:



    Допустим у нас все хуки ссылаются на один обработчик,

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

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



    Один (нелучший) способ - восстановить все функции при работе обработчика, чтобы небыло повторного вхождения.

    Но тогда не будут учитываться вызовы функций из других потоков.

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



    Есть варианты???
     
  17. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    варианты есть ;) и эти варианты я использую в своем АПИ мониторе =)))