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