baratorch
Posts: 197
|
(25.10.2013 17:42)Berserker Wrote: Quote: хочу реального примера.
Например, FindFileInLod. А в нём if FindFileInLod(файл с альтернативным расширением или изменённым именем, то вернуть его), иначе действие по умолчанию. У меня были и другие примеры, но нужно лезть в код и искать те, где была рекурсия. При чём порой рекурсия была косвенной, когда ты вызываешь АПИ, которое дёргает ту же функцию, в которой перехват. Это нормально, ибо рекурсия не бесконечная, а ограничена условиями и проверками.
в приведенном примере напрашивается использование хай хука на FindFileInLod. Но в любом случае я уже сделал сохранение регистров в стэке.
(25.10.2013 17:42)Berserker Wrote: Quote:с->esp -= 4;
IntAt(c->esp) = x;
Я обычно пишу так: dec(Context.esp, 4) и pinteger(context.esp)^ := x; Вряд ли можно чем-то упростить работу с обычными адресами в памяти, но посмотрим.
ты не понял о чем речь.
мой и твой код идентичны, дело не в простоте.
В твоем хуке по адресу (Context.esp - 4) храниться значение одного из регистров. Т.е. с каждым таким push в хуке ты будешь портить значения регистров, которые возможно соберешься использовать после такого пуша, и которые потом заPOPADишь в мосте, а за регистрами пойдут указатель на экземпляр THookHandlerArgs и адрес возврата в мост. Надеюсь, проблема понятна.
(25.10.2013 17:42)Berserker Wrote: Quote:Но посмотрю, конечно, что можно сделать.
PUSHAD PUSH ESP? ))
не так все просто.
В структуре HookContext патчера регистры в обратном порядке нежели в THookHandlerArgs и чтобы сохранить обратную совместимость
пушить регистры надо в обратном PUSHADу порядке.
плюс в новой версии патчера в HookContext еще и доступен для чтения/изменения регистр флагов, а он для той же обратной совместимости добавлен после поля return_address.
сама длл 2.1 и хэдер для с++ с комментариями уже готовы.
дополню твой PatchApi.pas и опубликую.
|
|
25.10.2013 20:20 |
|