Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Основы работы с SoftIce
Любимая песня Модерн Токинг для компьютерщика: "You my hard, you my soft".

Вернемся теперь к установленному нами в первой статье SoftICE и попытаемся разобраться с интерфейсом этой замечательной программы и также узнаем команды, которые нам пригодятся в самое ближайшее время.

Так как SoftICE работает в 0-м кольце защиты, получить изображение интерфейса программы практически невозможно. Поэтому все описание будет чисто текстовым. Если при установке программы Вы следовали нашим указаниям, то сейчас интерфейс отладчика состоит из следующих частей (назовем их окнами, потому, что с ними действительно можно работать как с окнами - включать, выключать, изменять размер):

  • Самое верхнее окно - окно регистров (wr - сокращенное обозначение, используемое в SoftICE). В этом окне отображается содержимое регистров процессора. Отдельно от остальных в правом углу отображается состояние регистра флагов (каждого флага в отдельности). Наибольшее значение для нас имеет флаг нуля (изображается символом z). Заглавная буква Z означает, что флаг установлен, строчная - флаг сброшен. Под содержимым регистра флагов отображается также очень полезная для нас информация, но подробно я расскажу о ней в следующих статьях. Окно регистров включается и выключается командой wr.
  • Следующее - окно данных. В нем мы можем наблюдать содержимое интересующего нас участка памяти. Существует несколько различных форм представления информации в этом окне:
    • db - информация отображается в виде байтов (byte)
    • dw - информация отображается в виде слов (word)
    • dd - информация отображается в виде двойных слов (double word - dword)

    Информация в этом окне меняется при изменении содержимого участка памяти, т.е. Вы всегда видите именно то, что находится в данный момент в памяти. Окно включается и выключается командой wd.

  • Ниже расположено окно кода. В нем отображается дизассемблированный текст исследуемой программы. Курсор (красная строка для рекомендованных настроек) указывает на команду, которая будет выполнена на следующем шаге. В нижней части окна (на желтой полоске) показано, в каком модуле мы в данный момент находимся. Переключается окно с помощью команды wc.
  • Самое нижнее окно - окно команд SoftICE. Здесь Вы вводите команды и получаете некоторую полезную информацию о работе SoftICE. Т.к. выводимая информация целиком зависит от введенных команд, то описывать ее мы будем для каждой команды отдельно.

Работа всех Windows-приложений основана на вызове API-функций. Это очень удобно и выгодно. Например, для вывода окна сообщения с некоторым текстом, достаточно вызвать функцию MessageBoxA с адресом выводимой строки в качестве аргумента. Замечательной особенностью SoftICE является то, что Вы можете устанавливать точки прерывания на вызовы API-функций. Установив точку прерывания на некоторую строку программы, Вы сообщаете SoftICE, что при достижении этой строки программа должна прервать свое выполнение и возвратить управление отладчику. Например, Вы установили точку прерывания на выполнение команды по адресу 40А00020, а затем запускаете программу с адреса 40А00000. Дойдя до строки с адресом 40А00020, программа прервется, управление вновь вернется в SoftICE, и Вы сможете узнать содержимое регистров процессора, участков памяти, а также, при необходимости, что-то изменить.

Точка прерывания на вызов API-функции устанавливается точно так же, как и не выполнение команды по определенному адресу. При вызове функции программа прерывается в самом ее начале, и после этого Вы можете выполнить необходимые Вам действия. Обычно точку прерывания на вызов API-функции устанавливают, когда хотят узнать, из какого места программы она вызывается. Допустим, в программе имеется следующий фрагмент:


некоторый код
...
40200100 call MessageBoxA
40200105 cmp eax, 01
...
продолжение программы

Вы точно знаете, что вызывается функция MessageBoxA, но не знаете, что это происходит по адресу 40200100h. Для того, чтобы это выяснить мы должны проделать следующее:

  • Активизируем SoftICE (Ctrl+D)
  • Устанавливаем точку прерывания на вызов функции MessageBoxA (bpx MessageBoxA, советуем всегда писать общепринятые имена функций с заглавными и строчными буквами, SoftICE их не различает, а Вы так быстрее запомните). При этом происходит следующее: SoftICE устанавливает точку прерывания на выполнение первой команды указанной функции
  • Выходим в Windows (F5)
  • Выполняем те действия, в результате которых произойдет вызов функции MessageBoxA
  • При вызове этой функции (сообщение в окне команд) программа прерывается в модуле USER (указано в низу окна кода) и активизируется SoftICE, при этом курсор установлен на первой команде функции MessageBoxA. Чтобы узнать, из какого места произошел ее вызов, используем команду p ret (быстрая клавиша F12) - продолжение программы до выполнения команды ret (команда возврата из подпрограммы)
  • После этого, программа вновь прерывается по адресу 40200105 (на этой строке установлен курсор), а на предыдущей строке мы видим, что происходит вызов MessageBoxA. Вот мы и нашли то место, откуда вызывается функция MessageBoxA

Мы описали лишь незначительную часть команд SoftICE. Остальные подробно рассмотрим по мере их использования в наших следующих исследованиях конкретных программ. Что ж, мы уже немного освоились в SoftICE и вплотную подошли к необходимости использования дизассемблера. Без него никакого серьезного исследования программы Вам провести не удастся. Наш следующий рассказ о IDA Pro.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay