
Скриншот программы 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
Это и есть регистрационный ключ, пусть и фейковый. Теперь, если зафиксировать изменения в исполняемом файле, то в диалоге "О программе" будут показываться ваши регистрационные данные. Дополнительный бонус в том, что теперь программа становится портативной и ее можно записать на любой сменный носитель. Лично я таскаю ее на флешке, полезно иметь под рукой подобный инструмент.