Необходимо прохучить АПИ. Наиболее разумно прописывать call в начало кода. Я вот думаю: после срабатывания хука необходимо отдать управление оригинальной функции. как тут быть? возможно написать дизассемблер длин. и выполнять затёртые комманды, после этого передавать управление... есть ещё вариант: после срабатывания хука восстановить первые байты функции, создать поток, передать управление на начало кода функции; после этого поток снова прохучит функцию. какие есть предложения?
Самое простое и надежное, имхо, - дизасм длин и выполнять затертые команды. Писать ниче не надо. Возьми хотя бы Catchy32 от sars'а (тока в инструкции написано, что надо юзать edi, а на самом деле - esi; в остальном работает нормально)
...вот только дизассемблер писать не охота. Я про это думал.. в результате придётся писать даже не дизассемблер длин, а учитывать ещё и опкоды... хм. кстати, что если в начале кода идёт короткий jxx. я затираю, пересчитываю смещение - в результате у меня получится длинный . совсем плохо, если за ним идёт адресно зависимая комманда, скажем call... так что гемороя здесь не так уж и мало... Какие есть предложения насчёт создания дополнительного потока? думаю что единственной, но очень большой проблеммой здесь будет синхронизация..
если я правильно пнимаю в случае с поток получется постонная последовательность hook\unhook? если так то это вовсе не есть гуд. БОлее склонен к варианту с дизассемблером длин. Что касается Catchy то скомпилить её, смешно признатся, все никак не удаётся... пишу свой
gevara Если надо много хучить, то вариант с дизасмом пожалуй единственый, иначе тормоза получишь нехилые. Аналичатор там простой нужен на опкоды, так что это не проблема. Если попадается кокоткий переход, то переделываешь его в длинный. А напару переход с Call не встретятся. Т.к. перед переходом наверняка стоит пролог и какая-то инструкция сравнения. Тебе же надо всего 5 или 6 байт в зависимости от реализации.
Да хучить нужно много.. АПИ монитор пишу. Вообще я хочу добиться универсальности - какую АПИшку юзер попросит - ту и буду хучить.. То есть все за дизассемблер.. хорошо. так и сделаю. тема закрыта.
Кстати тема уже обсуждалась не один раз. Вроде бы пришли к выходу, что нужно оригинальные инструкции скопировать куда-то, затерев их джампом к себе. А оригинальные инструкции завершить джампом на продолжение. Тогда достаточно хукнуть один раз, а чтобы вызвать оригинальную функцию, достатончо просто передать управление на сохраненные оригинальные инструкции (конечно. их нужно перебазировать, чтобы они заработали, если они базозависимы).