
Скриншот программы DxO ViewPoint
Программа
Sound Booster предназначена для усиления до 5 раз уровня звука в любом приложении. Это очень удобно, особенно когда смотришь на ноутбуках фильмы с недостаточным уровнем громкости, ну или что-то в этом роде. Этакий прокси-сервер для звукового потока.
Скачиваем
дистрибутив, устанавливаем, запускаем, смотрим, за что можно зацепиться при исследовании. В окне "О программе" находится характерная строчка "Trial Version":

Окно "О программе"
Поищем ее в файле. Эта строчка найдется в секции ресурсов с индексом 137 в десятичной или 89h в шестнадцатеричной системе счисления. Посмотрим в дизассемблере, где эта строчка загружается и используется.
...
.text:00403EEE call eax
.text:00403EF0 lea edi, [eax+10h]
.text:00403EF3 mov [esp+24h+var_10], edi
; Загрузить строку из ресурсов
.text:00403EF7 push 89h ; unsigned int
.text:00403EFC mov byte ptr [esp+28h+var_4], 1
.text:00403F01 call ?AfxFindStringResourceHandle
.text:00403F06 test eax, eax
.text:00403F08 jz short loc_403F1D
.text:00403F0A push 89h ; int
.text:00403F0F push eax ; hModule
.text:00403F10 lea ecx, [esp+2Ch+var_10]
.text:00403F14 call sub_401C60
.text:00403F19 mov edi, [esp+24h+var_10]
...
Чуть выше по тексту есть вот такой код с красноречивыми названиями вызываемых функций:
.text:00403E42 push esi
.text:00403E43 push edi
.text:00403E44 mov eax, dword_4DD520
.text:00403E49 xor eax, esp
.text:00403E4B push eax
.text:00403E4C lea eax, [esp+24h+var_C]
.text:00403E50 mov large fs:0, eax
.text:00403E56 mov esi, ecx
; Активировано?
.text:00403E58 push offset a20986331705021
; "20986331705021ca58edc424.96250074"
.text:00403E5D call ds:IsActivated
.text:00403E63 add esp, 4
; Функция должна вернуть EAX=0
.text:00403E66 test eax, eax
; Если это так, то устанавливается флаг в регистре BL
.text:00403E68 setnz bl
.text:00403E6B xor eax, eax
.text:00403E6D test bl, bl
.text:00403E6F setnz al
.text:00403E72 lea eax, ds:83h[eax*8]
.text:00403E79 mov [esi+254h], eax
.text:00403E7F call sub_401960
.text:00403E84 mov ecx, [esi+20h]
.text:00403E87 push ecx ; hWnd
.text:00403E88 lea edi, [eax+4]
.text:00403E8B call ds:GetMenu
.text:00403E91 push eax
; На основании этого флага добавлять в меню пункт регистрации или нет
.text:00403E92 call ?FromHandle@CMenu
.text:00403E97 mov edx, [edi]
.text:00403E99 push eax
.text:00403E9A mov eax, [edx+14h]
.text:00403E9D push esi
.text:00403E9E mov ecx, edi
Как мне кажется, функция с названием
IsActivated может отвечать только за активацию. Если есть сомнения, то можете пройти этот участок кода под отладчиком и убедиться в правильности догадки. Но вот где находится эта функция? Какая же все-таки какая хорошая штука дизассемблер! Пара секунд - и мы знаем откуда что импортируется. А именно интересующая нас функция
IsActivated находится во внешней библиотеке
TurboActivate.dll
.idata:004BA388 ;
.idata:004BA388 ; Imports from TurboActivate.dll
.idata:004BA388 ;
.idata:004BA388 extrn TrialDaysRemaining:dword
.idata:004BA38C extrn Deactivate:dword
.idata:004BA390 extrn GetFeatureValue:dword
.idata:004BA394 extrn UseTrial:dword
.idata:004BA398 extrn IsActivated:dword
Закрываем в дизассемблере основной исполняемый файл, вместо него открываем файл TurboActivate.dll и находим функцию IsActivated
.text:10010ADC public IsActivated
.text:10010ADC IsActivated proc near
.text:10010ADC
.text:10010ADC var_68 = byte ptr -68h
.text:10010ADC var_64 = dword ptr -64h
.text:10010ADC var_60 = byte ptr -60h
.text:10010ADC var_4 = dword ptr -4
.text:10010ADC arg_0 = dword ptr 8
.text:10010ADC
.text:10010ADC push 5Ch
.text:10010ADE mov eax, offset loc_10078C01
.text:10010AE3 call __EH_prolog3_catch_GS
.text:10010AE8 mov esi, dword_100A1840
.text:10010AEE test esi, esi
.text:10010AF0 jnz short loc_10010B09
.text:10010AF2 call sub_100118BF
...
Программа, как вы уже могли прочитать в ее описании на офсайте, мало того, что привязывается к параметрам железа компа, так еще и в обязательном порядке требует он-лайн активацию. Так что ни секунды не будем тратить на поиск всяких алгоритмов генерации, а сразу же пропатчим эту функцию, чтобы она всегда возвращала EAX = 0. Для этого в начало функции записываем пару команд XOR EAX,EAX и RET. Теперь, по идее, при любом раскладе программа должна чувствовать себя активированной. Проверим:

Программа успешно "зарегистрирована"
Сообщение о триальном режиме пропало. Из меню в трее пропал пункт о регистрации. Программа не "щелкает" каждые три минуты при усилении звука. Значит наша цель достигнута! И, как мне кажется, одной такой пропатченной библиотеки должно хватить и на все будущие версии программы. Можно даже написать свою dll с теми же экспортируемыми функциями, но сразу же возвращающую нужные значения.