Quote:Процедура Х (...)
команда 1
низкоуровневый перехватчик №1
команда 2...
Низкоуровневый перехватчик №1(...)
вызвать процедуру Х(...); рекурсия !!!
другие команды...
Многие АПИ и часть алгоритмов требует рекурсии. Нельзя, чтобы перехватчик по одному адресу сохранял контекст в одной и той же области памяти. В такой перехватчик невозможно зайти дважды, не затерев предыдущий контекст. В Эре контекст сохраняется через PUSHAD и таких проблем нет.
понял о какой рекурсии идет речь, но это изврат - вызывать из лоухука код, в который установлен этот лоухук.
хочу реального примера. Но посмотрю, конечно, что можно сделать.
В HiHook UserData добавлю
А так к версии 2 в патчере появились две вкусные вещи
WriteLoHookEx и WriteHexHook.
WriteLoHookEx работает так же как WriteLoHook, но позволяет полноценно работать со стеком контекста, т.е. возможно выполнение такой штуки:
Code:
int __stdcall LoHook_Func(LoHook* h, HookContext* c)
{
....
c->Push(x)
// или то же самое:
с->esp -= 4;
IntAt(c->esp) = x;
...
return NO_EXEC_DEFAULT;
}
вот на такое эровский лоу-хук точно не способен.
а WriteHexHook устанавливает LoHook без использования высокоуровневой функции, тело хука пишется прямо в вызове WriteHexHook в машинных кодах, подобно тому как патч пишется с помощью WriteCodePatch
пример:
Code:
_PI->WriteHexHook(0x335577, NO_EXEC_DEFAULT, "FF 35 %d", &x); // push [&x]
Вот, кстати, с помощью WriteHexHook и можно самостоятельно написать свой мост к высокоуровневой функции любого содержания, в том числе и сохраняющего регистры в стеке.