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-программа, то в регистре ЕАХ будет ноль, и происходит переход на вторую ветвь, в которой осуществляется еще одна проверка времени, и либо закрытие программы, либо продолжение выполнения.
Итак, наши изменения сводятся к следующему:
заменяем на
xor eax,eax - обнуление регистра ЕАХ (на всякий случай)
mov al,01 - запись в ЕАХ единицы (используется регистр AL для соблюдения
количества байт)
|
Изменяем и запускаем… Все прекрасно работает, никаких мешающих окон и временных ограничений.
Это не первая версия pcAnywhere, которую я исследую. Честно говоря, я думал, что Symantec придумает что-нибудь посерьезнее (взять хотя бы их TalkWorks – солидная защита). А здесь на лицо элементарные ошибки: нельзя защиту помещать в DLL – тогла ее отключить намного проще, чем защиту, включенную в сам исполняемый файл, потому что явно виден результат работы вызываемой функции проверки.
Кстати, снятие временных ограничений предыдущих версий программы производится точно так же – даже название функции точно такое же. Не проще ли было сделать эту программу просто бесплатной, чем вписывать в нее "бумажного тигра"? (комментарий Bad_guy: Нет, не проще. Ведь как ответил мне один автор взломанной мной программы: "я не собираюсь менять алгоритм, потому что все мои пользователи являются законопослушными людьми..." - пускай верят в это пока мы ломаем их долбаные программы в сотни раз быстрее, чем они их пишут :-/ )
|