Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


»спользование информационных команд




SoftIce имеет в своем распор€жении много разных команд, с помощью которых можно узнать состо€ние и получить иную информацию об операционной системе и запущенных в ней приложени€х. ћы рассмотрим только две команды: H (Help) и CLASS. Ёти команды вывод€т достаточно много информации в окне команд (Command Window), поэтому желательно увеличить размер этого окна, дл€ этого закроем окно локальных переменных (Locals Window).

ѕо команда H можно получить помощь по всем командам SoftIce или более подробную информацию о конкретной команде, если введете ее им€ в качестве аргумента команды H:

:H CLASS Display window class information CLASS [-x] [task-name] Ex: CLASS USER

ѕерва€ строка дает описание команды, втора€ показывает информацию о синтаксисе и аргументах, которые могут использоватьс€ в команде, треть€ строка содержит пример использовани€ команды.

÷елью выполнени€ функции RegisterAppClass €вл€етс€ регистраци€ шаблона дл€ классов окон, которые будут использованы приложением GdiDemo дл€ создани€ окон. »спользу€ команду CLASS можно посмотреть зарегистрированные классы дл€ GdiDemo:

:CLASS GDIDEMO

–езультатом выполнени€ данной команды €вл€етс€ информаци€ о каждом зарегистрированном классе окна. »нформаци€ включает в себ€: им€ класса, адрес внутренней структуры данных WNDCLASS, модуль который зарегистрировал данный класс, адрес процедуры, котора€ обслуживает данный класс и состо€ние флагов стил€ класса. ƒл€ получени€ подробной информации воспользуйтесь ключом -X.

Handle Class Name Owner WndwProc Styles --------------------------Application Private------------------------------- 5110??? GDIDEMO 2E9F:00000114 07000003 40AC??? GDIDEMO 2E9F:000000FE 07000003 409C??? GDIDEMO 2E9F:000000E8 03000003 3BC4??? GDIDEMO 2E9F:000000D2 03000003 3BB4??? GDIDEMO 2E9F:000000BC 07000003 3A00??? GDIDEMO 2E9F:000000A6 07000003

—имвольные имена

 огда вы загружаете приложение с отладочной информацией, SoftIce автоматически создает таблицу символьных имен котора€ содержит все имена, определенные в данном приложении. »спользу€ команду TABLE можно посмотреть какие таблицы символьных имен загружены в насто€щий момент:

:TABLE GDIDEMO [NM32] 0001044741 Bytes Of Symbol Memory Available

»спользуема€ в данный момент таблица символьных имен выделена цветом. ≈сли текуща€ таблица символьных имен не соответствует той на которую ссылаетс€ ваше приложение, то использу€ команду TABLE с именем вашего приложени€ в качестве аргумента, вы подключите нужную таблицу (если дл€ вашего приложени€ создана таблица):

:TABLE GDIDEMO

»спользу€ команду SYM вы можете посмотреть все символьные имена, определенные в текущей таблице (на экран вывод€тс€ по сегментам, внутри них в алфавитном пор€дке). ≈сли интересует какие-то определенные имена, то используйте шаблоны:

:SYM w*.text (0137:00401000, 000145C1 bytes) 0137:004012E0 WinMain 0137:00405700 WinMainCRTStartup 0137:004013AD WndProc 0137:0040AF50 wcslen 0137:0040C160 wcsncnt 0137:004107A0 wctomb 0137:0040FA50 write_char 0137:0040FAD0 write_multi_char 0137:0040FB20 write_string

Ќа экране список всех символьных имен начинающихс€ с буквы w, все они расположены в сегменте.text (выполн€емый сегмент, он начинаетс€ с адреса 0137:00401000 и имеет длину 0145C1H байт), т.е. эти имена - имена функций и процедур вход€щие в приложение GDIDEMO. ƒанные наход€тс€ в сегментах.data,.rdata,.idata.

”словные точки останова

ќдним из символов, определенных в приложении GDIDEMO, €вл€етс€ функци€ LockWindowInfo. Ќазначение этой функции - возвращение адреса переменных, которые определ€ют свойства окна. ƒл€ того чтобы ознакомитьс€ с условными точками останова и точками останова на доступ к пам€ти, мы выполним следующие действий:

Ј ”становим точку останова на функцию LockWindowInfo.

Ј ќтредактируем поставленную точку останова таким образом, чтобы она срабатывала по определенному нами условию.

Ј ”становим точку останова на доступ к €чейки пам€ти, дл€ того чтобы отследить обращени€ к этой €чейке.

”становка точки останова на функцию LockWindowInfo.

 омандой BPX LockWindowInfo поставим точку останова на выполнение на эту функцию.  аждый раз, когда в одном из окон приложени€ GDIDEMO нужно будет обновить информацию, программой будет вызыватьс€ функци€ LockWindowInfo, так как на эту функцию поставлена точка останова, то будет вызыватьс€ SoftIce.  омандой BL проверьте, установилась ли точка останова. «апустите приложение командой X или G.  ак только будет вызвана функци€ LockWindowInfo, SoftIce всплывет. “ак как обновление происходит посто€нно, то посто€нно вызываетс€ и SoftIce, что очень неудобно, если нас интересует обновление какого-либо конкретного окна. „тобы перехватить вызов на обновление конкретного окна, к примеру, POLYDEMO, воспользуемс€ условной точкой останова. »з исходного текста программы (файл wininfo.c) видно, что функци€ LockWindowInfo получает в качестве входного аргумента один параметр HWND (Handle Window) - дескриптор окна, и возвращает в вызывающую функцию одно значение - указатель на переменные дл€ данного окна. “о есть если бы мы заставили срабатывать точку останова только на обработчик окна POLYDEMO, мы бы добились своей цели. ƒл€ начала нам необходимо узнать дескриптор нашего окна, дл€ этого воспользуемс€ командой:

:HWND GDIDEMO WindowHandle hQueue SZ Qowner ClassName WindowProcedure 0724(1) 10FF 32 GDIDEMO GDIDEMO 365F:000001C4 0728(2) 10FF 32 GDIDEMO MdiClient 17A7:00001988 0734(3) 10FF 32 GDIDEMO BOUNCEDEMO 365F:00000232 0730(3) 10FF 32 GDIDEMO POLYDEMO 365F:000001DA 072C(3) 10FF 32 GDIDEMO DRAWEMO 365F:0000021c

ƒескриптор окна POLYDEMO имеет значение 0730. ≈сли в списке вы не увидели нужного окна, то запустите приложение клавишей X или G, оп€ть сработает точка останова, проверьте, создалось ли окно, если нет, то повторите последние действи€. “еперь можно останавливать исполнение программы только в том случае, когда в качестве параметра дл€ функции LockWindowInfo используетс€ значение 0730. ¬ Windows параметры дл€ функции обычно передаютс€ через стек. ѕри остановке в функции LockWindowInfo стек будет выгл€деть следующим образом (посмотреть содержимое стека можно подвед€ курсор к регистру ESP, нажав правую кнопку мыши, вызвать контекстное меню и выбрать команду Display, неплохо бы еще сменить командой DD формат вывода данных в DataWindow на показ двойных слов, так как наше приложение 32-разр€дное):

ESP = 0055FC00 013F:0055FC00 00404852 00000730 0055FC3C 00008CAA

Ј „исло 00404852 - это адрес, на который программа перейдет после завершени€ работы нашей функции (адрес возврата).

Ј „исло 00000730 - это дескриптор окна POLYDEMO (собственно то, что нас интересует).

“еперь зна€, где и что у нас передаетс€ в функцию, мы можем выставить условную точку останова. ƒл€ этого вызовем на редактирование точку останова, поставленную на функции LockWindowInfo:

:BPE 0

¬ нижней строке командного окна по€витс€ строка:

:BPX LockWindowInfo

и курсор установитс€ в конце строки. “еперь можете редактировать точку останова по своему усмотрению, в конце строки добавьте следующее условие:

IF ESP->4 == 00000730

и нажмите Enter.

“очка останова теперь будет выгл€деть так:

:BPX LockWindowInfo IF ESP->4 == 00000730

“о есть она будет срабатывать тогда, когда двойное слово по адресу ESP+4 будет равным числу 00000730, которое соответствует дескриптору окна POLYDEMO. ѕроверьте командой BL, соответствует ли точка останова заданной, запустите приложение и убедитесь, что вс€ эта конструкци€ замечательно работает.

”становим точку останова на доступ к первому двойному слову данных экземпл€ра окна POLYWINDOW.  ак уже отмечалось выше, входным аргументом дл€ функции LockWindowInfo €вл€етс€ дескриптор окна, выходным - адрес данных экземпл€ра окна. ѕосле срабатывани€ точки останова, поставленной на функции LockWindowInfo с параметром соответствующим дескриптору окна POLYWINDOW, на выходе функции будем иметь адрес данных экземпл€ра окна POLYWINDOW, по этому адресу и поставим точку останова на доступ к пам€ти.

ƒл€ того чтобы получить адрес данных экземпл€ра окна, выполним программу до строки с номером 57 (в файле WININFO.C):

:G.57

‘ункци€ возвращает 32-битное значение (в нашем случае адрес) в регистре EAX, поэтому можно, использу€ команду BPMD (BreakPoint Memory Dword) и значение адреса в регистре EAX, поставить точку останова на доступ к первом слову данных экземл€ра окна POLYDEMO:

:BPMD EAX

Ёта команда использует регистры аппаратной отладки встроенные в процессор дл€ отслеживани€ чтени€ и записи двойного слова по указанному линейному адресу. ¬ данном случае это первое слово данных экземпл€ра окна POLYDEMO. »спользуйте команду BL, чтобы проверить правильность установки точки останова.

:BL 00) BPX LOCKWINDOWINFO IF ((ESP->4)==0x00000730) 01) BPMD #015F:0052006C RW DR3

“очка останова с номером 0 установлена на исполнение функции LockWindowInfo и точка останова с номером 1 стоит на доступ к пам€ти по адресу #015F:0052006C.

ќтключите 0 точку останова командой BD (Breakpoint Disable):

:BD 0

¬ отличие от команды BC, котора€ удал€ет точку останова, команда BD временно отключает точку, т.е. она не будет срабатывать, но ее в любой момент можно включить обратно командой BE (Breakpoint Enable). ќтключенные точки останова выдел€ютс€ звездочками р€дом с пор€дковым номером точки останова.

:BL 00) * BPX LOCKWINDOWINFO IF ((ESP->4)==0x00000730) 01) BPMD #015F:0052006C RW DR3

«апустите SoftIce командами X или G, когда окно POLYDEMO попытаетс€ получить доступ к первому двойному слову экземпл€ра данных окна, сработает точка останова и SoftIce всплывет, это будет происходить в функци€х PolyRedraw и PolyDrawBez. Ёти функции обращаютс€ к полю nBezTotal, которое находитьс€ по нулевому смещению в данных экземпл€ра окна POLYDEMO. «начение этого пол€ задает количество кривых одновременно выводимых в окно POLYDEMO.

ѕримечание: »з-за особенностей архитектуры процессоров Intel перехват обращени€ к €чейки пам€ти произойдет после исполнени€ команды, обращающейс€ к пам€ти, т.е. SoftIce остановитьс€ на следующей команде.

—бросьте все точки останова командой BC * и выйдете из SoftIce.

 ак заставить SoftIce pаботать?

Config.Sys: Device=c:\...\...\S-Ice.Exe
«атем запускаете Ldr.Exe <пpограмма>. ” MS-DOS есть маленький баг: он неверно выставл€ет значение регистра SP - он уменьшает его значени€ на 2, и некоторые защиты, активно использующие стек заставл€ют повеситьс€ задачу. Ћечитс€ правкой кода MS-DOS при загрузке INT 21h AX=4B01h или командой "R SP=SP+2"

 ак заставить SoftIce/Win/W95 pаботать?

ќтредактировать файл WINICE.DAT, дать возможность грузить отладчику символьную информацию из системных DLL-ей. (¬ Winice.DAT даютс€ ссылки на USER.EXE, KRNL386.EXE, WIN386.EXE)

exp=c:\win\system\user.exe exp=c:\win\system\gdi.exe exp=c:\win\system\krnl386.exe

 

 

http://protect.htmlweb.ru/





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2016-12-05; ћы поможем в написании ваших работ!; просмотров: 318 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

¬ы никогда не пересечете океан, если не наберетесь мужества потер€ть берег из виду. © ’ристофор  олумб
==> читать все изречени€...

520 - | 497 -


© 2015-2023 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.012 с.