Исследование защиты программы AbsoluteTelnet


Скриншот программы 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

Сохраняем изменения, запускаем программу. Ни слова о регистрации, все функции работают. Перевод часов на пару месяцев вперед тоже не причиняет программе никаких неудобств. Что и требовалось получить :) Приятного вам администрирования!
Теги:
защита, взлом
Добавлено: 21 Сентября 2013 01:32:22 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...