Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Подключаю фильтр... Проблемы со стеком. |
Посл.ответ | Сообщение |
|
Создано: 24 января 2007 14:38 · Поправил: 0xy · Личное сообщение · #1 Есть некая процедура чтения данных. Задача: в самое ее начало добавить call на свою процедуру-фильтр, выполнить (в своей процедуре) команды, вытесненные этим call и обеспечить ret из нее обратно, сохранив нетронутыми стек и все регистры. Процедура-фильтр анализирует запрос и либо возвращает управление оригинальной процедуре чтения, либо сама выдает данные и передает управление тому, кто их запрашивал. Проблема в том, что мой call вытесняет следующие инструкции: push ebp
и у меня не получается выполнить их и затем сделать возврат, не нарушая условий задачи ![]() ps Процедуру добавляю в Ольке ![]() |
|
Создано: 24 января 2007 16:34 · Поправил: =Usacha= · Личное сообщение · #2 |
|
Создано: 24 января 2007 17:21 · Поправил: 0xy · Личное сообщение · #3 =Usacha= пишет: А попробуй в начало доюалять jmp на пустое место С jmp всё просто, но некрасиво. И при ковырянии сразу в глаза бросается... Пробовал присобачиться так: (Моя) процедура-фильтр: pushad
Но проблема в том, что после выполнения add esp, 4 разрушаются данные в стеке: мой адрес возврата. Хочу узнать, насколько это закономерно? Сохранность данных в стеке ниже esp что, в принципе не гарантируется? ![]() |
|
Создано: 24 января 2007 23:42 · Личное сообщение · #4 0xy Ну не ниже, а выше, поскольку стек вверх ногами. В принципе программы обычно не опираются на то, что лежит в стеке выше, поэтому менять это дело можно. А вот если хитрозадая защита, то может быть она и проверяет стек выше. Для этого тут была тема, в которой чел хотел полностью стек на свой подменить. Если такой гемор не нужен, то забей на то, что верх стека перезаписывается. ![]() |
|
Создано: 25 января 2007 00:06 · Личное сообщение · #5 0xy Твоя push ebp mov ebp, esp add esp, -0c Откуд-то вызывается? Пиши в пустое место свою ф-цию. В конце своей ф-ции добавь PUSH xxxxxxxx, где ххххххх - адрес правильной ф-ции. Так аспак делает переход на ОЕП. Рет пойдет в правильную ф-цию и она уже будет работать как надо. Ну, естественно, колл в нее исправь на колл в свою. Если не понял, то приведи кусок с адресами, на адресах будет понятней. ![]() |
|
Создано: 25 января 2007 00:29 · Личное сообщение · #6 call PROGA -------------------- пролог PROGA тело PROGA эпилог PROGA ------------------- пролог FILTR тело FILTR JMP тело PROGA тело FILTR эпилог FILTR ------------------------ Заменям call PROGA на call FILTR JMP естественно надо дополнить восстановлением стека(если нужно) Прологи и эпилоги должны быть одинаковыми естественно(ну за исключением опять же стека). ![]() |
|
Создано: 25 января 2007 01:15 · Личное сообщение · #7 |
|
Создано: 25 января 2007 13:43 · Личное сообщение · #8 stahh, tundra37 Ваш вариант не устраивает, т.к. этих CALL PROGA у меня куева туча, да к тому же не все они явные! asd Похоже, должно сработать (еще не пробовал). Но я хочу найти универсальное решение задачи, а твой код привязан к конкретному началу процедуры (push ebp; mov ebp,esp; add esp, -0c) Archer пишет: программы обычно не опираются на то, что лежит в стеке выше, поэтому менять это дело можно Дыд я сам хотел на это опереться! А оно почему-то исчезает после безобидной команды add esp,4! ![]() КАК ЭТО МОЖНО ОБЪЯСНИТЬ? Протов нет ни на проге, ни на Ольке (хотя, возможно, на какой-нить длл-ке и есть?). Второго потока тоже не наблюдается... ![]() |
|
Создано: 25 января 2007 18:09 · Поправил: 0xy · Личное сообщение · #9 asd Не-а, не работает! xchg ebx,[esp-14h] срабатывает только в одну сторону, т.е. как mov. А mov [esp-14], ebx вообще ни чего не делает! Т.е. после его выполнения данные в стеке не изменяются. ![]() В общем, те же грабли, что и в моём варианте: данные в стеке выше указателя не выживают. Чё за маразм такой???: ![]() ![]() ![]() |
|
Создано: 25 января 2007 20:50 · Личное сообщение · #10 |
|
Создано: 25 января 2007 22:30 · Личное сообщение · #11 0xy пишет: Не-а, не работает! xchg ebx,[esp-14h] там ебп должно быть, и я не понял, сколько там локальных переменных 3 или 4? 0xy пишет: Но я хочу найти универсальное решение задачи
![]() |
|
Создано: 26 января 2007 16:37 · Личное сообщение · #12 |
|
Создано: 27 января 2007 02:54 · Личное сообщение · #13 0xy пишет: Остановившись на любом бряке, Оля портит стек выше esp-10h Сделал простой бряк по F2 - стек целехонек. Это же отладчик - он по определению стек не должен трогать, да и у него свой стек - зачем ему стек процесса. А вот плаги и сама программа - запросто. Кстати про антивирусы не забыл и аутпосты - они любят свои DLL везде внедрять. ![]() |
|
Создано: 27 января 2007 03:08 · Личное сообщение · #14 |
|
Создано: 27 января 2007 22:05 · Поправил: 0xy · Личное сообщение · #15 Плагины все отключал. Любителей внедрять dll-тоже. Всё показывает именно на Ольку!(м.б. еще зверьё, но не позоже) Просьба ко всем, кому не лень, проделать такой эксперимент: 1. Загрузить в Ольке любую прогу и, стоя на ОЕП, глянуть, что лежит в [esp-14] У меня ВСЕГДА [esp-14]=ds=ss=es=177h 2. Попробовать ПРОГРАММНО (MOV) записать туда что-то, и посмотреть, получится ли (у меня остается 177). 3. Если получилось, нажмите разок F7 и посмотрите, выживет ли. PS Крайне желательно проверить под Win 9x! ![]() |
|
Создано: 27 января 2007 23:47 · Личное сообщение · #16 |
|
Создано: 28 января 2007 01:30 · Поправил: 0xy · Личное сообщение · #17 Странно ![]() [esp-14]=ss
Выше лежит еще что-то (не нули) Все эти значения восстанавливаются при любом бряканьи Оли (в т.ч. после F7) Кто это может делать кроме самой Оли? Archer А у тебя после загрузки проги выше esp что-то есть? Или нули? ps Возможно, Оля так себя ведет только под 9x. Проверьте, у кого есть возможность. ![]() |
|
Создано: 28 января 2007 02:01 · Личное сообщение · #18 |
|
Создано: 28 января 2007 03:26 · Личное сообщение · #19 |
|
Создано: 28 января 2007 03:33 · Личное сообщение · #20 |
|
Создано: 28 января 2007 07:30 · Личное сообщение · #21 Проверил у себя, ХР СП2 - все нормально. Олька стек не трогает. Да и нафик ей стек? Чот у тебя с системой. По поводу того, что не подходит первое решение. Возьми тогда и вынеси и ф-цию и фильтр в другое место. В начале ф-ции(програмной) вставь колл на свой код. Да и всех делов. Ну правда придется вручную переправить все джампы и коллы, но никаких проблем со стеком тогда уж точно не будет. ![]() |
|
Создано: 28 января 2007 09:16 · Личное сообщение · #22 Вообще говоря, теоретически при постановке бряка или пошаговой трассировке происходит исключение, которое передаётся сначала в 0, а затем в 3 кольцо. Скажу честно, что досконально этот алгоритм я не знаю, но, возможно в 9х виндах стек может портиться из-за этого, поскольку может использоваться стек самого приложения. ![]() |
|
Создано: 29 января 2007 05:52 · Личное сообщение · #23 |
![]() |
eXeL@B —› Программирование —› Подключаю фильтр... Проблемы со стеком. |