Ограничение времени использования

Другим популярным ограничением 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 SOFTWA­RE 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