Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Подключаю фильтр... Проблемы со стеком.
Посл.ответ Сообщение

Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 24 января 2007 14:38 · Поправил: 0xy
· Личное сообщение · #1

Есть некая процедура чтения данных.
Задача: в самое ее начало добавить call на свою процедуру-фильтр, выполнить (в своей процедуре) команды, вытесненные этим call и обеспечить ret из нее обратно, сохранив нетронутыми стек и все регистры.
Процедура-фильтр анализирует запрос и либо возвращает управление оригинальной процедуре чтения, либо сама выдает данные и передает управление тому, кто их запрашивал.
Проблема в том, что мой call вытесняет следующие инструкции:
push ebp
mov ebp, esp
add esp, -0c

и у меня не получается выполнить их и затем сделать возврат, не нарушая условий задачи

ps
Процедуру добавляю в Ольке



Ранг: 13.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 января 2007 16:34 · Поправил: =Usacha=
· Личное сообщение · #2

А попробуй в начало доюалять jmp на пустое место и оттуда уже call, а перед ним - то что вытеснил джамп. (мутно обьяснил. см статейки про инлайн-патчи)
Если необходимо сохранять регистры, то
pushad
call
popad



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 24 января 2007 17:21 · Поправил: 0xy
· Личное сообщение · #3

=Usacha= пишет:
А попробуй в начало доюалять jmp на пустое место

С jmp всё просто, но некрасиво. И при ковырянии сразу в глаза бросается...

Пробовал присобачиться так:
(Моя) процедура-фильтр:
pushad
...........
mov eax, ss:[esp+20] сохраняю адрес возврата ниже в стёке
mov ss:[esp+10], eax
popad
add esp, 4 ; ставлю указатель так, как было в процедуре, к которой я присобачился
push ebp ; выполняю комманды, вытесненные моим Call
mov ebp, esp
add esp, -10 ; =-0c-4
ret

Но проблема в том, что после выполнения add esp, 4 разрушаются данные в стеке: мой адрес возврата. Хочу узнать, насколько это закономерно? Сохранность данных в стеке ниже esp что, в принципе не гарантируется?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 24 января 2007 23:42
· Личное сообщение · #4

0xy
Ну не ниже, а выше, поскольку стек вверх ногами. В принципе программы обычно не опираются на то, что лежит в стеке выше, поэтому менять это дело можно. А вот если хитрозадая защита, то может быть она и проверяет стек выше. Для этого тут была тема, в которой чел хотел полностью стек на свой подменить. Если такой гемор не нужен, то забей на то, что верх стека перезаписывается.




Ранг: 127.3 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 25 января 2007 00:06
· Личное сообщение · #5

0xy
Твоя
push ebp
mov ebp, esp
add esp, -0c
Откуд-то вызывается? Пиши в пустое место свою ф-цию. В конце своей ф-ции добавь
PUSH xxxxxxxx, где ххххххх - адрес правильной ф-ции. Так аспак делает переход на ОЕП. Рет пойдет в правильную ф-цию и она уже будет работать как надо. Ну, естественно, колл в нее исправь на колл в свою. Если не понял, то приведи кусок с адресами, на адресах будет понятней.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 25 января 2007 00:29
· Личное сообщение · #6

call PROGA

--------------------
пролог PROGA
тело PROGA
эпилог PROGA
-------------------
пролог FILTR
тело FILTR
JMP тело PROGA
тело FILTR
эпилог FILTR
------------------------
Заменям call PROGA на call FILTR

JMP естественно надо дополнить восстановлением стека(если нужно)
Прологи и эпилоги должны быть одинаковыми естественно(ну за исключением опять же стека).



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 25 января 2007 01:15
· Личное сообщение · #7

в фильтре:
pushad
...
popad
xchg ebp,[esp] ;адрес возврата в ебп
xchg ebx,[esp-14h] ;сохраняем адрес возврата
mov ebp,esp ;тут будут локальные переменные
add esp,-14h
ret возвращаемся



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 25 января 2007 13:43
· Личное сообщение · #8

stahh, tundra37
Ваш вариант не устраивает, т.к. этих CALL PROGA у меня куева туча, да к тому же не все они явные!

asd
Похоже, должно сработать (еще не пробовал). Но я хочу найти универсальное решение задачи, а твой код привязан к конкретному началу процедуры (push ebp; mov ebp,esp; add esp, -0c)

Archer пишет:
программы обычно не опираются на то, что лежит в стеке выше, поэтому менять это дело можно

Дыд я сам хотел на это опереться! А оно почему-то исчезает после безобидной команды add esp,4!
КАК ЭТО МОЖНО ОБЪЯСНИТЬ?
Протов нет ни на проге, ни на Ольке (хотя, возможно, на какой-нить длл-ке и есть?). Второго потока тоже не наблюдается...



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 25 января 2007 18:09 · Поправил: 0xy
· Личное сообщение · #9

asd
Не-а, не работает! xchg ebx,[esp-14h] срабатывает только в одну сторону, т.е. как mov.
А mov [esp-14], ebx вообще ни чего не делает! Т.е. после его выполнения данные в стеке не изменяются.
В общем, те же грабли, что и в моём варианте: данные в стеке выше указателя не выживают.
Чё за маразм такой???:



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 25 января 2007 20:50
· Личное сообщение · #10

Оба-на! Код таки рабочий. А виновницей маразма оказалась Олька!
Остановившись на любом бряке, Оля портит стек выше esp-10h
Или это только у меня?

зы
Плугины точно не при чем.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 25 января 2007 22:30
· Личное сообщение · #11

0xy пишет:
Не-а, не работает! xchg ebx,[esp-14h]


там ебп должно быть, и я не понял, сколько там локальных переменных 3 или 4?

0xy пишет:
Но я хочу найти универсальное решение задачи



pushad
mov ebx,[esp+20h];адрес возврата
sub ebx,5
sub ebx,offset end_code
add ebx,offset old_code_end - offset old_code_start
neg ebx
mov jmp_range,ebx
...;тут делай что хочешь
popad
add esp,4
old_code_start:
... ;тут старый код
old_code_end:
db 09eh
jmp_range dd 0
end_code:




Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 26 января 2007 16:37
· Личное сообщение · #12

asd
asd пишет:
там ебп должно быть

Да эт понятно, опечатка. Я ж написал, что всё работает, но только не под Олей!

Спасибо за пример, буду вникать.

2 ALL
Кто-нибудь проверил это:
0xy пишет:
Остановившись на любом бряке, Оля портит стек выше esp-10h
Или это только у меня?




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 27 января 2007 02:54
· Личное сообщение · #13

0xy пишет:
Остановившись на любом бряке, Оля портит стек выше esp-10h

Сделал простой бряк по F2 - стек целехонек. Это же отладчик - он по определению стек не должен трогать, да и у него свой стек - зачем ему стек процесса. А вот плаги и сама программа - запросто.
Кстати про антивирусы не забыл и аутпосты - они любят свои DLL везде внедрять.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 27 января 2007 03:08
· Личное сообщение · #14

0xy пишет:
Оля портит стек выше esp-10h

Мб плугин корявый установлен...



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 27 января 2007 22:05 · Поправил: 0xy
· Личное сообщение · #15

Плагины все отключал. Любителей внедрять dll-тоже.
Всё показывает именно на Ольку!(м.б. еще зверьё, но не позоже)

Просьба ко всем, кому не лень, проделать такой эксперимент:
1. Загрузить в Ольке любую прогу и, стоя на ОЕП, глянуть, что лежит в [esp-14]
У меня ВСЕГДА [esp-14]=ds=ss=es=177h
2. Попробовать ПРОГРАММНО (MOV) записать туда что-то, и посмотреть, получится ли (у меня остается 177).
3. Если получилось, нажмите разок F7 и посмотрите, выживет ли.

PS
Крайне желательно проверить под Win 9x!





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 января 2007 23:47
· Личное сообщение · #16

0xy
Если имеешь в виду [esp-14h], то у меня на XР СП0 (система чистая без антивирей, фаеров и т.д.) всё нормально, всё живо, всё на месте.



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 28 января 2007 01:30 · Поправил: 0xy
· Личное сообщение · #17

Странно У меня такая картина: сразу после загрузки любой проги в Олю (на EP), стек выглядит следующим образом:
[esp-14]=ss
esp
efl
cs
eip
ebp
eax
ecx
edx
ebx
esi
edi
ds
es
fs
[esp-50]=gs

Выше лежит еще что-то (не нули)
Все эти значения восстанавливаются при любом бряканьи Оли (в т.ч. после F7) Кто это может делать кроме самой Оли?

Archer
А у тебя после загрузки проги выше esp что-то есть? Или нули?

ps
Возможно, Оля так себя ведет только под 9x. Проверьте, у кого есть возможность.





Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 28 января 2007 02:01
· Личное сообщение · #18

Ответы, не читал. Может уже и подсказали...
При использовании call твойя_процедура
ты в ней не сможешь выполнить коректно инструкции:
push ebp
mov ebp, esp
add esp, -0c
Замени call на push+ret или jmp.
Также, можешь попробовать уже готовое решение: madCollection>madCodeHook.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 28 января 2007 03:26
· Личное сообщение · #19

0xy
Проверил ещё на ХР СП2. Не, не нули, но и ничего особо дельного. Есть нули, есть адреса из kernel, есть вообще бред, вроде f68cfd08. Пробовал ставить бряк и забить адреса, меньше esp нулями, так они и остаются нулями. Так что дело в ОС, наверно.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 28 января 2007 03:33
· Личное сообщение · #20

0xy
Немного не по теме, но:
Не советую испольтзовать олю на 9х, т.к. система защиты адресного пространства хромает. Раньше я тоже пробовал на Ме, но система частенько висла. ИМХО, юзай ХР




Ранг: 127.3 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 28 января 2007 07:30
· Личное сообщение · #21

Проверил у себя, ХР СП2 - все нормально. Олька стек не трогает. Да и нафик ей стек? Чот у тебя с системой. По поводу того, что не подходит первое решение. Возьми тогда и вынеси и ф-цию и фильтр в другое место. В начале ф-ции(програмной) вставь колл на свой код. Да и всех делов. Ну правда придется вручную переправить все джампы и коллы, но никаких проблем со стеком тогда уж точно не будет.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 28 января 2007 09:16
· Личное сообщение · #22

Вообще говоря, теоретически при постановке бряка или пошаговой трассировке происходит исключение, которое передаётся сначала в 0, а затем в 3 кольцо. Скажу честно, что досконально этот алгоритм я не знаю, но, возможно в 9х виндах стек может портиться из-за этого, поскольку может использоваться стек самого приложения.



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 29 января 2007 05:52
· Личное сообщение · #23

И всё-таки, для окончательного диагноза, у кого есть возможность--проверьте под 9x


 eXeL@B —› Программирование —› Подключаю фильтр... Проблемы со стеком.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати