Исследование защиты программы Advanced JPEG Compressor
Скриншот программы Advanced JPEG Compressor
Программа Advanced JPEG Compressor предназначена для оптимизации изображений, изменения размеров, повышения резкости, а также для выполнения многих других операций над картинками, в том числе и в режиме пакетной обработки. Важно, что все действия выполняются без значительной потери качества. Очень неплохая альтернатива тяжеленным графическим редакторам, особенно когда надо быстро подправить большое количество фотографий. Но стоимость лицензии колеблется от 35 до 1500 баксов, хотя единственно допустимая цена любой программы - это 0 (прописью: НОЛЬ) в любой валюте.
Скачиваем дистрибутив, распаковываем, устанавливаем, запускаем программу. Пока вроде все нормально, кроме принудительно открываемого каждый раз при старте файла помощи и окна с предложением принять участие в растрате собственного бабла. Это интереса не представляет. Теперь попробуем отредактировать какую-нибудь фотографию. При попытке сохранить любые изменения получаем сообщение:
Окно незарегистрированной программы
Это уже интереснее, мы узнали, что триальная версия программы не дает сохранять изменения. Главный исполняемый файл программы ajc.exe запакован ASPack, его можно снять или руками, или воспользовавшись каким-нибудь автоматическим распаковщиком. После распаковки файла загоняем его в дизассемблер, а сами в редакторе ресурсов поищем что-нибудь интересное. Вот что нашлось:
Строка о регистрации в ресурсах
Это ни что иное, как строка о регистрации, которая где-то появляется при наличии правильных регистрационных данных. Правильность регистрационных данных определяется какой-то проверкой, значит можно будет найти в коде условие, при котором программа считает себя зарегистрированной. Нам уже известен индекс строки в ресурсах - это число 65247 или 0FEDFh в шестнадцатеричной системе счисления, поищем его в листинге дизассемблера.
Code (Assembler) : Убрать нумерацию
- ; DATA XREF: DATA:off_5600F0
- CODE:0043CE18 off_43CE18 dd offset hModule
- CODE:0043CE1C dd 0FEDFh ; Индекс строки "LICENSED TO:"
Code (Assembler) : Убрать нумерацию
- ; Dbtables::TBlobStream::TBlobStream(Db::TBlobField *,Db::TBlobStreamMode)+1BE
- ; sub_53BA2C+102
- DATA:005600F0 off_5600F0 dd offset off_43CE18
Code (Assembler) : Убрать нумерацию
- ...
- CODE:0053BAE9 mov eax, [ebp+var_4]
- ; Если байт по адресу [eax+0E89h] равен нулю, то данные о лицензии
- ; не загружать и не выводить
- CODE:0053BAEC cmp byte ptr [eax+0E89h], 0
- CODE:0053BAF3 jz loc_53BB7F
- ; Загрузить строку из ресурсов и прописать данные в заголовок главного
- ; окна программы
- CODE:0053BAF9 lea edx, [ebp+var_14]
- CODE:0053BAFC mov eax, ds:off_560034
- CODE:0053BB01 call @System@LoadResString$qqrp20System@TResStringRec
- ; System::LoadResString(System::TResStringRec *)
- CODE:0053BB06 mov edx, [ebp+var_14]
- CODE:0053BB09 mov eax, [ebp+var_4]
- CODE:0053BB0C mov eax, [eax+6E4h]
- CODE:0053BB12 call @Menus@TMenuItem@SetCaption$qqrx17System@AnsiString
- ; Menus::TMenuItem::SetCaption(System::AnsiString)
- CODE:0053BB17 lea eax, [ebp+var_18]
- CODE:0053BB1A push eax
- CODE:0053BB1B mov eax, [ebp+var_4]
- CODE:0053BB1E mov eax, [eax+9CB4h]
- CODE:0053BB24 mov [ebp+var_30], eax
- CODE:0053BB27 mov [ebp+var_2C], 0Bh
- CODE:0053BB2B lea edx, [ebp+var_34]
- ; Указатель на указатель на строку "LICENSED TO:"
- CODE:0053BB2E mov eax, ds:off_5600F0
- CODE:0053BB33 call @System@LoadResString$qqrp20System@TResStringRec
- ; System::LoadResString(System::TResStringRec *)
- CODE:0053BB38 mov eax, [ebp+var_34]
- CODE:0053BB3B mov [ebp+var_28], eax
- CODE:0053BB3E mov [ebp+var_24], 0Bh
- ...
Code (Assembler) : Убрать нумерацию
- ...
- CODE:0053BA9C call @Idimap4$qqrx17System@AnsiStringp20Idmessage@TIdMessage
- ; Idimap4::TIdIMAP4::UIDRetrieve(System::AnsiString,Idmessage::TIdMessage *)
- CODE:0053BAA1 mov ebx, eax
- CODE:0053BAA3 mov eax, [ebp+var_4]
- CODE:0053BAA6 mov [eax+0E89h], bl
- ...
Программа успешно "зарегистрирована"
В заголовке окна надпись, что программа на кого-то зарегистрирована, надоедливый файл помощи при старте не открывается. Попробуем отредактировать какую-нибудь фотографию и сохранить изменения. Все работает! Файл сохраняется, никаких предупреждений не выдается. Последний штрих: в меню "Help" пункт "Purchase a license..." сменился на "Purchase more licenses..." То есть программа считает, что какое-то количество лицензий у нас есть, но можно прикупить еще. Накормим ее регистрациями до отвала. Если предположить, что в байте по адресу [eax+0E89h] содержится количество лицензий, а мы туда записываем единичку, то максимум, что туда может быть записано - это 255 или 0FFh в шестнадцатеричной системе счисления. Заменим команду по адресу 0053BAA1 на mov bl,0FF и снова посмотрим что получилось. Пункт в меню с предложением купить дополнительные лицензии пропал. Все поставленные цели достигнуты. В пропатченном состоянии Advanced JPEG Compressor становится портативным и прекрасно работает со съемных носителей. Лично я его таскаю на флешке вместе с другим полезным инструментарием.
Просмотров: 6437 | Комментариев: 24
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(17.08.2021 в 13:57):
Только на программе теперь висит VMProt.
Petya
(17.08.2021 в 13:51):
Новый сайт милый - jpeg.compressor.software
А на главной, на скрине, по прежнему число 2008 :)
А на главной, на скрине, по прежнему число 2008 :)
GizZ
(30.08.2011 в 01:50):
ManHunter, уточни два момента, пожалуйста, начинающему.
1. Адрес где меняем mov ebx, eax на mov bl,1 в новой версии я нашел. Чтобы сделать указанные изменения нужно нажать Alt+F1?
2. Как из IDA вытянуть exe с изменениями? ViiDifPatcher не помог. Я верно понимаю что нужно запустить программу в дебаггере а потом сдампить ее процесс?
P.S. прошу прощения за, возможно, "глупые" вопросы.
1. Адрес где меняем mov ebx, eax на mov bl,1 в новой версии я нашел. Чтобы сделать указанные изменения нужно нажать Alt+F1?
2. Как из IDA вытянуть exe с изменениями? ViiDifPatcher не помог. Я верно понимаю что нужно запустить программу в дебаггере а потом сдампить ее процесс?
P.S. прошу прощения за, возможно, "глупые" вопросы.
ManHunter
(10.06.2011 в 13:26):
В новых версиях небольшие изменения защиты, теперь нужное место ищется по Idimap4::TIdIMAP4::UIDRetrieve
прохожий, консольная программа работает через основную. Самостоятельно она ничего не конвертирует, т.к. это просто типа оболочки для запуска. Соответственно, ключи тоже никакие не проверяются. За чьи-то другие релизы я ручаться не могу, у меня все работает прекрасно.
прохожий, консольная программа работает через основную. Самостоятельно она ничего не конвертирует, т.к. это просто типа оболочки для запуска. Соответственно, ключи тоже никакие не проверяются. За чьи-то другие релизы я ручаться не могу, у меня все работает прекрасно.
прохожий
(03.06.2011 в 20:18):
Уважаемый ManHunter, а как-же пакетная обработка?
Помнится мне в каталоге с программой присуствует консольный EXE файл, который собственно и должен заниматься пакетной обработкой. Так вот раньше все существывавшие кряки к этой программе не касались его и при попытке что-то сделать, он ругался в консоли на регистрацию.
Помнится мне в каталоге с программой присуствует консольный EXE файл, который собственно и должен заниматься пакетной обработкой. Так вот раньше все существывавшие кряки к этой программе не касались его и при попытке что-то сделать, он ругался в консоли на регистрацию.
ManHunter
(24.02.2011 в 17:12):
Сперва в файле ищутся строки типа "trial", "unregistered", "licensed", затем то же самое ищется в ресурсах, затем работа с реестром по строке "software\", и уже в самую последнюю очередь, когда нихера не помогло, отлавливаются окна. У кого-то могут быть другие последовательности действий, а у меня такие.
Парфет Ка
(04.02.2011 в 21:15):
спасибо, всё получилось!!! (в иде у меня немного другие адреса: 5610F0 вместо 5600F0 и дальше расхождения). Однако, какая хитрая программа! Ни один дизассемблер кроме иды (ну, borg пытается) не отображает правильно данные 0FEDFh, а следовательно и не находит их (не говоря уже про ссылки; вот как эту задачу решить в оле..?). Просто изменить переход jz (0053BAF3) на jmp тоже не получается. Почему вы пошли таким путём - через ресурсы? А если бы они были зашифрованы и не открылись в редакторе ресурсов? По-моему, логичнее было отлавливать окно (но как?!), которое вываливается при попытке сохранить, и уже возле этого вызова искать проверку на регистрацию.
п.с. с той же мордой 1:1 есть программа Photo RAR
п.с. с той же мордой 1:1 есть программа Photo RAR
ManHunter
(04.02.2011 в 15:59):
Alt+T -> " 0FEDFh" (без кавычек, лидирующий пробел обязательно)
Ctrl+T - следующие вхождения
Ctrl+X - ссылки на строку под курсором
Ctrl+T - следующие вхождения
Ctrl+X - ссылки на строку под курсором
Парфет Ка
(04.02.2011 в 15:55):
научите, пожалуйста, пользоваться идой..
как найти в листинге 0FEDFh (какой поиск юзать? уже все по три раза перепробовал)
и как найти кто на него (0FEDFh,DATA:005600F0) ссылается.
как найти в листинге 0FEDFh (какой поиск юзать? уже все по три раза перепробовал)
и как найти кто на него (0FEDFh,DATA:005600F0) ссылается.
ManHunter
(28.01.2011 в 11:34):
Делов-то... Открываешь http://tuts4you.com/download.php?list.11 и читаешь до наступления чувства глубокого удовлетворения.
smoother
(28.01.2011 в 11:31):
Снятие навесных протекторов различными утилитами это конечно интересно, но что делать когда такой возможности нет?
В общем, гораздо интереснее было бы почитать про снятие VmProtect, к примеру.
В общем, гораздо интереснее было бы почитать про снятие VmProtect, к примеру.
ManHunter
(18.01.2011 в 20:35):
Хорошо, уговорил, следующая статья будет снова про кейген :)
Isaev
(18.01.2011 в 20:33):
Надо завязывать читать темы из области защит в твоём блоге...
А то я испорчусь окончательно, любовь к патчам - заразна! =))
А то я испорчусь окончательно, любовь к патчам - заразна! =))
ManHunter
(16.01.2011 в 18:08):
AyTkACT, ага, я тоже это видел. Эта строка вроде даже где-то используется при хешировании.
AyTkACT
(15.01.2011 в 22:04):
Ahilex, eXeScope всего лишь сообщает, что файл будет открыт в режиме только чтения.
Собсна на дизасм это никак не повлияет.
з.ы. Самый тонкий момент который может действительно вызвать трудность это поиск индекса строки в IDA.
Собсна на дизасм это никак не повлияет.
з.ы. Самый тонкий момент который может действительно вызвать трудность это поиск индекса строки в IDA.
Ahilex
(15.01.2011 в 19:35):
пытался повторить - программа не разрешает допуск (eXeScope). Дизассемблер какой прогой? Как это повторить, но не программисту а самоучке?
AyTkACT
(15.01.2011 в 18:12):
Улыбнуло в сабже:
CODE:004475C8 dd 28 ; Len
CODE:004475C8 db 'cRackerZ Mu$+ D|& !!!!!!!!!!',0; Text
CODE:004475C8 dd 28 ; Len
CODE:004475C8 db 'cRackerZ Mu$+ D|& !!!!!!!!!!',0; Text
KL@RUS
(14.01.2011 в 10:20):
[quote]Только у меня с русским интерфейсом.[/quote]
русская глючит, [b][i]IMHO[/i][/b], лучше Наглоязычная
русская глючит, [b][i]IMHO[/i][/b], лучше Наглоязычная
AyTkACT
(13.01.2011 в 01:13):
>>>> ... единственно допустимая цена любой программы - это 0 (прописью: НОЛЬ) в любой валюте.
Аминь! =)
Аминь! =)
jnpe
(12.01.2011 в 13:30):
а лично я на флешке таскаю ключи
....извини, не смог удержаться )))
....извини, не смог удержаться )))
godcat
(12.01.2011 в 12:24):
Не плохая прога, пользуюсь иной раз.
Только у меня с русским интерфейсом.
Только у меня с русским интерфейсом.
Darkness
(12.01.2011 в 09:27):
А я давно уже пользуюсь BetterJPEG - для россиян бесплатно
nexter
(12.01.2011 в 01:36):
На первом скрине - размер jpeg_файла сжат почти в 6 раз.Как то нереально для jpeg'a..
OptiPNG тоже неплохая утилита для png.(при условии что алгоритм файла содержит минимум цветов и оптимизирован.)
OptiPNG тоже неплохая утилита для png.(при условии что алгоритм файла содержит минимум цветов и оптимизирован.)
Добавить комментарий
Заполните форму для добавления комментария
Больше не висит. Бюджет кончился.
Правда, и ломать уже особо нечего, насколько я вижу - немногие оставшиеся ограничения забиты наглухо.