Доброго времени суток, ребята! Закрывается главная форма Сегодня я расскажу вам, как с помощью трех инструментов... 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: