Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование Multi-Edit 8.0. Программа с интересной защитой
Автор: Zet

Если программа дает неверный результат - в ней ошибка. Если же результат правильный - ошибок, как минимум, две.

Пригодится как для начинающих так и для более продвинутых, заодно убеждаешься, что не всякую программу можно взломать только с помощью SoftICE - иногда надо думать головой.

Вступление

Недавно мне попался в руки такой редактор - Multi-Edit 7.0. Замечательная вещь, с почти не ограниченной функциональностью, поддержкой любого компилятора - одним словом - лучший редактор для программиста. Потом я поискал и нашел более новую версию - Multi-Edit 8.0. В ней добавлена поддержка Borland Delphi, C++ Builder, Watcom C, а также - прием/передача файлов по FTP. К сожалению, эта версия защищена - при загрузке появляетс сообщение о том, что это демо-версия, в процессе работы появляется то же сообщение, причем каждые 15 минут. Кроме того не работает поддержка FTP и действительно отсутсвует проверка английского правописания.

Инструменты

  • 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 остались.

Заключение

Перед началом работы, всегда следует проанализировать и попытаться представить, как именно программа защищена. Это может сильно облегчить жизнь.

Публикуемые материалы предназначены только для образовательных целей. Если Вам понравился тот или иной программный продукт и Вы планируете его использовать на протяжении длительного времени - советуем Вам его приобрести.

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