Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Помогите восстановить регистры =(


Автор: Rzonex 26.03.19, 20:46
Добрый день.

Пишу прогу в которой юзаю хук. Все ок, но после хука я вызываю свой обработчик хука (вызываю его из... эм... чтоб в подробности моего говно-кода не вдаваться, скажем из библиотеки...) и этот обработчик после своей работы козявит мне регистры и я ловлю ошибку.
Скрин прилеплю, там видно, что регистры он сохранил, вот только восстановить не потрудился, и указатель на стек уже другой.
Я с олей только начал дружить, вопрос к профи: нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы?
Я бы мог перед этим говно-обработчиком записать все регистры в стек, и сунуть куда-нить указатель на стек, а после работы говно-обработчика засунуть указатель в esp и вытащить регистры из стека, и даже вернуть указатель туда где был.
Вот только куда сунуть указатель, чтоб его не потер говно-обработчик? И нужно ли возвращать указатель туда где он был? И вообще поможет мне такая процедура восстановления ручная? Или мне после каждой модификации своего обработчика придется асм код менять, чтоб за ним прибрал? Помогите пожалуйста.
user posted image

Автор: JoeUser 26.03.19, 20:58
Цитата Rzonex @
нужно ли после работы какой либо функции восстанавливать указатель стека, или это не критично и мне нужно только восстановить регистры для работы

Ответ от непрофессионала ... После выхода из функции - стек должен "вернуться" в изначальное состояние. Это есть бэст практик. Конечно можно поизвращаться, типа аллоцировать 99% максимально-доступного размера стека и рассматривать его как массив-кэш. Но не факт. что подобный подход резко увеличит производительность. ИМХО, накладные расходы по "самостоятельному управлению" просто зашкалят... Напоминаю - ответ от непрофессионала :)

Добавлено
Цитата Rzonex @
Вот только куда сунуть указатель, чтоб его не потер говно-обработчик?

Ну явно - не в стек :) Аллоцируй ячейку памяти, в которую можешь писать и из которой можешь считать.

Автор: 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 Не, не, не, это точно хук. Я просто исходники от своей программы потерял, вот хочу доработать функционал. :D

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)