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


Скриншот программы Spread32

Spread32 - крохотный редактор электронных таблиц Excel. Несмотря на более чем скромный размер, он поддерживает около 300 функций, форматирование ячеек, позволяет вставлять диаграммы и графики, векторные и растровые рисунки, формулы. При этом не мусорит в системе и абсолютно портативный. Весь кайф от программы портит надоедливое окно с напоминанием, появляющееся при запуске программы и при файловых операциях. Оно отсутствует в платной версии программы, но ее можно получить, естественно, только после оплаты. Никаких других ограничений в демонстрационной версии нет. Судя по галерее на сайте, автор часто бывает в отъезде, так что лишний раз беспокоить его платежами не будем.

С офсайта можно скачать несколько вариантов программы, они отличаются только языками интерфейса и платформами. Я буду исследовать, естественно, русскоязычный вариант под Windows. Распаковываем архив, запускаем. Вылазит наг-окно, о котором я говорил:


Наг-окно

Поищем строчку из окна в файле. Он, кстати, ничем не упакован. Для ускорения процесса сразу же отправим файл на дизассемблирование.


Нехорошая строка найдена

Строчка нашлась, она хранится в юникоде. Переходим к листингу дизассемблера. На строку сообщения ссылается один единственный указатель:
.rdata:0053ED38 off_53ED38      dd offset aThisCopyOfSpre
; DATA XREF: DialogFunc+4C
.rdata:0053ED38 ; "This copy of Spread32 is Shareware.\nFor"...

На него, в свою очередь, ссылается следующий код:
; Выбор действия: инициализация окна, создание, закрытие
.text:00445380                 mov     eax, [esp+arg_4]
.text:00445384                 sub     esp, 34h
.text:00445387                 sub     eax, 110h
.text:0044538C                 jz      short loc_4453BA
.text:0044538E                 dec     eax
.text:0044538F                 jnz     short loc_44539A
.text:00445391                 cmp     [esp+34h+arg_8], 50Ch
.text:00445398                 jz      short loc_4453A2
.text:0044539A loc_44539A:
.text:0044539A                 xor     eax, eax
.text:0044539C                 add     esp, 34h
.text:0044539F                 retn    10h
.text:004453A2 ; -----------------------------------------
.text:004453A2 loc_4453A2:
.text:004453A2                 mov     eax, [esp+34h+hDlg]
.text:004453A6                 push    0               ; nResult
.text:004453A8                 push    eax             ; hDlg
.text:004453A9                 call    ds:EndDialog
.text:004453AF                 mov     eax, 1
.text:004453B4                 add     esp, 34h
.text:004453B7                 retn    10h
.text:004453BA ; -----------------------------------------
.text:004453BA loc_4453BA:
.text:004453BA                 mov     ecx, ds:lpCaption
.text:004453C0                 push    esi
.text:004453C1                 mov     esi, [esp+38h+hDlg]
.text:004453C5                 push    ecx             ; lpWideCharStr
.text:004453C6                 push    esi             ; hWnd
.text:004453C7                 call    sub_41A2E0
; Загрузить строку и записать ее в наг-окно
.text:004453CC                 mov     edx, ds:off_53ED38
.text:004453D2                 push    edx             ; lpWideCharStr
.text:004453D3                 push    50Bh            ; nIDDlgItem
.text:004453D8                 push    esi             ; hDlg
.text:004453D9                 call    sub_445420
.text:004453DE                 add     esp, 14h
.text:004453E1                 call    near ptr off_52B600+0D3h
.text:004453E6                 push    eax
.text:004453E7                 mov     eax, ds:off_53E604
.text:004453EC                 push    eax
.text:004453ED                 call    near ptr off_52B600+0D3h
.text:004453F2                 push    eax             ; Format
.text:004453F3                 lea     ecx, [esp+44h+WideCharStr]
.text:004453F7                 push    offset a8xS8x   ; "%8X\n%s\n%8X"
.text:004453FC                 push    ecx             ; String
.text:004453FD                 call    _swprintf
.text:00445402                 lea     edx, [esp+4Ch+WideCharStr]
.text:00445406                 push    edx             ; lpWideCharStr
.text:00445407                 push    50Ch            ; nIDDlgItem
.text:0044540C                 push    esi             ; hDlg
.text:0044540D                 call    sub_445420
.text:00445412                 add     esp, 20h
.text:00445415                 xor     eax, eax
.text:00445417                 pop     esi
.text:00445418                 add     esp, 34h
.text:0044541B                 retn    10h

Что мы имеем? Процедуру обработчика наг-окна, которая выполняет три действия: инициализация окна с записью в него заголовка и строки сообщения о шароварной копии, открытие окна и его закрытие. Просто пропатчить начало функции на RET не получится, наг-окно так и будет висеть без текста, но к тому же без возможности его закрытия. Значит надо изменить обработчик, чтобы при любом действии вызывалась функция закрытия EndDialog. Для этого два условных перехода по адресам 0044538C и 0044538F забиваем NOP'ами, а третий условный переход по адресу 00445398 заменяем на безусловный JMP. Сохраняем изменения, запускаем программу. Надоедливое окно при запуске исчезло. Попробуем теперь выполнить какие-нибудь файловые операции, например, открыть файл и сохранить его под другим именем. И тоже не появляется никаких нежелательных окон. Цель достигнута. При желании можно даже сделать универсальный патч для всех будущих версий и различных языков.
Теги:
защита, взлом
Добавлено: 18 Сентября 2013 11:36:36 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...