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


Скриншот программы 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 с теми же экспортируемыми функциями, но сразу же возвращающую нужные значения.
Добавлено: 13 Сентября 2013 02:24:04 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...