Доброго времени всем! Кто-нибудь пользовался библиотекой mhook (http://codefromthe70s.org/mhook.aspx)? Есть в mhook ограничения на количество хуков?Устанавливаю хуки общим количеством более 64,приложение падает...если уменьшить количество хуков,всё работает отлично...
PINTOOL в режиме PROBE отваливается при 300 хуках. А при меньшем количестве уже сильно тормозит. mhook не пользовался. Ограничение видимо есть.
samuraishowdown,а нет ли соображений почему могут возникать такие ограничения?В исходниках mhook : Код (Text): #define MHOOKS_MAX_SUPPORTED_HOOKS 64 ,я как понимаю эту константу можно менять,раз она задефайнина без всяких предупреждений...Только вот если поставить её равной более 100 и установить соответсвенно более 100 хуков,то приложение падает по access violation...
А уверен что дело именно в количестве хуков? Может в 101 хуке jmp попадает как раз на вызов/ветвление, в общем метку для перехода. Хуки методом сплайсинг можно ставить только на линейные блоки длиннее 5 байт (для х32). Есть ещё MS Detours. ХЗ можно ли в нём ставить тысячи хуков за раз. Скорее всего тоже нет.
samuraishowdown Не имеет значения код совершенно, вот например: Код (Text): 7C91964B RtlGetVersion 8BFF mov edi,edi 7C91964D 55 push ebp 7C91964E 8BEC mov ebp,esp 7C919650 51 push ecx 7C919651 56 push esi 7C919652 57 push edi 7C919653 64:A1 18000000 mov eax,dword ptr fs:[18] 7C919659 8B78 30 mov edi,dword ptr ds:[eax+30] Для 3-х потоков: Код (Text): 7C91964B RtlGetVersion E9 DISP32 jmp PreHandler 7C919650 51 push ecx Eip = 7C91964B 8BFF mov edi,edi 55 push ebp 8BEC mov ebp,esp jmp PostHandler Eip = 7C91964D 55 push ebp 8BEC mov ebp,esp jmp PostHandler Eip = 7C91964E 8BEC mov ebp,esp jmp PostHandler
Уверен практически на 100%,что дело в количестве,потому что меня функции для последнего хука и ситуация воспроизводилась...
Malfoy Я имел в виду статичный хук нельзя ставить на 0040181D в примере ниже (варианты с самотрассировкой, аппаратными бряками на 00401820 не интересуют - приемущество хука методом jmp это скорость без переключения контекстов р0/р3) : Код (Text): .text:0040181D lea ecx, [ecx+0] .text:00401820 .text:00401820 loc_401820: ; CODE XREF: sub_401690+222j .text:00401820 lea edx, [esp+240h+nNumberOfBytesToWrite] .text:00401824 push edx ; lpdwNumberOfBytesAvailable .text:00401825 push ebp ; hRequest .text:00401826 mov [esp+248h+nNumberOfBytesToWrite], ebx То есть поставить хук можно не зависимо от того какое EIP у остановленных потоков приведённым тобой способом, но работать код будет только до тех пор, пока не случиться прыжок (а не последовательный переход) на метку loc_401820. AlexCasual тогда не знаю. Я бы забил. Можно попробовать с другой стороны подойти к задаче.
А какой наиболее оптимальный алгоритм установки хуков,чтобы не тормозила система?-устанавливаю хуки из своей dll в DLL_ATTACH,около 100 хуков.Приложения прилично подвисают при запуске...можно ли как-то бороться с этим?
AlexCasual Изменять код можно как угодно. Только вы заранее учтите что вы выполняете вредоносные действия, портя целостность системных модулей. Любая утилита, тотже рку выпилит ваши патчи одним нажатием кнопки.