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

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

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

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

Расшифровка файлов
В завершение посмотрим, что же представляет собой этот хитрый codec.dll. Поиск показывает, что он находится в папке профиля пользователя (C:\Users\{USER}\AppData\Roaming\), и, как выяснилось, это вовсе не библиотека, а обычный текстовый файл. Внутри него содержится строка "asdfasdfasdfaswkk", которая собиралась по кускам в найденном ранее коде. Но самое интересное, что если оставить этот codec.dll на месте, а вернуть патченный исполняемый файл в исходное состояние, то программа будет работать как зарегистрированная версия. Цель достигнута.
Просмотров: 410 | Комментариев: 3
Метки: исследование защиты, PDF
Комментарии
Отзывы посетителей сайта о статье
Alexsandr
(15.12.2025 в 16:29):
Забавная защита.
В инсталлере присутствует файл codec.dll с набором непонятных строк и последняя строка отличается на два последних символа т.е. меняем 12 на кк и прога успокаивается. Хотя сама программа смотрит все строки и сравнивает окончание с кк т.е. в любой строчке заменить последние два символа спасают. Если пробежаться под отладчиком, то можно поймать правильный серийник .text:00476733 mov eax, [ebp+var_3C].
В инсталлере присутствует файл codec.dll с набором непонятных строк и последняя строка отличается на два последних символа т.е. меняем 12 на кк и прога успокаивается. Хотя сама программа смотрит все строки и сравнивает окончание с кк т.е. в любой строчке заменить последние два символа спасают. Если пробежаться под отладчиком, то можно поймать правильный серийник .text:00476733 mov eax, [ebp+var_3C].
0101
(15.12.2025 в 11:39):
Имхо, в таких защитах лучше не ограничиваться патчем, а отслеживать изменения в реестре и создавать *.reg-файл для регистрации на любой машине или даже лоадер с зашитыми изменениями в реестре. В этом случае прогу можно вообще не патчить, чтобы не нарушать лицензионное соглащение)
Добавить комментарий
Заполните форму для добавления комментария



? FuckYouCracker• /* :-) */
? asdfasdvasdgasdgg