Другим популярным ограничением DEMO-версий является ограниченное время использования. Бывают по крайней мере два вида ограничений. В первом отсчет времени идет от момента первого запуска, а во втором программа работает до некоторой заранее установленной даты. Разумеется, первое гораздо удобнее, но и более уязвимо, так как необходимо где-то сохранить дату первого запуска (причем убедиться, что он именно первый). Есть очень немного способов это сделать. Практически разработчики ограничены реестром или внешним файлом. Изменять код самой программы недопустимо, так как это вызовет протест со стороны антивирусов, а, значит, и со стороны использующих их клиентов. Под MS-DOS программы прошлого поколения могли писать в инженерные цилиндры жесткого ' диска, в неиспользуемый конец последнего кластера файла, неиспользуемые поля CMOS. Сегодня ситуация изменилась. Современные операционные системы типа Windows NT вообще не дадут непривилегированному пользователю прямого доступа к диску. Идет активное внедрение сетевых технологий, а следовательно, защитный механизм должен успешно функционировать и на сетевой машине. Таким образом, практически единственной подходящей кандидатурой выглядит реестр. Однако все обращения к нему очень легко отследить и отредактировать. Или можно переустановить операционную систему, уничтожив реестр.
Впрочем, не менее уязвима эта технология по отношению к переводу системной даты, что доступно даже неквалифицированным пользователям. Однако работа с некорректной датой вызывает определенные неудобства, а в некоторых случаях даже недопустима, поэтому предпочтительнее все же модифицировать код программы, убрав ограничение по времени. Или по крайней мере отследить сохранение момента первого запуска и подредактировать его. Второе часто значительно проще, поэтому начнем с него.
Рассмотрим для примера crack05 (file://CD:SOURCEVCCRACK05 RELEASEcrack05.exe). Программа при первом запуске запоминает текущую дату и по истечении 20 дней с этого момента прекращает работу. Переустановка (т.е. удаление и восстановление с оригинала) не помогает. Где же записан момент. первого запуска? Быть может, в реестре? Это предположение нетрудно проверить любым монитором реестра. Запустим, например, "Regmon for Windows NT/9x" by Mark Russinovich. Теперь все обращения к реестру будут протоколироваться. Так выглядит протокол при первом запуске защиты:
40 Crack05 OpenKey HKCUSOFTWARECRACK05 KOTFOUMD
41 Crack05 CreateKey HKCUSOFTWARECRACK05 SUCCESS hKey: OXC29AF430
42 Crack05 SetValueEn HKCUSOFTWARECRACK05 SUCCESS Ox36D3A94F
43 Crack05 CloseKey HKCUSOFTWARECRACK05 SUCCESS
А так при последующих:
35 Crack05 OpenKey HKCГSOrTWARECBACK05 SUCCESS hKey; OXC29AFE60
36 Crack05 QueryValueEx HKCUSOFTWARECRACK05 SUCCESS Ox36D3FC04
37 Crack05 CloseKey HKCUSOFTWARECRACK05 SUCCESS
Попробуем удалить раздел HKEY_CURRENT_USERSOFTWARECRACK05 (предварительно сделав резервную копию реестра). Последующий запуск защита воспримет как первый. На процедуру вскрытия ушло меньше пары минут. Однако периодическое редактирование реестра утомительно и просто неудобно. Полноценный взлом предполагает полную блокировку защитного механизма, что мы сейчас и сделаем.
Протокол позволяет понять алгоритм работы защиты. Первоначально программа пытается найти в реестре раздел HKEY_CURRENT_USER SOFTWARE CRACK05. Если он отсутствует, то защита полагает, что на этом компьютере запущена впервые и записывает текущую дату. В противном случае вычисляется число дней с момента первого запуска. Можно изменить код так, чтобы независимо от результатов поиска управление всегда передавалось на ветку первого запуска.
Рассмотрим следующий код:
00401096 lea ecx,[esp+4]
0040109А lea edx,[esp+0Ch]
0040109Е push ecx
0040109F push edx
004010А0 push 0
004010А2 push 0F003Fh
004010A7 push 0
004010А9 push 4031A4h
004010АЕ push 0
004010B0 push offset aSoftwareCrack0
004010В5 push 80000001h
00401DBA call ds:RedCreateKeyExA
004010C0 test eax,eax