Cracking: скручиваем счетчик

Xakep, номер #048, стр. 048-064-3


Распаковка EXE и поиск места по определению даты

Но ближе к делу, точнее, к телу нашего пациента. Приступим к операции. Сразу скажу, что Registry Monitor на этот раз ничем не помог, и мы воспользуемся отладчиком. Но перед этим нам предстоит совершить еще несколько действий. Дело в том, что все исполняемые файлы, входящие в состав LockDown Millennium Pro, запакованы. Выяснить это можно, прибегнув к помощи утилиты PE iDentifier. Она сообщила, что использован упаковщик ASPack 2.11c. Для распаковки я применил утилиту AspackDie 1.2. Размер файла LDProMenu.EXE до и после распаковки составил 232448 и 815104 байта соответственно. А сейчас начинаем отладку. До этого лучше завершить все текущие приложения, так как точки останова (брейкпоинты) срабатывают во всех процессах. Если программа имеет ограниченное время действия, значит, при запуске она проверяет текущую дату. Функция GetLocalTime из Kernel32 возвращает текущие дату и время. Переключаемся в рабочее окно SoftICE (комбинация [Ctrl][D]) и ставим брейк. Надеюсь, ты уже понимаешь, что для установки точки останова нужно ввести команду BPX GetLocalTime. Продолжаем работу. Запускаем LDProMenu.EXE или ярлык Launch Main Menu в папке LockDown Millennium Pro. Если брейк сработает до запуска программы - просто нажми [F5] для продолжения. После запуска остается лишь выяснить, какая из точек останова - именно та, которую мы ищем. В правом нижнем углу окна SoftICE указан текущий процесс. Если это не LDProMenu - продолжаем выполнение. Иначе, необходимо узнать - из какого модуля была вызвана функция GetLocalTime. В верхней части самого нижнего рабочего окна SoftICE (того, в котором вводятся команды) указано, какой модуль сейчас отлаживается. Когда срабатывает точка останова, мы попадаем в модуль Kernel32, ведь в нем и находится функция GetLocalTime. Нажимаем клавишу [F12], чтобы закончить выполнение функции и вернуться к тому месту, откуда она была вызвана. Теперь смотрим, в каком модуле мы оказались. Если это не LDProMenu - жмем [F5] для продолжения работы.

Победа! Замена условного перехода на безусловный

Необходимо проделывать вышеописанные действия (проверять брейкпоинты) до тех пор, пока текущим процессом не окажется LDProMenu, и вызов функции GetLocalTime не будет произведен из модуля LDProMenu. Если ты достиг этого, следуя моим рекомендациям, то сейчас находишься в процедуре, из которой был произведен вызов функции GetLocalTime, на инструкции, следующей за этим вызовом. Скорее всего, данная процедура является библиотечной функцией языка Delphi (именно на нем написана программа LockDown Millennium Pro). Поэтому возвращаемся еще на один вызов вверх (опять [F12]). Смотрим на окно кода. Несколько команд для восстановления регистров из стека и команда возвращения - RET. Мы в конце какой-то процедуры, поэтому просто жмем [F12]. На этот раз мы оказались в очень интересном месте. Вот какие команды я увидел:

Назад на стр. 048-064-2  Содержание  Вперед на стр. 048-064-4