| Исследование Multi-Edit 8.0. Программа с
интересной защитой |
Пригодится как для начинающих так
и для более продвинутых, заодно убеждаешься, что
не всякую программу можно взломать только с
помощью SoftICE - иногда надо думать головой.
Вступление
Недавно мне попался в руки
такой редактор - Multi-Edit 7.0. Замечательная вещь, с
почти не ограниченной функциональностью,
поддержкой любого компилятора - одним словом -
лучший редактор для программиста. Потом я
поискал и нашел более новую версию - Multi-Edit 8.0. В
ней добавлена поддержка Borland Delphi, C++ Builder, Watcom C, а
также - прием/передача файлов по FTP. К сожалению,
эта версия защищена - при загрузке появляетс
сообщение о том, что это демо-версия, в процессе
работы появляется то же сообщение, причем каждые
15 минут. Кроме того не работает поддержка FTP и
действительно отсутсвует проверка английского
правописания. Скопировать программу можно с сайта American Cybernetics.
Инструменты
SoftICE 3.23 for Win95
Любой шестнадцатиричный редактор файлов
Исследование
Разберемся с тем, что говорилось
выше. Для начала я покажу как решить проблему с
сообщениями, появляющимися каждые 15 минут. Для
этого стоит внимательно изучить функции Win32 API
связанные со временем. Исход из того, что
программа отсчитывает промежутки в 15 минут,
наиболее подходящей функцией является GetTickCount.
Эта функция возвращает количество тиков со
времени запуска Win95. Исходя из этого, проделаем
следующее - запустим SoftICE, за ним наш Multi-Edit.
Закроем появившееся красивое окно с сообщением,
о том, что это демо-версия. Теперь мы в редакторе.
Используя bpx gettickcount я установил контрольную
точку. Выйдя из SoftICE практическеи мнгновенно
попадаем обратно - в функцию GetTickCount.
Нажимаем F12. Теперь мы здесь:
sub_40F164 proc near
call j_GetTickCount
mov ecx, 37h
cdq
idiv ecx
retn
sub_40F164 endp
По виду этого куска кода не
трудно догадаться, что осуществляется пересчет
тиков в более удобные(?) единицы. Нажмем F12 еще раз.
Теперь мы здесь:
sub_411748 proc near ; CODE XREF: sub_440430+43C
call sub_40F164 ; это и есть та самая функци
mov ds:dword_449388, eax ; сохраним текущее значение времени
mov eax, ds:dword_449388 ; бесполезная команда
cmp eax, ds:dword_44938C ; сравним
jz short loc_41176F ; равны - ничего не делаем
mov eax, ds:off_449A38 ; кол-во тиков равное (некоторое значение+15 минут)
mov edx, ds:dword_449388 ; текущее значение
call sub_40F1AC ; вредоносная процедура :)
loc_41176F: ; CODE XREF: sub_411748+15
mov eax, ds:dword_449388
mov ds:dword_44938C, eax
retn
sub_411748 endp
Особых пояснений
требует только call sub_40F1AC. я не привожу эту
процедуру из-за ее громоздкости. Достаточно лишь
понять основные ее функции. В общих чертах, эта
процедура проверяет, прошло-ли 15 минут со времени
появления предидущего демо-окна, и если прошло,
показывает то самое окно. Теперь можно подумать,
как именно взламывать. Есть несколько вариантов,
но что бы не копаться во внутренностях программы,
можно использовать простейший - вместо
инструкции call sub_40F1AC (кстати - ее длина 5 байт)
использовать что-то вроде
xor eax,eax
xor eax,eax
nop
Таким образом мы
успешно избавились от занудных напоминаний со
стороны авторов. Но еще есть над чем поработать!
Не очень то хочется каждый раз при запуске
программы видеть то самое окно, от которого мы
уже успешно избавились. Моя первая мысль была -
поставить что-то вроде bpx dialogboxparama, bpx dialogboxindirectparama
и запустить эту штуку. Попробуете сами. Никакой
реакции. Ну и ладно. Есть еще createdialogparama,
createdialogindirectparama и showwindow. Теперь уже есть какой-то
результат! Мы снова в SoftICE. А теперь попробуйте
найти, что же вызвало к жизни этот код. Если
хотите чему-то научиться - не читайте дальше, а
попробуйте сами.
Нашли?
Теперь остается
только изменить нужное условный/безусловный
переход или вызов функции. Остается найти и
изменить это место в файле(mew32.dll). Сделаем это и
запустим все снова. В лучшем случае - у вас больше
никогда не вызовется не одно окно диалога и
вообще никакое другое. В худшем - получите GPF of
death... А вот теперь и следует сесть и как следует
подумать. Подумать очень хорошо. Какая
возможность позволяет неограниченно наращивать
возможности Multi-Edit? Тот кто его знает, ответят
быстро - наличие внутреннего, очень мощного языка
макросов. Которые кстати компилируются в
некоторое подобие исполняемого кода(в Multi-Edit 8.0 eval
copy компилятор отсутствует - для этого то и нужен
Multi-Edit 7.0 - там он есть). Уже этого достаточно, чтобы
найти решение. Если еще не нашли, то вот вам
несколько подсказок - для начала посмотрите файл
Src/startup.s в том каталогое где установлен Multi-Edit 7.0.
Поле этого посмотрите в обоих программах такой
пункт меню - macro/list all macros... Я лично изучал этот
список около часа - из простого любопытства.
Исходя из полученных сведений можно сделать
вывод о том, что ВЕСЬ интерфейс этих программ
написан именно на внутреннем языке макросов.
Кроме этого есть там и такие замечательные
макросы как setserial, setdosserial, serial_test. Теперь выберите
Macro/run... и введите setserial. Никакого эффекта. Теперь
Serial_test. То же самое. А теперь setdosserial. А вот и
окошечко для регистрации пользователей,
обладающих старыми версиями под Дос. Если у кого
есть старый серийный номер - вводите. У кого нет -
идем дальше. Я подумал, что пытаться вычислить
пароль не имеет смысла. Кто не согласен - пусть
попробует. Если получиться - буду очень рад об
этом услышать (сами пароли кстати очень простые).
Помните, я говорил посмотреть файл Src/startup.s? Если
посмотрели, то какие идеи вам приходят в голову?
Если у кого этого файла нет (его нет в Multi-Edit 8.0) ,то
вот его содержимое:
// #define MEWDEMO
macro STARTUP DUMP {
// The following code used only for the demo
#ifdef MEWDEMO
rm('mewdemo^calclag');
rm('mewdemo^nagevent');
#endif
}
Здесь rm обозначет run
macro. Все еще нет идей? Тогда попробуйте поискать
строчки mewdemo^calclag и mewdemo^nagevent в файле mac/mew.mcl в
директории с MEW8. Если нашли - то попробуйте
заменить их на что-то вроде sdfffwgbssbsqepa. Как вы
вероятно догадолись, а вычитал в файлах помощи,
скомпилированный файл может содержать несколько
макросов, и поэтому в теле файла хранятся имена
содержащихся макросов. А в том, что теперь будет
вызываться макрос, которого якобы не существует
нет ничего страшного - об этом никто никого не
уведомляет. Более того - это более эффективный
взлом, чем тот, что мы использовали для
подавления 15-минутных напоминаний. Если
избавиться от этих двух макросов с самого начала,
то и напоминания не дадут о себе знать.
Теперь о том, чего
сделать нельзя - словарь для проверки
английского правописани действительно
отсутствует в демо-версии. Желающие, которым
необходимо передавать и принимать файлы по FTP
могут в качестве упражнения сами взломать эту
часть. Тем более, что макросы для работы с FTP
остались.
Заключение
Перед началом
работы, всегда следует проанализировать и
попытаться представить, как именно программа
защищена. Это может сильно облегчить жизнь.
Zet
Публикуемые материалы предназначены только для
образовательных целей. Если Вам понравился тот
или иной программный продукт и Вы планируете его
использовать на протяжении длительного времени -
советуем Вам его приобрести.
Для связи с
автором пишите ze_tty@yahoo.com .
Приму обьективную критику, советы, пожелания.
|
|
|