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


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

JPEG Imager от V-Methods Software - небольшая удобная программа для оптимизации графических файлов в формате JPEG, PNG и GIF. В ней собраны все основные инструменты, необходимые для работы с графикой: удаление шумов, изменение размера, корректировка цветности, контраста, яркости и т.д. Все управление интуитивно понятное. Конечно, все эти функции есть в серьезных графических пакетах типа Photoshop, но не всегда хочется запускать тяжеленный софт ради несложных корректировок изображения. Тут-то и окажется полезной программа JPEG Imager. Но как обычно все омрачается необходимостью расстаться с некоторой суммой денег за регистрацию.

Качаем дистрибутив, устанавливаем, запускаем. Из внешних признаков триальности - строка "Unregistered copy" в диалоговом окне "О программе". Исполняемый файл ничем не упакован, строка в нем находится легко.


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

В дизассемблере находим код, который на нее ссылается. А немного выше - проверка и условия срабатывания триальной ветки алгоритма:
...
.text:0040918A                 mov     [ebp+var_4], edx
.text:0040918D                 inc     dword ptr [ebx+1Ch]
.text:00409190                 mov     word ptr [ebx+10h], 14h
; Прочитать двойное слово
.text:00409196                 mov     ecx, [esi+0C34h]
; Сдвинуть на 10h бит вправо
.text:0040919C                 sar     ecx, 10h
; Результат = 7E5A?
.text:0040919F                 cmp     ecx, 7E5Ah
.text:004091A5                 setz    al
.text:004091A8                 and     eax, 1
.text:004091AB                 test    al, al
; Нет, перейти на триальную ветку алгоритма
.text:004091AD                 jz      short loc_40920B
; Программа зарегистрирована
.text:004091AF                 mov     word ptr [ebx+10h], 20h
.text:004091B5                 mov     edx, offset aRegisteredTo
; Строка "Registered to: "
.text:004091BA                 lea     eax, [ebp+var_8]
.text:004091BD                 call    sub_508548
.text:004091C2                 inc     dword ptr [ebx+1Ch]
.text:004091C5                 xor     edx, edx
.text:004091C7                 mov     [ebp+var_C], edx
...

Код небольшой, но в нем сразу бросаются в глаза две сигнатуры - "+0C34h]" и "7E5Ah". Если поискать их в файле, то догадка подтвердится, это действительно условия срабатывания различных триальных веток алгоритма в программе, например:
...
.text:004080AD                 mov     ecx, [esi+0C34h]
.text:004080B3                 sar     ecx, 10h
.text:004080B6                 cmp     ecx, 7E5Ah
.text:004080BC                 setz    al
.text:004080BF                 and     eax, 1
.text:004080C2                 test    al, al
.text:004080C4                 jnz     short loc_4080F7
.text:004080C6                 mov     [ebp+var_38], 8
.text:004080CC                 mov     edx, offset aWeAreSorryButY
; "We are sorry, but your 30-day trial per"...
.text:004080D1                 lea     eax, [ebp+var_4]
.text:004080D4                 call    sub_508548
...

Осталось найти место, где инициализируется двойное слово [reg+0C34h]. Этот код находится по тем же самым сигнатурам, что и триальные проверки:
...
.text:0040F54C                 push    edx
.text:0040F54D                 mov     ecx, [edx]
.text:0040F54F                 call    dword ptr [ecx+20h]
.text:0040F552                 cmp     eax, [ebp+var_10]
; Первая проверка зарегистрированности
.text:0040F555                 jnz     short loc_40F592
.text:0040F557                 push    60h
.text:0040F559                 mov     eax, [ebp+var_10]
.text:0040F55C                 push    eax
.text:0040F55D                 mov     edx, [eax]
.text:0040F55F                 call    dword ptr [edx+78h]
.text:0040F562                 push    10000h
.text:0040F567                 mov     ecx, [ebp+var_10]
.text:0040F56A                 push    ecx
.text:0040F56B                 mov     eax, [ecx]
.text:0040F56D                 call    dword ptr [eax+30h]
.text:0040F570                 test    eax, eax
.text:0040F572                 setnle  dl
.text:0040F575                 and     edx, 1
.text:0040F578                 mov     eax, edx
.text:0040F57A                 and     dword ptr [ebx+0C34h], 0FFFFh
.text:0040F584                 test    al, al
; Вторая проверка зарегистрированности
.text:0040F586                 jz      short loc_40F592
; Программа считается зарегистрированной. Записать 7E5A0000h в ячейку
; памяти [reg+0C34h]
.text:0040F588                 or      dword ptr [ebx+0C34h], 7E5A0000h
.text:0040F592 loc_40F592:
.text:0040F592                 dec     dword ptr [esi+1Ch]
.text:0040F595                 mov     eax, [ebp+var_14]
...

Дизассемблер показывает несколько проверок, которые "перепрыгивают" через инициализацию, поэтому правильнее всего будет пройти этот участок кода под отладчиком. Пошаговой трассировкой выясняем, что срабатывает первый переход по адресу 0040F555. Если его пропатчить, то триальные ограничения пропадают. Элегантный однобайтовый патч.


Программа успешно "зарегистрирована"

Интересно, что если сперва под отладчиком поставить точку останова на этот переход, попытаться ввести какой-нибудь неправильный код, а затем пропатчить переход в памяти, то в папке с программой будет создан файл ji2.key примерно такого содержания:
[JPEG Imager 2.0]
UserName=ManHunter / PCL
UserKey=123123123

Это и есть регистрационный ключ, пусть и фейковый. Теперь, если зафиксировать изменения в исполняемом файле, то в диалоге "О программе" будут показываться ваши регистрационные данные. Дополнительный бонус в том, что теперь программа становится портативной и ее можно записать на любой сменный носитель. Лично я таскаю ее на флешке, полезно иметь под рукой подобный инструмент.
Теги:
защита, взлом
Добавлено: 21 Сентября 2013 01:38:33 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...