С Новым Годом! С Новым Годом!
Blog. Just Blog

Исследование защиты PDF Password Remover

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

PDF Password Remover - программа для Windows, снимающая ограничения на печать, копирование и редактирование с PDF-файлов, которые уже можно открыть. Важное ограничение: она не удаляет пароль на открытие файла. Если PDF-файл нельзя открыть без пароля, эта программа не поможет. Однако это не единственный ее минус. Главный недостаток в том, что бесплатная версия расшифровывает только первую страницу, а для полной разблокировки нужна лицензия.

Скачиваем с сайта дистрибутив, запускаем, проверяем. Определяем, что главный исполняемый файл ничем не упакован, файл отправляем в дизассемблер, параллельно запустим его, чтобы посмотреть на внешние проявления защиты.

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

При попытке регистрации левыми данными программа реагирует сообщением об ошибке. Это сообщение будет ключевой зацепкой для анализа. Теперь с помощью этой строки можно искать соответствующий блок проверки в дизассемблированном коде.
  1. .text:00476B94 loc_476B94:
  2. .text:00476B94                 mov     dword ptr [ebp-4], 13h
  3. .text:00476B9B                 mov     dword ptr [ebp-88h], 80020004h
  4. .text:00476BA5                 mov     dword ptr [ebp-90h], 0Ah
  5. .text:00476BAF                 mov     dword ptr [ebp-78h], 80020004h
  6. .text:00476BB6                 mov     dword ptr [ebp-80h], 0Ah
  7. .text:00476BBD                 mov     dword ptr [ebp-0A8h], offset aInvaild
  8. ; "Invaild"
  9. .text:00476BC7                 mov     dword ptr [ebp-0B0h], 8
  10. .text:00476BD1                 lea     edx, [ebp-0B0h]
  11. .text:00476BD7                 lea     ecx, [ebp-70h]
  12. .text:00476BDA                 call    ds:__vbaVarDup
  13. .text:00476BE0                 mov     dword ptr [ebp-98h], offset aInvaildSerialC
  14. ; "Invaild Serial Code."
  15. .text:00476BEA                 mov     dword ptr [ebp-0A0h], 8
  16. .text:00476BF4                 lea     edx, [ebp-0A0h]
  17. .text:00476BFA                 lea     ecx, [ebp-60h]
  18. .text:00476BFD                 call    ds:__vbaVarDup
  19. .text:00476C03                 lea     edx, [ebp-90h]
  20. .text:00476C09                 push    edx
Вот строки, которые были найдены. Отталкиваясь от них в дизассемблере, находим условный переход. Анализ этого перехода показывает, как программа разделяет обработку неверного и корректного ключа. Этот переход является ключевой точкой ветвления логики программы.
  1. .text:00476886                 mov     dword ptr [ebp-4], 0Ah
  2. .text:0047688D                 cmp     word ptr [ebp-34h], 0FFFFh
  3. ; Переход на неправильный серийник
  4. .text:00476892                 jnz     loc_476B94
  5. ; А вот так работал бы правильный серийник
  6. .text:00476898                 mov     dword ptr [ebp-4], 0Bh
  7. .text:0047689F                 mov     dword ptr [ebp-98h], offset aAppdata
  8. ; "APPDATA"
  9. .text:004768A9                 mov     dword ptr [ebp-0A0h], 8
  10. .text:004768B3                 lea     edx, [ebp-0A0h]
  11. .text:004768B9                 lea     ecx, [ebp-60h]
  12. .text:004768BC                 call    ds:__vbaVarDup
  13. .text:004768C2                 lea     eax, [ebp-60h]
  14. .text:004768C5                 push    eax
  15. .text:004768C6                 lea     ecx, [ebp-70h]
  16. .text:004768C9                 push    ecx
  17. .text:004768CA                 call    ds:rtcEnvironVar
  18. .text:004768D0                 mov     dword ptr [ebp-0A8h], offset aCodec_dll
  19. ; "\\codec.dll"
  20. .text:004768DA                 mov     dword ptr [ebp-0B0h], 8
  21. .text:004768E4                 lea     edx, [ebp-70h]
  22. .text:004768E7                 push    edx
  23. .text:004768E8                 lea     eax, [ebp-0B0h]
Я оставлю только важные функции кода, так будет удобнее их изучать. Например, здесь видно использование строки "APPDATA" для получения пути к данным приложения, а также подозрительную строку "\codec.dll". Несмотря на название, эта библиотека, вероятно, не имеет отношения к системным кодекам. Это напоминает метод защиты, когда данные триала маскируются под системные файлы, чтобы усложнить их поиск.
  1. .text:004769F2                 mov     eax, [ebp-3Ch]
  2. .text:004769F5                 push    eax
  3. .text:004769F6                 push    offset aAsdfasdfasdfas
  4. ; "asdfasdfasdfasw"
  5. .text:004769FB                 call    ds:__vbaStrCat
  6. .text:00476A01                 mov     edx, eax
  7. .text:00476A03                 lea     ecx, [ebp-40h]
  8. .text:00476A06                 call    ds:__vbaStrMove
  9. .text:00476A0C                 push    eax
  10. .text:00476A0D                 push    offset aKk
  11. ; "kk"
  12. .text:00476A12                 call    ds:__vbaStrCat
  13. .text:00476A18                 mov     edx, eax
  14. .text:00476A1A                 lea     ecx, [ebp-38h]
  15. .text:00476A1D                 call    ds:__vbaStrMove
Дальше находим константы "asdfasdfasdfasw" и "kk". Они используются вместе с функциями __vbaStrCat и __vbaStrMove, что указывает на процедуру сборки строки в памяти. Вероятно, из этих "кирпичиков" программа составляет правильный ключ для проверки.
  1. .text:00476A7A                 mov     dword ptr [ebp-90h], 0Ah
  2. .text:00476A84                 mov     dword ptr [ebp-78h], 80020004h
  3. .text:00476A8B                 mov     dword ptr [ebp-80h], 0Ah
  4. .text:00476A92                 mov     dword ptr [ebp-0A8h], offset aSuccessful
  5. ; "Successful"
  6. .text:00476A9C                 mov     dword ptr [ebp-0B0h], 8
  7. .text:00476AA6                 lea     edx, [ebp-0B0h]
  8. .text:00476AAC                 lea     ecx, [ebp-70h]
  9. .text:00476AAF                 call    ds:__vbaVarDup
  10. .text:00476AB5                 mov     dword ptr [ebp-98h], offset aRegisterS
  11. ; "Register Successfully! Please restart p"...
  12. .text:00476ABF                 mov     dword ptr [ebp-0A0h], 8
  13. .text:00476AC9                 lea     edx, [ebp-0A0h]
  14. .text:00476ACF                 lea     ecx, [ebp-60h]
  15. .text:00476AD2                 call    ds:__vbaVarDup
  16. .text:00476AD8                 lea     ecx, [ebp-90h]
  17. .text:00476ADE                 push    ecx
А вот и финальная строка "Register Successfully!". После ее показа программу необходимо перезапустить, чтобы изменения вступили в силу.

Возвращаемся к началу проверки серийного номера по адресу 00476892. Ключевой условный переход jnz loc_476B94, который направлял выполнение к блоку ошибки, удаляем, заполнив его байты инструкциями NOP. Сохраняем изменения в исполняемом файле, запускаем программу и проверяем результат регистрации с любыми данными.

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

В итоговой версии программы удалены все назойливые элементы интерфейса - окна с напоминаниями и кнопки, призывающие к покупке лицензии. Но главное достижение, что полностью устранены функциональные ограничения триального режима. Теперь программа ведет себя как полноценная зарегистрированная версия.

Расшифровка файлов
Расшифровка файлов

В завершение посмотрим, что же представляет собой этот хитрый codec.dll. Поиск показывает, что он находится в папке профиля пользователя (C:\Users\{USER}\AppData\Roaming\), и, как выяснилось, это вовсе не библиотека, а обычный текстовый файл. Внутри него содержится строка "asdfasdfasdfaswkk", которая собиралась по кускам в найденном ранее коде. Но самое интересное, что если оставить этот codec.dll на месте, а вернуть патченный исполняемый файл в исходное состояние, то программа будет работать как зарегистрированная версия. Цель достигнута.

Поделиться ссылкой ВКонтакте
Просмотров: 410 | Комментариев: 3

Комментарии

Отзывы посетителей сайта о статье
dElk (21.12.2025 в 17:17):
? Timer1•                               
? FuckYouCracker•    /* :-) */
? asdfasdvasdgasdgg
Alexsandr (15.12.2025 в 16:29):
Забавная защита.
В инсталлере присутствует файл codec.dll с набором непонятных строк и последняя строка отличается на два последних символа т.е. меняем 12 на кк и прога успокаивается. Хотя сама программа смотрит все строки и сравнивает окончание с кк т.е. в любой строчке заменить последние два символа спасают. Если пробежаться под отладчиком, то можно поймать правильный серийник .text:00476733 mov     eax, [ebp+var_3C].
0101 (15.12.2025 в 11:39):
Имхо, в таких защитах лучше не ограничиваться патчем, а отслеживать изменения в реестре и создавать *.reg-файл для регистрации на любой машине или даже лоадер с зашитыми изменениями в реестре. В этом случае прогу можно вообще не патчить, чтобы не нарушать лицензионное соглащение)

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

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

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