· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ZEN —› SoftICE ....

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


Дата: Янв 18, 2003 17:15:03

Здраствуйте - снова я ... :|
вот ставлю точку прерывания на сообщение, типа bmsg xxxx wm_lbuttonup и попадаю в какой-то kernel.alloc ... отлично - сообщение отлавливается с момента своего зарождения ..., но мне надо сразу попасть в код моей прошки. Жму до посинения F10 (на первый раз терпения хватает) ... наконец-то блин - вот она, родная. Фиксирую CS моей проги и пишу типа, bmsg xxxx wm_lbuttonup if cs == xxxx - да..к теперь вообще не работает ...
Подскажите пожалуйста, как тут сразу попасть в код программы минуя всякие user и kernel, а то жать до утра F10 - типа смысл всего как-то теряется ... !
И еще. Хочу глюканом поделится. У меня 98 винда, пишу такую последовательность:
bmsg xxxx бэ бэ бэ
bpio xxx
,
жму Crtl-D, выхожу в винду - синий экран (!!!) - МЕРТВО ... гы гы гы ...


Дата: Янв 20, 2003 16:34:53

Загрузи в SoftIce таблицу символов своей программы, и не мучайся!


Дата: Янв 20, 2003 21:50:17

Хм..м, это ты имееш ввиду просто компильнуть мою прогу с отладочной информацией, а потом поставить bpx на TForm1.Button1Click, т.е. SoftICE будет шарить, где что ... ?! Или как ... ? Хотя вроде понятно ...
Ну, а если программа чужая ?!. Отладочной инфы нету, понятное дело ... Как здесь сразу попасть в обработчик события в проге ? - о чем я и хотел сразу спросить ... .|


Дата: Янв 21, 2003 11:11:58 · Поправил: Four-F

Жму до посинения F10

Жми F12 - будешь выходить сразу из процедуры на один уровень вверх.

===============================================

К сожалению тупо не объяснить - много вариантов.
Пишу по памяти и по старым черновикам - статью когда-то хотел писать.
Так что могут быть несовпадения - решишь медитативным путем ;-)

:hwnd xxx
Window Handle hQueue SZ QOwner Class Name Window Procedure
xxx(2) 120F 32 WINHLP32 MS_WINTOPIC ssss:aaaaaaaa

xxx - хендл интересующего тебя окна.
Window Procedure говорит само за себя.
Делаешь u aaaaaaaa
В первой или второй команде будет адрес.
Это и есть адрес оконной процедуры.
Работает это не всегда, особенно если это стандартная процедура контрола и т.п.

=====================================================================

Есть другой, практически универсальный способ - Найти место гда формируется сообщение.
Ставишь бряк:
bpx K32Thk1632Epilog do "p ret"

p ret - выход из процедуры.
Будешь вываливаться попеременно в одном из этих мест:


0187:BFF94213 E8CDD5FDFF CALL KERNEL32!K32Thk1632Prolog
0187:BFF94218 E8A086FEFF CALL KERNEL32!WaitForSingleObject
0187:BFF9421D E8E8D5FDFF CALL KERNEL32!K32Thk1632Epilog


Тя интересует зто:

0187:BFF943FD E8E3D3FDFF CALL KERNEL32!K32Thk1632Prolog
0187:BFF94402 E8F6F1FDFF CALL BFF735FD ; <- bpx сюда
0187:BFF94407 E8FED3FDFF CALL KERNEL32!K32Thk1632Epilog

Процедура BFF735FD как раз и формирует мессагу окну.
Это бутылочное горло. Если правильно расставишь условные бряки, то можна черта в ступе отловить.


0187:BFF735FD PUSH EBP
0187:BFF735FE MOV EBP,ESP
0187:BFF73600 PUSH ESI
0187:BFF73601 PUSH EDI
0187:BFF73602 MOV GS,[EBP+0A]
0187:BFF73606 MOVZX ESI,WORD PTR [EBP+08]
0187:BFF7360A MOV ECX,GS:[ESI]
0187:BFF7360D AND ECX,7FFFFFFF
0187:BFF73613 JZ BFF7362D
0187:BFF73615 MOV EAX,[EBP+10]
0187:BFF73618 TEST EAX,EAX
0187:BFF7361A JNZ BFF7365F

; забивка в стек параметров сообщения
0187:BFF7361C LEA EDX,[ESI+0C]
0187:BFF7361F SHR DWORD PTR GS:[ESI+04],1
0187:BFF73623 JB BFF73647
0187:BFF73625 PUSH DWORD PTR GS:[EDX] ; PUSH lParam, wParam, uMsg, hWnd
0187:BFF73628 LEA EDX,[EDX+04]
0187:BFF7362B LOOP BFF7361F

0187:BFF7362D MOV EDI,ESP
0187:BFF7362F XOR EAX,EAX
0187:BFF73631 CMP GS:[ESI+08],EAX
0187:BFF73635 JZ BFF7363B

; вызов оконной процедуры
0187:BFF73637 CALL GS:[ESI+08] ; CALL WndProc
0187:BFF7363B MOV ESP,EDI
0187:BFF7363D XOR ECX,ECX
0187:BFF7363F MOV GS,CX
0187:BFF73641 POP EDI
0187:BFF73642 POP ESI
0187:BFF73643 LEAVE

Например наблюдать все сообщения всем окнам можно набрав в SoftICE следующие команды (BFF73637 для моей 98SE):

watch * esp
watch *(esp+4)
watch *(esp+8)
watch *(esp+c)
watch gs:esi+8
bpx BFF73637 do "d gs:esi+8; u *dataaddr"


Дата: Янв 21, 2003 19:21:36

... ого - загрузил ... ~|:-) ... Сейчас, сошкребу страничку за полчасика, да пойду медитировать ... ;)


Дата: Янв 21, 2003 20:37:21

Удачи ;-)


Дата: Янв 23, 2003 18:47:31

Таки да :) ..., все так и есть ... спасибо !!!


Дата: Окт 17, 2003 17:09:35

А что такое KERNEL32!K32Thk1632Prolog ?
Я правильно понял, что это возможность BP на Entry Point?
Кстати, как можно BP на Entry Point без таблицы символов?


Дата: Окт 17, 2003 21:47:16

Янв 23, 2003 18:47:31 - ууёёё... когда же это было :)


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