Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler > Помогите восстановить регистры =( |
Автор: Rzonex 26.03.19, 20:46 |
Добрый день. Пишу прогу в которой юзаю хук. Все ок, но после хука я вызываю свой обработчик хука (вызываю его из... эм... чтоб в подробности моего говно-кода не вдаваться, скажем из библиотеки...) и этот обработчик после своей работы козявит мне регистры и я ловлю ошибку. Скрин прилеплю, там видно, что регистры он сохранил, вот только восстановить не потрудился, и указатель на стек уже другой. Я с олей только начал дружить, вопрос к профи: нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы? Я бы мог перед этим говно-обработчиком записать все регистры в стек, и сунуть куда-нить указатель на стек, а после работы говно-обработчика засунуть указатель в esp и вытащить регистры из стека, и даже вернуть указатель туда где был. Вот только куда сунуть указатель, чтоб его не потер говно-обработчик? И нужно ли возвращать указатель туда где он был? И вообще поможет мне такая процедура восстановления ручная? Или мне после каждой модификации своего обработчика придется асм код менять, чтоб за ним прибрал? Помогите пожалуйста. |
Автор: JoeUser 26.03.19, 20:58 |
Цитата Rzonex @ нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы Ответ от непрофессионала ... После выхода из функции - стек должен "вернуться" в изначальное состояние. Это есть бэст практик. Конечно можно поизвращаться, типа аллоцировать 99% максимально-доступного размера стека и рассматривать его как массив-кэш. Но не факт. что подобный подход резко увеличит производительность. ИМХО, накладные расходы по "самостоятельному управлению" просто зашкалят... Напоминаю - ответ от непрофессионала Добавлено Ну явно - не в стек Аллоцируй ячейку памяти, в которую можешь писать и из которой можешь считать. |
Автор: Rzonex 26.03.19, 22:24 |
Может кто объяснит почему вообще такая фигня произошла? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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 } |
Автор: Славян 27.03.19, 05:23 |
В Borland'е _EDX - зарезервированное имя для соотв. регистра. Назовите уж лучше _EDX_ для надёжности расхождения. |
Автор: Rzonex 27.03.19, 06:20 |
Хорошо, спасибо) |
Автор: Jin X 27.03.19, 15:04 |
Rzonex, а это точно хук? Или в данном случае под хуком подразумевается хак? Функцию SendXClient_Hook кто вызывает? bb_ClientPacket тут не __stdcall, т.к. я не вижу в объявлении функции этого модификатора (если он, конечно, по дефолту не стоит). Где код самой функции-то? Судя по всему, косяк именно внутри... p.s. Другие слова на букву "х" и пр. лучше выбирать помягче для рамках форума. |
Автор: Rzonex 31.03.19, 12:26 |
Jin X Не, не, не, это точно хук. Я просто исходники от своей программы потерял, вот хочу доработать функционал. |