
Скриншот программы AbsoluteTelnet
AbsoluteTelnet от Celestial Software - мощный Telnet, SSH и SFTP-клиент. Позволяет устанавливать соединения по SSH1 и SSH2, эмулирует терминалы VT52, VT100, VT220, VT320, XTERM, QNX, ANSI и SCO-ANSI, поддерживает большое количество алгоритмов шифрования и передачу файлов. Настройки отдельных соединений можно сохранять в файлы, и потом подключаться через них. Интерфейс программы выполнен в виде закладок, поэтому можно работать с несколькими серверами одновременно. Есть, конечно, и бесплатные альтернативы, типа PuTTY, но в некоторых случаях мне удавалось соединиться с удаленными серверами только через AbsoluteTelnet. Так что иметь такую программу в арсенале будет очень полезно, и желательно бесплатно.
Качаем дистрибутив, устанавливаем. Сразу после запуска появляется окно с предложением зарегистрировать программу или получить пробную лицензию на 30 дней.

Окно регистрации программы
Ни тот, ни другой вариант нас не устраивает. Лицензий, оказывается, тоже несколько видов: профессиональная и облегченная с урезанным функционалом. В любом случае, без какой-нибудь лицензии программа работать не будет. Поищем это диалоговое окно в ресурсах исполняемого файла AbsoluteTelnet.exe, попутно загрузив его на анализ в дизассемблер.

Диалоговое окно найдено в ресурсах
Диалоговое окно найдено, идентификатор ресурса 158, или 9Eh в шестнадцатеричной системе. К этому времени как раз закончит работу дизассемблер, и можно поискать в листинге все, что так или иначе связано с этим числом. Сигнатур найдется всего две: первая где-то в инструкции, а вторая в интересной процедуре:
.text:00496DF0 sub_496DF0 proc near
; CODE XREF: WinMain(x,x,x,x)+C93
; sub_46E280+65
.text:00496DF0
.text:00496DF0 var_10 = dword ptr -10h
.text:00496DF0 var_C = dword ptr -0Ch
.text:00496DF0 var_4 = dword ptr -4
.text:00496DF0 arg_0 = byte ptr 4
.text:00496DF0
.text:00496DF0 push 0FFFFFFFFh
.text:00496DF2 push offset loc_541E02
.text:00496DF7 mov eax, large fs:0
.text:00496DFD push eax
.text:00496DFE push ecx
.text:00496DFF push ebx
.text:00496E00 push ebp
.text:00496E01 push edi
.text:00496E02 mov eax, dword_64A5F8
.text:00496E07 xor eax, esp
.text:00496E09 push eax
.text:00496E0A lea eax, [esp+20h+var_C]
.text:00496E0E mov large fs:0, eax
.text:00496E14 mov eax, dword_65B97C
.text:00496E19 push eax
.text:00496E1A push esi
; Вот здесь используется число 158 (9Eh)
.text:00496E1B mov ecx, 9Eh
.text:00496E20 mov [esp+28h+var_10], esi
.text:00496E24 call sub_41FA70
.text:00496E29 xor edi, edi
.text:00496E2B mov [esp+20h+var_4], edi
.text:00496E2F mov dword ptr [esi], offset off_600B6C
.text:00496E35 mov ebx, 1
.text:00496E3A mov ebp, offset off_5F278C
.text:00496E3F lea ecx, [esi+50h]
.text:00496E42 mov [esi+3Ch], edi
.text:00496E45 mov [esi+38h], edi
...
Под отладчиком можно убедиться, что действительно именно этот фрагмент кода отвечает за открытие диалогового окна с регистрацией. Теперь посмотрим откуда и при каких условиях она вызывается. Первая же перекрестная ссылка дает следующий код:
.text:0045F04C mov ecx, offset dword_66FD68
.text:0045F051 call edx
.text:0045F053 mov esi, eax
; Вызвать какую-то процедуру какой-то проверки
.text:0045F055 call sub_46D1C0
.text:0045F05A add esp, 4
; Если она вернула AL!=0, то окно регистрации открывать не надо
.text:0045F05D test al, al
.text:0045F05F jnz short loc_45F0B8
.text:0045F061 mov eax, dword_66FD68
.text:0045F066 mov edx, [eax+0Ch]
.text:0045F069 mov ecx, offset dword_66FD68
.text:0045F06E call edx
.text:0045F070 mov ecx, eax ; Source
.text:0045F072 lea edi, [esp+1698h+var_15C8]
.text:0045F079 call sub_4745C0
.text:0045F07E sub esp, 28h
.text:0045F081 mov esi, edi
.text:0045F083 mov edi, esp
.text:0045F085 mov ecx, 0Ah
.text:0045F08A rep movsd
.text:0045F08C lea esi, [esp+16C0h+var_1598]
; Открыть окно с предложением зарегистрироваться
.text:0045F093 call sub_496DF0
.text:0045F098 mov ecx, esi
.text:0045F09A call sub_4958C0
.text:0045F09F test eax, eax
.text:0045F0A1 jnz short loc_45F0AB
.text:0045F0A3 push 1 ; Code
.text:0045F0A5 call ds:exit
.text:0045F0AB ; ------------------------------------------------
.text:0045F0AB loc_45F0AB:
.text:0045F0AB lea eax, [esp+1698h+var_1598]
.text:0045F0B2 push eax
.text:0045F0B3 call sub_45F3D0
Для обхода защиты достаточно сделать так, чтобы процедура проверки всегда возвращала AL=1, в этом случае программа будет считать себя зарегистрированной даже при отсутствии лицензии.
.text:0046D1C0 sub_46D1C0 proc near
.text:0046D1C0 var_390 = byte ptr -390h
.text:0046D1C0 var_368 = byte ptr -368h
.text:0046D1C0 var_4 = dword ptr -4
.text:0046D1C0 arg_0 = byte ptr 4
.text:0046D1C0
; Заменить первые команды процедуры на MOV AL,1; RET
.text:0046D1C0 sub esp, 390h
.text:0046D1C6 mov eax, dword_64A5F8
.text:0046D1CB xor eax, esp
.text:0046D1CD mov [esp+390h+var_4], eax
.text:0046D1D4 cmp [esp+390h+arg_0], 0
.text:0046D1DC push ebx
.text:0046D1DD push edi
.text:0046D1DE jnz short loc_46D1E9
.text:0046D1E0 cmp byte_6702E4, 0
.text:0046D1E7 jnz short loc_46D231
.text:0046D1E9 loc_46D1E9:
.text:0046D1E9 lea eax, [esp+398h+var_368]
.text:0046D1ED push eax
.text:0046D1EE call sub_46C220
.text:0046D1F3 mov ecx, esi ; Source
.text:0046D1F5 lea edi, [esp+398h+var_390]
.text:0046D1F9 mov byte_6702E4, 1
.text:0046D200 call sub_4745C0
.text:0046D205 mov ecx, edi
.text:0046D207 lea ebx, [esp+398h+var_368]
.text:0046D20B call sub_46B520
.text:0046D210 test al, al
.text:0046D212 setnz al
; Установить флаг зарегистрированности
.text:0046D215 mov byte_670B34, al
.text:0046D21A pop edi
.text:0046D21B pop ebx
.text:0046D21C mov ecx, [esp+390h+var_4]
.text:0046D223 xor ecx, esp
.text:0046D225 call sub_51D219
.text:0046D22A add esp, 390h
.text:0046D230 retn
.text:0046D231 ; --------------------------------------------------
.text:0046D231 loc_46D231:
.text:0046D231 mov ecx, [esp+398h+var_4]
.text:0046D238 mov al, byte_670B34
.text:0046D23D pop edi
.text:0046D23E pop ebx
.text:0046D23F xor ecx, esp
.text:0046D241 call sub_51D219
.text:0046D246 add esp, 390h
.text:0046D24C retn
.text:0046D24C sub_46D1C0 endp
Сохраняем изменения, запускаем программу. Ни слова о регистрации, все функции работают. Перевод часов на пару месяцев вперед тоже не причиняет программе никаких неудобств. Что и требовалось получить :) Приятного вам администрирования!