Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Advanced JPEG Compressor
Скриншот программы Advanced JPEG Compressor

Программа Advanced JPEG Compressor предназначена для оптимизации изображений, изменения размеров, повышения резкости, а также для выполнения многих других операций над картинками, в том числе и в режиме пакетной обработки. Важно, что все действия выполняются без значительной потери качества. Очень неплохая альтернатива тяжеленным графическим редакторам, особенно когда надо быстро подправить большое количество фотографий. Но стоимость лицензии колеблется от 35 до 1500 баксов, хотя единственно допустимая цена любой программы - это 0 (прописью: НОЛЬ) в любой валюте.

Скачиваем дистрибутив, распаковываем, устанавливаем, запускаем программу. Пока вроде все нормально, кроме принудительно открываемого каждый раз при старте файла помощи и окна с предложением принять участие в растрате собственного бабла. Это интереса не представляет. Теперь попробуем отредактировать какую-нибудь фотографию. При попытке сохранить любые изменения получаем сообщение:

Окно незарегистрированной программы
Окно незарегистрированной программы

Это уже интереснее, мы узнали, что триальная версия программы не дает сохранять изменения. Главный исполняемый файл программы ajc.exe запакован ASPack, его можно снять или руками, или воспользовавшись каким-нибудь автоматическим распаковщиком. После распаковки файла загоняем его в дизассемблер, а сами в редакторе ресурсов поищем что-нибудь интересное. Вот что нашлось:

Строка о регистрации в ресурсах
Строка о регистрации в ресурсах

Это ни что иное, как строка о регистрации, которая где-то появляется при наличии правильных регистрационных данных. Правильность регистрационных данных определяется какой-то проверкой, значит можно будет найти в коде условие, при котором программа считает себя зарегистрированной. Нам уже известен индекс строки в ресурсах - это число 65247 или 0FEDFh в шестнадцатеричной системе счисления, поищем его в листинге дизассемблера.
  1. ; DATA XREF: DATA:off_5600F0
  2. CODE:0043CE18 off_43CE18      dd offset hModule
  3. CODE:0043CE1C                 dd 0FEDFh  ; Индекс строки "LICENSED TO:"
На него ссылается следующий указатель:
  1. ; Dbtables::TBlobStream::TBlobStream(Db::TBlobField *,Db::TBlobStreamMode)+1BE
  2. ; sub_53BA2C+102
  3. DATA:005600F0 off_5600F0      dd offset off_43CE18
А на него, в свою очередь, вот такой фрагмент кода:
  1. ...
  2. CODE:0053BAE9     mov     eax, [ebp+var_4]
  3. ; Если байт по адресу [eax+0E89h] равен нулю, то данные о лицензии
  4. ; не загружать и не выводить
  5. CODE:0053BAEC     cmp     byte ptr [eax+0E89h], 0
  6. CODE:0053BAF3     jz      loc_53BB7F
  7. ; Загрузить строку из ресурсов и прописать данные в заголовок главного
  8. ; окна программы
  9. CODE:0053BAF9     lea     edx, [ebp+var_14]
  10. CODE:0053BAFC     mov     eax, ds:off_560034
  11. CODE:0053BB01     call    @System@LoadResString$qqrp20System@TResStringRec
  12. ; System::LoadResString(System::TResStringRec *)
  13. CODE:0053BB06     mov     edx, [ebp+var_14]
  14. CODE:0053BB09     mov     eax, [ebp+var_4]
  15. CODE:0053BB0C     mov     eax, [eax+6E4h]
  16. CODE:0053BB12     call    @Menus@TMenuItem@SetCaption$qqrx17System@AnsiString
  17. ; Menus::TMenuItem::SetCaption(System::AnsiString)
  18. CODE:0053BB17     lea     eax, [ebp+var_18]
  19. CODE:0053BB1A     push    eax
  20. CODE:0053BB1B     mov     eax, [ebp+var_4]
  21. CODE:0053BB1E     mov     eax, [eax+9CB4h]
  22. CODE:0053BB24     mov     [ebp+var_30], eax
  23. CODE:0053BB27     mov     [ebp+var_2C], 0Bh
  24. CODE:0053BB2B     lea     edx, [ebp+var_34]
  25. ; Указатель на указатель на строку "LICENSED TO:"
  26. CODE:0053BB2E     mov     eax, ds:off_5600F0
  27. CODE:0053BB33     call    @System@LoadResString$qqrp20System@TResStringRec
  28. ; System::LoadResString(System::TResStringRec *)
  29. CODE:0053BB38     mov     eax, [ebp+var_34]
  30. CODE:0053BB3B     mov     [ebp+var_28], eax
  31. CODE:0053BB3E     mov     [ebp+var_24], 0Bh
  32. ...
При корректной регистрации байт по адресу [eax+0E89h] содержит ненулевое значение. Поищем место, где он инициализируется. Далеко ходить не пришлось, это место чуть выше по коду, прямо перед проверкой:
  1. ...
  2. CODE:0053BA9C     call    @Idimap4$qqrx17System@AnsiStringp20Idmessage@TIdMessage
  3. ; Idimap4::TIdIMAP4::UIDRetrieve(System::AnsiString,Idmessage::TIdMessage *)
  4. CODE:0053BAA1     mov     ebx, eax
  5. CODE:0053BAA3     mov     eax, [ebp+var_4]
  6. CODE:0053BAA6     mov     [eax+0E89h], bl
  7. ...
По адресу 0053BAA1 в коде находится двухбайтовая команда mov ebx, eax, заменим ее такой же двухбайтовой командой mov bl,1 и посмотрим что получилось.

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

В заголовке окна надпись, что программа на кого-то зарегистрирована, надоедливый файл помощи при старте не открывается. Попробуем отредактировать какую-нибудь фотографию и сохранить изменения. Все работает! Файл сохраняется, никаких предупреждений не выдается. Последний штрих: в меню "Help" пункт "Purchase a license..." сменился на "Purchase more licenses..." То есть программа считает, что какое-то количество лицензий у нас есть, но можно прикупить еще. Накормим ее регистрациями до отвала. Если предположить, что в байте по адресу [eax+0E89h] содержится количество лицензий, а мы туда записываем единичку, то максимум, что туда может быть записано - это 255 или 0FFh в шестнадцатеричной системе счисления. Заменим команду по адресу 0053BAA1 на mov bl,0FF и снова посмотрим что получилось. Пункт в меню с предложением купить дополнительные лицензии пропал. Все поставленные цели достигнуты. В пропатченном состоянии Advanced JPEG Compressor становится портативным и прекрасно работает со съемных носителей. Лично я его таскаю на флешке вместе с другим полезным инструментарием.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 4868 | Комментариев: 21

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
GizZ (30.08.2011 в 01:50):
ManHunter, уточни два момента, пожалуйста, начинающему.
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 файл, который собственно и должен заниматься пакетной обработкой. Так вот раньше все существывавшие кряки к этой программе не касались его и при попытке что-то сделать, он ругался в консоли на регистрацию.
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
ManHunter (04.02.2011 в 15:59):
Alt+T -> " 0FEDFh" (без кавычек, лидирующий пробел обязательно)
Ctrl+T - следующие вхождения

Ctrl+X - ссылки на строку под курсором
Парфет Ка (04.02.2011 в 15:55):
научите, пожалуйста, пользоваться идой..
как найти в листинге 0FEDFh (какой поиск юзать? уже все по три раза перепробовал)
и как найти кто на него (0FEDFh,DATA:005600F0) ссылается.
ManHunter (28.01.2011 в 11:34):
Делов-то... Открываешь http://tuts4you.com/download.php?list.11 и читаешь до наступления чувства глубокого удовлетворения.
smoother (28.01.2011 в 11:31):
Снятие навесных протекторов различными утилитами это конечно интересно, но что делать когда такой возможности нет?
В общем, гораздо интереснее было бы почитать про снятие 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.
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
KL@RUS (14.01.2011 в 10:20):
[quote]Только у меня с русским интерфейсом.[/quote]
русская глючит, [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.(при условии что алгоритм файла содержит минимум цветов и оптимизирован.)

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.29 сек. / MySQL: 2 (0.0066 сек.) / Память: 4.5 Mb
Наверх