Проблемы с mhook

Тема в разделе "WASM.RESEARCH", создана пользователем AlexCasual, 7 янв 2012.

  1. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Доброго времени всем!
    Кто-нибудь пользовался библиотекой mhook (http://codefromthe70s.org/mhook.aspx)?
    Есть в mhook ограничения на количество хуков?Устанавливаю хуки общим количеством более 64,приложение падает...если уменьшить количество хуков,всё работает отлично...
     
  2. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    PINTOOL в режиме PROBE отваливается при 300 хуках. А при меньшем количестве уже сильно тормозит.

    mhook не пользовался. Ограничение видимо есть.
     
  3. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    samuraishowdown,а нет ли соображений почему могут возникать такие ограничения?В исходниках mhook :
    Код (Text):
    1. #define MHOOKS_MAX_SUPPORTED_HOOKS 64
    ,я как понимаю эту константу можно менять,раз она задефайнина без всяких предупреждений...Только вот если поставить её равной более 100 и установить соответсвенно более 100 хуков,то приложение падает по access violation...
     
  4. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    А уверен что дело именно в количестве хуков?
    Может в 101 хуке jmp попадает как раз на вызов/ветвление, в общем метку для перехода.
    Хуки методом сплайсинг можно ставить только на линейные блоки длиннее 5 байт (для х32).

    Есть ещё MS Detours. ХЗ можно ли в нём ставить тысячи хуков за раз. Скорее всего тоже нет.
     
  5. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    samuraishowdown
    Не имеет значения код совершенно, вот например:
    Код (Text):
    1. 7C91964B RtlGetVersion  8BFF                mov edi,edi
    2. 7C91964D                55              push ebp
    3. 7C91964E                8BEC                mov ebp,esp
    4. 7C919650                51              push ecx
    5. 7C919651                56              push esi
    6. 7C919652                57              push edi
    7. 7C919653                64:A1 18000000      mov eax,dword ptr fs:[18]
    8. 7C919659                8B78 30         mov edi,dword ptr ds:[eax+30]
    Для 3-х потоков:
    Код (Text):
    1. 7C91964B RtlGetVersion  E9 DISP32           jmp PreHandler
    2. 7C919650                51              push ecx
    3.  
    4. Eip = 7C91964B
    5.  
    6.                     8BFF                mov edi,edi
    7.                     55              push ebp
    8.                     8BEC                mov ebp,esp
    9.                                     jmp PostHandler
    10.  
    11. Eip = 7C91964D
    12.                     55              push ebp
    13.                     8BEC                mov ebp,esp
    14.                                     jmp PostHandler
    15.  
    16. Eip = 7C91964E
    17.  
    18.                     8BEC                mov ebp,esp
    19.                                     jmp PostHandler
     
  6. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Уверен практически на 100%,что дело в количестве,потому что меня функции для последнего хука и ситуация воспроизводилась...
     
  7. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    Malfoy
    Я имел в виду статичный хук нельзя ставить на 0040181D в примере ниже (варианты с самотрассировкой, аппаратными бряками на 00401820 не интересуют - приемущество хука методом jmp это скорость без переключения контекстов р0/р3) :
    Код (Text):
    1. .text:0040181D                 lea     ecx, [ecx+0]
    2. .text:00401820
    3. .text:00401820 loc_401820:                             ; CODE XREF: sub_401690+222j
    4. .text:00401820                 lea     edx, [esp+240h+nNumberOfBytesToWrite]
    5. .text:00401824                 push    edx             ; lpdwNumberOfBytesAvailable
    6. .text:00401825                 push    ebp             ; hRequest
    7. .text:00401826                 mov     [esp+248h+nNumberOfBytesToWrite], ebx
    То есть поставить хук можно не зависимо от того какое EIP у остановленных потоков приведённым тобой способом, но работать код будет только до тех пор, пока не случиться прыжок (а не последовательный переход) на метку loc_401820.

    AlexCasual тогда не знаю. Я бы забил. Можно попробовать с другой стороны подойти к задаче.
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    samuraishowdown
    Ну это понятно, граф разрывается. Тогда ниже можно пропатчить.
     
  9. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    А какой наиболее оптимальный алгоритм установки хуков,чтобы не тормозила система?-устанавливаю хуки из своей dll в DLL_ATTACH,около 100 хуков.Приложения прилично подвисают при запуске...можно ли как-то бороться с этим?
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    AlexCasual
    Изменять код можно как угодно. Только вы заранее учтите что вы выполняете вредоносные действия, портя целостность системных модулей. Любая утилита, тотже рку выпилит ваши патчи одним нажатием кнопки.