Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Symantec pcAnywhere v9.0.0 build 133. Защита в DLL.
Умный программист всегда сумеет занять компьютер глупой работой.

Эта программа, которой я пользуюсь уже давно, предназначена для связи, обмена файлами и удаленного управления между компьютерами практически по любому соединению и протоколу. Скопировать pcAnywhere можно на сайте фирмы Symantec.

Программа является trial-версией, работает только 30 дней, окон регистрации у нее нет. После окончания 30-ти дневного периода работы все попытки вернуть работоспособность программы с помощью перевода системного времени заканчиваются неудачей.

Итак, перед нами стоит задача избавиться от 30-ти дневного ограничения времени , и попутно убрать диалоговое окно, возникающее при запусмке программы, и сообщающее о том, что это trial-версия.

Открываем файл Winaw32.exe в WinDASM. Попытки найти что-нибудь, имеющее отношение к проверкам времени, ни к чему ни приведут. Тогда давайте нажмем на кнопочку "Imported Functions" (импортируемые функции), и посмотрим появившийся список. Лично меня очень заинтриговала следующая функция: TimeBombCheck(). Название навевает интересные мысли… Дважды нажав на эту надпись, мы попадем в то место, откуда эта функция вызывается:


:00406112 FF1524814500		Call dword ptr [00458124]
:00406118 85C0			test eax, eax
:0040611A 7509			jne 00406125
:0040611C 5F			pop edi
:0040611D 5E			pop esi
:0040611E 81C498000000		add esp, 00000098
:00406124 C3			ret

Теперь загрузим программу в SoftICE, поставим контрольную точку на строчку, где вызывается функция (bpx 00406112), и запустим программу. Попав в SoftICE, щелкнем мышью на строчку ниже (test eax,eax), и нажмем F7. Мы увидим уже знакомое нам окно, и, после нажатия в нем кнопки, возвращаемся в SoftICE. Обратите внимание на содержимое регистра ЕАХ – если срок работы программы еще не вышел, оно отлично от нуля. Казалось бы чего проще – поменять JNE на JMP – и все. Попробуйте…

Программа запустится, да вот только при попытке задействовать какой-нибудь вид связи, если она уже у Вас просроченная, выведет окно с надписью, что время кончилось, и программа завершиться. То есть проверок времени в модуле несколько.

Правильнее будет посмотреть в Awcomm32.dll, и заставить эту функцию всегда возвращать в регистре ЕАХ единицу. К тому-же в этой же процедуре находятся и вызовы окон об окончании периода работы и т.д., от которых тоже было бы неплохо избавиться – лично мне они очень мешают.

Опять берем WinDASM, и загружаем в него Awcomm32.dll. Находим эту функцию:


Exported fn(): _TimeBombCheck@4 - Ord:00CCh
:67EA3800 81EC08020000		sub esp, 00000208
:67EA3806 53			push ebx
:67EA3807 55			push ebp
:67EA3808 56			push esi
:67EA3809 57			push edi
 ...	  ...			...

Протрассировав ее выполнение, я обратил внимание на следующий участок:


* Reference To: ISCUSTOM.?TimebombVer@CTBombCache@@QAEXAAG0@Z, Ord:0011h
				|
:67EA3A42 FF15E400EB67		Call dword ptr [67EB00E4]
:67EA3A48 33C0			xor eax, eax
:67EA3A4A 8B4C2434		mov ecx, dword ptr [esp+34]
:67EA3A4E 8B542418		mov edx, dword ptr [esp+18]
:67EA3A52 66A1EE8EEB67		mov ax, word ptr [67EB8EEE]
:67EA3A58 81E1FFFF0000		and ecx, 0000FFFF
:67EA3A5E 51			push ecx
:67EA3A5F 81E2FFFF0000		and edx, 0000FFFF
:67EA3A65 33C9			xor ecx, ecx
:67EA3A67 52			push edx
:67EA3A68 668B0DEC8EEB67 	mov cx, word ptr [67EB8EEC]
:67EA3A6F 50			push eax
:67EA3A70 51			push ecx
:67EA3A71 E82AFCFFFF		call 67EA36A0
:67EA3A76 83F8FF		cmp eax, FFFFFFFF
:67EA3A79 0F8492010000		je 67EA3C11
:67EA3A7F 85C0			test eax, eax
:67EA3A81 745A			je 67EA3ADD
:67EA3A83 83F801		cmp eax, 00000001
:67EA3A86 7427			je 67EA3AAF

В выделенной части видно, что содержимое регистра ЕАХ сравнивается с нулем и единицей. Можете отследить выполнение проверок, начиная с этого места, и изменяя значение регистра ЕАХ – и Вы убедитесь, что, если содержимое регистра ЕАХ равно единице, то программа не только прекрасно работает, но и перестает показывать мешающее окно при запуске.

Почему именно это место? Если внимательно просмотреть выполнение этой функции, то мы увидим, что в ней идет двойная проверка: сначала делается проверка "легальности" и времени, и, если программа "зарегистрированна", то значение ЕАХ будет равно единице, и, после сравнения в вышеуказанном месте, происходит простой переход на конец проверки. Если же это trial-программа, то в регистре ЕАХ будет ноль, и происходит переход на вторую ветвь, в которой осуществляется еще одна проверка времени, и либо закрытие программы, либо продолжение выполнения.

Итак, наши изменения сводятся к следующему:


test eax,eax
je 67EA3ADD

заменяем на


xor eax,eax	- обнуление регистра ЕАХ (на всякий случай)
mov al,01	- запись в ЕАХ единицы (используется регистр AL для соблюдения
		  количества байт)

Изменяем и запускаем… Все прекрасно работает, никаких мешающих окон и временных ограничений.

Это не первая версия pcAnywhere, которую я исследую. Честно говоря, я думал, что Symantec придумает что-нибудь посерьезнее (взять хотя бы их TalkWorks – солидная защита). А здесь на лицо элементарные ошибки: нельзя защиту помещать в DLL – тогла ее отключить намного проще, чем защиту, включенную в сам исполняемый файл, потому что явно виден результат работы вызываемой функции проверки.

Кстати, снятие временных ограничений предыдущих версий программы производится точно так же – даже название функции точно такое же. Не проще ли было сделать эту программу просто бесплатной, чем вписывать в нее "бумажного тигра"? (комментарий Bad_guy: Нет, не проще. Ведь как ответил мне один автор взломанной мной программы: "я не собираюсь менять алгоритм, потому что все мои пользователи являются законопослушными людьми..." - пускай верят в это пока мы ломаем их долбаные программы в сотни раз быстрее, чем они их пишут :-/ )

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay