скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

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: Нет, не проще. Ведь как ответил мне один автор взломанной мной программы: "я не собираюсь менять алгоритм, потому что все мои пользователи являются законопослушными людьми..." - пускай верят в это пока мы ломаем их долбаные программы в сотни раз быстрее, чем они их пишут :-/ )






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook