1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

Снимаем ограничения в Delphi программах

Тема в разделе "Статьи, руководства, видео", создана пользователем Dr. MefistO, 6 фев 2012.

  1. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    125
    Доброго времени суток, ребята!

    Закрывается главная форма

    Сегодня я расскажу вам, как с помощью трех инструментов...
    • IDR (для анализа ограничений);
    • Olly Debugger v2 (для снятия ограничений);
    • Блокнот (для осмотра исходного кода).
    ...можно найти и избавиться от какого-то ограничения, при котором приложение, либо форма закрывается.

    Я написал простенькое приложение, которое закрывается, если в течение 10 секунд после появления главной формы не нажать кнопку "Untrial":
    UntrialMe (тестовое приложение)​

    Исследуем его...
    Откроем наш антриал в IDR, и подождем, пока проанализируется exe-файл. Далее жмем Tools->Lister, и сохраняем сгенерированный листинг.

    Открываем его в блокноте. Нам нужно найти слова типа: Close, Terminate. Ищем, и находим:
    Код:
    //procedure TForm1.tmr1Timer;
     0044DF28    push       ebx
     0044DF29    mov        ebx,eax
     0044DF2B    call       kernel32.GetTickCount
     0044DF30    sub        eax,dword ptr ds:[44FCE0]; gvar_0044FCE0:Cardinal
     0044DF36    cmp        eax,2710
    >0044DF3B    jbe        0044DF44
     0044DF3D    mov        eax,ebx
     0044DF3F    call       TCustomForm.Close
     0044DF44    pop        ebx
     0044DF45    ret
    Далее вариантов несколько: либо поменять прыжок, либо заNOPить команду TCustomForm.Close, либо найти место, где вызывается TForm1.tmr1Timer целиком, и заNOPить ее вызов.

    Я изменю прыжок:
    jbe - прыжок (jump), если меньше (below), либо равно (equal). Идет сравнение с 2710 (HEX), либо 10000 (DEC) (в миллисекундах). Исправим на JMP, т.к. в этом случае мы всегда будем перепрыгивать команду закрытия приложения.

    Для этого откроем приложение в Olly Debugger, перейдем на адрес команды:
    Код:
    0044DF3B    jbe        0044DF44
    и изменим ее на:
    Код:
    0044DF3B    jmp        0044DF44
    Сохраним изменения, пробуем запустить. Прекрасно - программа не закрывается)

    Меняется заголовок программы

    Идем дальше, модифицируем исходное приложение так, чтобы при нажатии на кнопку (считай, вводе неверного ключа, либо без него вообще) в заголовке программы отображалось "UNREGISTERED VERSION" (ну, либо какого другого текста).

    Наша задача: найти момент изменения заголовка.
    Для этого опять открываем проект в IDR, сохраняем листинг, но ищем уже другие слова: "Caption", либо "SetText". Первый вариант подходит для лейблов, и других подобных объектов, второй же - для текстовых полей, заголовков окон. Нашли:
    Код:
    //procedure TForm1.btnUnCaptionClick;
     0044DEEC    mov        edx,44DF00; 'UNREGISTERED VERSION'
     0044DEF1    call       TControl.SetText
     0044DEF6    ret
    Что нам можно сделать? Можно вместо самой первой команды вставить команду
    Код:
    RET
    RET - выход из процедуры (return). Для этого откроем UnCaptionMe в Olly Debugger, и перейдем к адресу изменяемой команды. Поменяем ее на RET, и сохраним изменения.
    Вуаля - заголовок не меняется.

    ИТОГ

    Такими вот методами (с помощью Lister'а) можно находить многократные обращения к заголовкам, текстовым полям, названиям кнопок, да и к свойствам Visible, Enabled тоже! Попробуйте поэкспериментировать у себя на тестовых приложениях, и вы поймете, что это очень просто.

    Автор: Владимир Мефисто

    Добавлено через 1 час 57 минут
    Комментарий от автора IDR:
     
    Последнее редактирование: 6 фев 2012
    6 фев 2012
    4 пользователям это понравилось.

Поделиться этой страницей

Загрузка...