Symantec pcAnywhere v9.0.0 build 133. Защита в DLL.

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Умный программист всегда сумеет занять компьютер глупой работой.

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

{/codecitation}

Добавить комментарий