
Скриншот программы 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. Сохраняем изменения, запускаем программу. Надоедливое окно при запуске исчезло. Попробуем теперь выполнить какие-нибудь файловые операции, например, открыть файл и сохранить его под другим именем. И тоже не появляется никаких нежелательных окон. Цель достигнута. При желании можно даже сделать универсальный патч для всех будущих версий и различных языков.