Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.192.71.254] |
|
Сообщ.
#1
,
|
|
|
Добрый день.
Пишу прогу в которой юзаю хук. Все ок, но после хука я вызываю свой обработчик хука (вызываю его из... эм... чтоб в подробности моего говно-кода не вдаваться, скажем из библиотеки...) и этот обработчик после своей работы козявит мне регистры и я ловлю ошибку. Скрин прилеплю, там видно, что регистры он сохранил, вот только восстановить не потрудился, и указатель на стек уже другой. Я с олей только начал дружить, вопрос к профи: нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы? Я бы мог перед этим говно-обработчиком записать все регистры в стек, и сунуть куда-нить указатель на стек, а после работы говно-обработчика засунуть указатель в esp и вытащить регистры из стека, и даже вернуть указатель туда где был. Вот только куда сунуть указатель, чтоб его не потер говно-обработчик? И нужно ли возвращать указатель туда где он был? И вообще поможет мне такая процедура восстановления ручная? Или мне после каждой модификации своего обработчика придется асм код менять, чтоб за ним прибрал? Помогите пожалуйста. |
Сообщ.
#2
,
|
|
|
Цитата Rzonex @ нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы Ответ от непрофессионала ... После выхода из функции - стек должен "вернуться" в изначальное состояние. Это есть бэст практик. Конечно можно поизвращаться, типа аллоцировать 99% максимально-доступного размера стека и рассматривать его как массив-кэш. Но не факт. что подобный подход резко увеличит производительность. ИМХО, накладные расходы по "самостоятельному управлению" просто зашкалят... Напоминаю - ответ от непрофессионала Добавлено Цитата Rzonex @ Вот только куда сунуть указатель, чтоб его не потер говно-обработчик? Ну явно - не в стек Аллоцируй ячейку памяти, в которую можешь писать и из которой можешь считать. |
Сообщ.
#3
,
|
|
|
Может кто объяснит почему вообще такая фигня произошла?
void bb_ClientPacket(void *Src, int Size); void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){ bb_ClientPacket(Src, Size); // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall SendXClient(This, _EDX, Src, Size); // Здесь вызываю оригинальную фунуцию соглашение __fastcall } |
Сообщ.
#4
,
|
|
|
В Borland'е _EDX - зарезервированное имя для соотв. регистра. Назовите уж лучше _EDX_ для надёжности расхождения.
|
Сообщ.
#5
,
|
|
|
Хорошо, спасибо)
|
Сообщ.
#6
,
|
|
|
Rzonex, а это точно хук? Или в данном случае под хуком подразумевается хак?
Функцию SendXClient_Hook кто вызывает? bb_ClientPacket тут не __stdcall, т.к. я не вижу в объявлении функции этого модификатора (если он, конечно, по дефолту не стоит). Где код самой функции-то? Судя по всему, косяк именно внутри... p.s. Другие слова на букву "х" и пр. лучше выбирать помягче для рамках форума. |
Сообщ.
#7
,
|
|
|
Jin X Не, не, не, это точно хук. Я просто исходники от своей программы потерял, вот хочу доработать функционал.
|