В этой статье мы попытаемся почувствовать себя настоящими исследователями программ. Конечно, это будут только первые робкие шаги, но именно они обычно являются определяющими для всей остальной работы в этом направлении. Нашей целью будет регистрация всемирно известной программы WinZip 7.0 (beta). В статье рассматривается build 1243, для более новой программы возможны некоторые отличия в адресах.
Устанавливаем и запускаем WinZip. Сразу после старта появляется окно, сообщающее о том, что программа не зарегистрирована. Если программу не зарегистрировать это окно будет появляться при каждом новом запуске. Это неудобно! В меню Help выбираем пункт About WinZip... В появившемся окне нажимаем кнопку Register. Открывается окно регистрации. Вводим в поле Имя имя, под которым хотим зарегистрировать программу (я использовал Fox Mulder). В поле РН вводим любую информацию (я обычно использую 200001, чтобы потом при необходимости его легко было опознать) и нажимаем кнопку ОК. Появляется окно, сообщающее, что введена неполная или неверная информация. Обращаю Ваше внимание на это окно. Это типичное окно MessageBox (окно сообщения). Его отличительными чертами являются:
неактивная кнопка закрытия окна
| наличие внутри окна иконки (вид иконки
зависит от типа сообщения)
| наличие одной или нескольких кнопок (их
названия и количество также зависит от
типа сообщения) | |
В программе окно MessageBox может создаваться с помощью четырех функций: MessageBox(), MessageBoxA(), MessageBoxIndirect() и MessageBoxIndirectA(). Функции, не оканчивающиеся символом A (MessageBox(), MessageBoxIndirect()) используются преимущественно приложениями Win16 (Windows 3.x) и на них мы будем рассчитывать меньше всего. Остаются две функции: MessageBoxA() и MessageBoxIndirectA(). Какая из них используется программой, определяем опытным путем:
Закрываем окно сообщения
| Активизируем SoftICE (Ctrl+D)
| Устанавливаем точки прерывания на
вызов MessageBoxA() и MessageBoxIndirectA() (bpx
MessageBoxA, bpx MessageBoxIndirectA)
| Возвращаемся в Windows (F5) | |
Нажимаем F12 (команда p ret), для
продолжения программы до выполнения
команды ret. Перед нами вновь появляется
знакомое окно сообщения, при нажатии в
нем на кнопку ОК программа
прерывается и управление передается
SoftICE. Мы видим, что теперь программа
остановилась в модуле WINZIP32:0137:00426920 FF15C4AF4700 call [USER32!MessageBoxIndirectA] 0137:00426926 EB14 jmp 0042693C <- в этой строке находится курсор |
Вот мы и нашли то место, где вызывается функция MessageBoxIndirectA() и создается окно сообщения. Теперь можно удалить установленные точки прерывания (команда bc *), т.к. они нам больше не понадобятся. В этой статье мы больше ничего, связанного с функцией MessageBoxIndirectA(), не узнаем. Использовали мы ее по двум причинам:
Здесь уместным был бы Ваш вопрос о том, почему для установки этой точки прерывания не пришлось прибегать к каким-либо хитростям? Все очень просто! Точка прерывания на вызов MessageBoxIndirectA() устанавливается на первую команду кода этой функции в модуле USER32. Этот модуль находится в области памяти, которая является общей для всех запущенных приложений Windows (она расположена выше 2-го Гб), поэтому здесь никаких трудностей не возникает.
Итак, продолжим:
Мы все еще находимся в SoftICE.
Устанавливаем точку прерывания на
выполнение команды по адресу 00407CA5 (команда
bpx 407CA5).
| Выходим в Windows (F5) и вновь пытаемся
зарегистрироваться. При этом программа
прерывается при выполнении команды по
адресу 00407CA5, в окне команд SoftICE
сообщается, что программа остановилась
на точке прерывания по адресу 0137:00407CA5.
| Вводим команду db eax (показать в окне
данных содержимое памяти в виде байт,
начиная с адреса, содержащегося в
регистре eax) и переписываем 8 символов
нашего регистрационного номера (у меня
это 409A11AA).
| Убираем не нужную уже точку прерывания
(команда bc *) и выходим в Windows (F5).
| Наступает решающий момент. Вводим в
поле РН полученный регистрационный
номер и нажимаем кнопку ОК.
Программа просит подтвердить
регистрационную информацию, и после
нажатия ОК Вы уже являетесь
владельцем личного WinZip'а. | |
P.S. Вы хотите узнать, откуда взялся адрес 00407CA5?, тогда посмотрите в сборнике Эдуарда Титова статью в разделе Исследования/Защита паролем.
|