· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Стёк под Win9x

Посл.отвђт Сообщенiе


Дата: Ноя 19, 2003 13:17:00

Привет All!

Недавно заметил что на системах w9x всё что ниже
esp постояно меняетса (может быть прерывания).
Интересный ефект наблюдаетса когда поставит DRx
регистер указывать на esp-4. Потом, даже если
сами меняем esp, стёк остаётса полностъю нетронутым,
даже низкие адреса!

Может кто кто сможет прояснит ситуацию?
Тэнкс.


Дата: Ноя 19, 2003 14:05:07

если ты это заметил в отладчиках уровня приложения, то это они стек и юзают. на этом основан древний прием антиотладки...


Дата: Ноя 19, 2003 14:44:07 · Поправил: merlin

Буду по подробней.
Написал я маленкий прог под NT в котором играюсь
с esp. Работает ништяк.
Под 9x, однако получаю protection fault.
Открываю SIce, ставлю bpm на новый esp минус 4.
Работает ништяк! 8O
Пытаюсь ручками установит DRx регистры (прямо используя mov).
Устанавливаю всё по законам Интела.
Резултат, protection fault. Открываю SIce.
Выесняетса что код сходит с релсь! В прямом смысле!
Работает нормально до тех пор пока я его не меняю,
но как только поменял -> хона! Нахожу себя на странном
eip, в моём же коде. Выглядит как будто произошол
breakpoint, но ведь никто там breakpoint'ов не
устонавливал!


Дата: Ноя 19, 2003 17:50:39

Твой protection fault может быть следствием срабатывания DR-регистров. Ведь происходит int 1. Код покажи.


Дата: Ноя 19, 2003 18:47:40 · Поправил: merlin

Например:

call $+5
lea edi, dword [esp+4]
sub dword [esp], XXX ; так будет указывать на начало даных (в плотную к header'у)
mov esp, [esp]

loop1:
; Здесь издеваюсь над даными
; Проверяю одно условие, если оно ОК тогда меняю
; два nop'а на "jmp esp"
nop
nop
jmp loop1

Если запустить этот код просто так тогда будет выдавать
protection fault, потому что header защищён.
Если в айсе установить bpm на 400FFC (esp-4), тогда
всё пройдёт нормально, и стёк вообше не тронетса ни кем.

Так почему бы нам самим не установит эти DRx'ы.
Делаю тред:
push bpmHand
push dword [fs:0]
mov [fs:0], esp
mov eax, 400FFCh
mov dr3, eax
mov eax, dr6
and eax, 0FFFF0FF0h
mov dr6, eax
mov eax, 0F0000540h
mov dr7, eax

not byte [Ready] ; Синхронизирую

@@ThreadLoop:
mov ax, word [nops]
cmp ah, al
je @@ThreadLoop

; Здесь выползаю из треда и чищю DRx'ы
...

bpmHand:
mov eax, dword [esp+4]
mov eax, [eax]
cmp eax, 80000004h ; Single step
jne @@notDR3
mov eax, dr6
test eax, 8
jz @@notDR3
and eax, 0FFFF0FF0h
mov dr6, eax
xor eax, eax ; Continue execution
ret
@@notDR3:
push 1
pop eax ; Next handler
ret

Всё вроде должно работать нормально, но...
Получяетса protection fault.
Как бы это не показалось страным нахожу себя
на один байт вперёд после инструкции "jmp esp"
(уже не nop'ы, а замен произошол только что).

Вот здесь я и сел на мель.


Дата: Ноя 19, 2003 20:24:17

Сорри, это 9x. Я его не знаю. Там, выходит, можно писать в dr в третьем кольце? Обалдеть...
Но, кажется мне, ты делаешь глупость, когда ставишь DR на программу. Произойдет int 1. Я не знаю, какой у нее DPL под 9x. И программа слетит! Попробуй проверять на EXCEPTION_ACCESS_VIOLATION - там и причина понятной станет.


Дата: Ноя 19, 2003 22:32:13

Да в обшем то я тоже не очен то разбираюсь в 9х.
А то что можно писать в dr реги с третьего кольца
меня тоже поразило в первый раз.
А вот насчёт int 1, гдеж ему происходить?
Может подправку eip сделать, так на всякий пожарный.
Думаеш EXCEPTION_ACCESS_VIOLATION стоит проверить?

Сейчас я с ним ещё чюток потанцую и заодно проверю.


Дата: Ноя 19, 2003 22:53:32

А вот насчёт int 1, гдеж ему происходить?

Разумеется, после срабатывания DR-регистра.


Дата: Ноя 20, 2003 00:36:53

А я всё думаю про какой тут стёк речь идёт :-)


Дата: Ноя 20, 2003 03:29:17 · Поправил: merlin

@volodya:
А ну конечно, я думал про что то другое.
Но ведь всётаки я перехватываю single step,
правда толку от этого...
Может в DR7 поставить global?

@Asterix:
Из короткого текста програмы можно понять
что я вообщем расшифровываю определёный
кусок прога, и потом его запускаю.
Для изящности решил использовать стёк.
Перенаправил esp на мои даные, а потом
исползуя команды push/pop очень красиво
оперирую ими (даными) , и одновремено,
незаметно (почти) продвигаюсь по всему имежу.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047