Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование защиты FTPControl
Финальная версия Windows: "Windows ХаРэ"!!!

Введение

Данная программа - хороший FTP-клиент, который позволяет соединяться с FTP-серверами и обеспечивает полный набор услуг такого рода. Получить shareware версию можно на узле компании-производителя http://www.ftpcontrol.com/. Для проведения исследования использовалась версия 2.9 build 5.

Инструменты

  • SoftICE
  • QuickVeiw
  • WinDasm

Исследование

При каждом запуске программа выдает окно с сообщением о том, что она незарегистрированная и осталось определенное число дней до окончания срока действия evaluation copy. Тут же можно нажать на кнопку Register и ввести имя и код. Следует отметить, что программа не докучает своими сообщениями о регистрации, и сообщение при запуске можно отключить. Однако после 30 дней использования программы со дня установки, она "сворачивается" в версию light, и целый ряд функций данной программы становится недоступным. Использование нормальной (не "light" версии) более 30 дней возможно достичь двумя путями:

  • сделать evluation период вместо 30 дней вечным;
  • попытаться "зарегистрировать" программу.

Первый из вышеуказанных способов описан в сборнике Cracking Tutorial (статья CpuIdle - временная защита), поэтому останавливаться на нем не будем. Отмечу только, что описание вышеуказанной статьи полностью применимо в данном случае, только дату нужно поставить свою(кто так и не понял о чем речь, отсылаю к сборнику Cracking Tutorial ). Далее я рассмотрю второй способ, а именно "регистрацию".

Итак, регистрацию, как выясняется из меню HELP, можно осуществить получив после оплаты регистрационный номер, который надо вводить в меню HELP/SHAREWARE NOTES/REGISTER. Обращаю внимание на то, что здесь есть еще некоторые пункты меню посвященные регистрации, где надо, в частности, вводить номер кредитной карточки и прочие личные данные, но речь идет не о них. Итак, при выборе вышеуказанного пункта появляется окно с предложением ввести Имя и Номер, а ниже уже стоит адрес Вашей электронной почты, который программа просит указать еще при инсталляции, т.к. это требуется при подключении к FTP серверам в анонимном режиме. После введения имени и номера появляется типичный MessageBox со словами IDKeyInvalid.

Ставим в SoftIce контрольную точку на вызов MessageBox():


bpx MessageBoxA

и после выхода в отладчик, нажимаем F12 и видим код, где вызывается данная функция. Я не привожу здесь этот код, так как он бесполезен. Просмотр данного места в WinDasm говорит о том, что это код общей процедуры вызова любого MessageBox(), о чем в частности видно по строке:


* Referenced by a CALL at Addresses:
|:00435BCD   , :0049315C   , :004931A5   , :0049C51B   , :004E31BD
|:004E3206   , :004E323F   , :005439DD   , :00543A18
|
:00435AC4 55                   		   push ebp

далее будет MessageBoxA()

Зададим в WinDasm поиск по слову "IDKeyInvalid" и находим следующее место:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E2B28(C)
|
:004E320D 6A00                    	push 00000000
:004E320F 8D4DE4                  	lea ecx, dword ptr [ebp-1C]
:004E3212 A13C445500              	mov eax, dword ptr [0055443C]
:004E3217 8B00                    	mov eax, dword ptr [eax]
:004E3219 8B80C4020000            	mov eax, dword ptr [eax+000002C4]

* Possible StringData Ref from Code Obj ->"idKeyInvalid"
                                   	|
:004E321F BAE0354E00              	mov edx, 004E35E0
:004E3224 E86B89FAFF              	call 0048BB94
:004E3229 8B45E4                  	mov eax, dword ptr [ebp-1C]
:004E322C E8FB0FF2FF              	call 0040422C
:004E3231 8BD0                    	mov edx, eax

* Possible StringData Ref from Code Obj ->"Registration"
                                   	|
:004E3233 B9C8354E00              	mov ecx, 004E35C8
:004E3238 A1DC455500              	mov eax, dword ptr [005545DC]
:004E323D 8B00                    	mov eax, dword ptr [eax]
:004E323F E88028F5FF              	call 00435AC4 ;вызов функции с MessageBoxA()

Здесь уже более интересно, просмотрев код от адреса 4E2320D вверх, видим идентичный кусок программы, но уже со строкой:


Possible StringData Ref from Code Obj ->"idNotConnected"

Очевидно, что мы находимся в месте где заканчиваются все неудачные регистрации, и попадаем мы сюда из адреса 4E2B28. Т.е. отсюда:


:004E2B15 E8F225F4FF              	call 0042510C
:004E2B1A 8B55E8                  	mov edx, dword ptr [ebp-18]
:004E2B1D 8B45FC                  	mov eax, dword ptr [ebp-04]
:004E2B20 59                      	pop ecx
:004E2B21 E86AFAFFFF              	call 004E2590
:004E2B26 84C0                    	test al, al
:004E2B28 0F84DF060000            	je 004E320D ;переход на "неудачную
                                                 регистрацию"
:004E2B2E 6A00                    	push 00000000
:004E2B30 A178455500              	mov eax, dword ptr [00554578]
:004E2B35 8B00                    	mov eax, dword ptr [eax]
:004E2B37 33C9                    	xor ecx, ecx
:004E2B39 33D2                    	xor edx, edx
:004E2B3B E8BC180000              	call 004E43FC
:004E2B40 84C0                    	test al, al

Забегая вперед, скажу, что у меня было несколько неудачных попыток исследования защиты данной программы и забивание Nop'ами данного перехода входило в одну из них. Данная программа изобилует конструкциями типа try……………except, что видно из часто встречающегося кода типа:


push dword ptr fs:[eax]
mov dword ptr fs:[eax], esp

В Win32 регистр FS указывает на структуру, где хранятся адреса обработчиков исключений и если программа модифицирует адрес fs:[eax], значит она добавляет свой обработчик исключений, который может делать все что угодно и, в конце концов, не возвращаться в процедуру, где произошло исключение. В частности был такой момент, когда программа выдавала сообщение об удачной регистрации, но при следующем запуске все возвращалось "на круги своя". Поиски выхода из данной ситуации завели меня внутрь процедры по адресу: 004E2590, которая вызывается непосредственно перед переходом на неудачную регистрацию. Внутри данной процедуры есть такое место:


:004E2604 43                      	inc ebx
:004E2605 83FB0B                  	cmp ebx, 0000000B
:004E2608 75C1                    	jne 004E25CB
:004E260A 8D55F4                  	lea edx, dword ptr [ebp-0C]
:004E260D 8B45FC                  	mov eax, dword ptr [ebp-04]
:004E2610 E86FFDFFFF           call 004E2384
:004E2615 8B45F4                  	mov eax, dword ptr [ebp-0C]
:004E2618 8B55F8                  	mov edx, dword ptr [ebp-08]
:004E261B E8581BF2FF           call 00404178
:004E2620 0F94C3                  	sete bl

При прохождении отладчиком данного участка, можно увидеть, что [ebp-04] указывает на введенное Имя, а [ebp-08] указывает на введенный Номер. Причем указание идет неявное а через адрес, значение которого лежит по адресам, указанным [ebp-04] и [ebp-08]. Соответственно [ebp-0C] всегда указывает на двойное слово, состоящее из 4 нулей. Значит можно предположить, что там тоже должен быть какой-то адрес, который должен указывать на то с чем сравнивать Имя и Номер.

Почему его там нет, сложный вопрос. Забегая вперед скажу, что программа после удачной проверки Имени и Номера переходит к процедуре соединиения с сервером компании производителя по Интернет. Может быть введенные данные передаются туда для проверки? Во всяком случае при отсутствии соединения регистрация программы прерывается и считается незавершенной, а копия остается Evaluation. Вобщем, не вдаваясь в подробности, я предположил, что по адресам 004e2610 и 004e2620 вызываются процедуры какого-то сравнения. А чтобы им было что с чем сравнивать , я просто поменял структуру [ebp-0C] в обоих случаях на структуру, которая используется в качестве второго параметра при вызове процедуры. Т.е. измененный код выглядит так:


:004E260A 8D55FС                  	lea edx, dword ptr [ebp-04]
:004E260D 8B45FC                  	mov eax, dword ptr [ebp-04]
:004E2610 E86FFDFFFF           call 004E2384
:004E2615 8B45F8                  	mov eax, dword ptr [ebp-08]
:004E2618 8B55F8                  	mov edx, dword ptr [ebp-08]
:004E261B E8581BF2FF           call 00404178
:004E2620 0F94C3                  	sete bl

Теперь при попытке регистрации, программа не выдает никаких "IDKeyInvalid", однако потом просит ввести имя какого-нибудь mail-сервера, для посылки информации о регистрации по интернету фирме-производителю. Естественно в процессе связи наверняка можно сделать какие-нибудь дополнительные проверки (например на предмет поступления долларов от пользователя на счет компании за регистрацию).

Косвенно такие догадки подтверждает наличие в программе следующих комментариев WinDasm:


* Possible StringData Ref from Code Obj ->"http://www.transsoft.com/codes/leg.txt"

Соединившись с узлом компании Транссофт вы нигде не найдете ссылки на файл leg.txt. Однако вы легко можете получить данный файл по вышеуказанному URL. Там длинный список всяких имен и названий фирм, типа:


Marianne Churilla
Raimundo Hora Goncalves
Daivd Piaia
Mehmet Faith Akin
Phil Barkey
Jean Sumption
Mitch Larson
Manfred Albert
jherman@smart.net
Keith Frank
Richard Tan
Mladen Krstonosic
Ric Morris
Alexander Joller
ReloAction
Anthony Battles
Manfred Bayer... и т.д.

Как я понял, это список легальных пользователей программы, который дополняется во время регистрации. То есть leg. от сокращенного legal. Что интересно, в этой же директории http://www.transsoft.com/codes, лежит еще один список, который называется ill.txt. Он уже поинтереснее (и надо сказать гораздо меньше по обьему). Там можно увидеть вот что:


QuQ [FACTOR]
Black Thorne [PC'98]
Phrozen Crew '98
SiraX/[CORE]-1998
mRFANATIc [D4C]
JellyTop
astaga [D4C]
C4A Team... и т.д.

Ясно, что это список нелегальных пользователей, которых удалось распознать компании Транссофт, то есть ILLEGAL. Вобщем, чтобы избежать попадания в разные списки и закончить регистрацию, нужно прерваться где-нибудь после введения кода, например по адресу 4E2b21, и начинать выполнять программу пошагово без захода в процедуры (т.е.по F10), фиксируя появление окна, где предлагается ввести имя mail-сервера.

Выяснилось, что данное окно появляется при вызове процедуры по адресу 004E2F90, причем, если невозможно соединиться с указанным mail-сервером, из процедуры возврата уже нет (видимо опять try…………except срабатывает). Рискнув предположить, что при удачном соединении и обмене информацией с сервером Транссофт, выход из процедуры осуществляется обычным образом, затираем код вызова процедуры по адресу 004E2F90 пятью Nop'ами и после "регистрации" получаем сообщение о том что она была "successful". После перезапуска убеждаемся, в том, что исчезли все напоминания об "Evaluation Period" а также, что в названии окна исчезло слово UNREGISTERED и появилось введенное Вами имя.

Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.