Blog. Just Blog

Исследование защиты программы PDF Password Cracker

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

Программа PDF Password Cracker предназначена для подбора и удаления паролей из PDF-файлов. Поддерживается стандартное 40-битное шифрование, улучшенное 128-битное шифрование и шифрование по алгоритму AES. Подбор пароля выполняется по заданному диапазону символов, по словарю или прямым поиском ключа. Кроме пароля позволяет удалять из PDF-файлов ограничения на печать и копирование, различные приватные данные, такие как мета-данные, формы, скрипты, вложенные файлы, цифровые подписи и т.п. В общем реально нужная и полезная программа. Есть несколько вариантов дистрибутивов, в зависимости от количества наворотов растет и цена, доходя на версии Enterprise аж до 60 баксов. Бесплатных версий нет, по крайней мере пока.

Раз уж взялись изучать защиту этого поделия, так начнем сразу с его максимально навороченной редакции. Загружаем дистрибутив версии Enterprise, устанавливаем, запускаем. Получаем вот такое симпатичное окно:

Окно регистрации
Окно регистрации

На ввод левых данных программа реагирует сообщением "Your registration key is wrong, please check it and try again". Где-то я все это уже видел. Назначение программы и внешний вид окон очень сильно напоминает мне разобранную ранее программу PDF Password Remover. Там было такое же грозное окно с фейковым Machine ID и регистрационным ключом. Обе программы также используют одинаковый скиновый движок, и это наводит на мысли, что автор у них один. Значит и используемые методы защиты могут совпадать. Проверим это на практике.

Исполняемый файл упакован UPX, заголовки и служебные поля не испорчены, и файл возвращается в исходное состояние при помощи самого же UPX командой upx -d crackpdf.exe, после чего сразу загоняем его в дизассемблер. Параллельно поищем строку сообщения об ошибке регистрации в распакованном файле.

Нехорошая строка найдена
Нехорошая строка найдена

Да, наша догадка полностью подтвердилась, внутри программа PDF Password Cracker очень похожа на PDF Password Remover. Ну или наоборот, это сути не меняет :) Посмотрим на фрагмент кода, который отвечает за вывод сообщения о неправильном серийном номере.
  1. ...
  2. .text:004086AA                 push    (offset Src+20h) ; lpString
  3. .text:004086AF                 push    414h            ; nIDDlgItem
  4. .text:004086B4                 push    esi             ; hDlg
  5. .text:004086B5                 rep stosd
  6. .text:004086B7                 call    ds:GetDlgItemTextA
  7. ; Получить введенный текст серийного номера
  8. .text:004086BD                 push    4F5C94h
  9. ; Вызвать процедуру проверки
  10. .text:004086C2                 call    sub_408060   ; <---- Проверка
  11. .text:004086C7                 add     esp, 4
  12. .text:004086CA                 test    eax, eax
  13. ; Если процедура проверки вернула EAX=0, то серийный номер неправильный
  14. .text:004086CC                 jz      short loc_408712
  15. ; Вывести сообщение о правильной регистрации
  16. .text:004086CE                 push    40h             ; uType
  17. .text:004086D0                 push    offset aThankYou_ ; "Thank you."
  18. .text:004086D5                 push    offset aThankYouForPur
  19. ; "Thank you for purchase the PDF Password"...
  20. .text:004086DA                 push    esi             ; hWnd
  21. .text:004086DB                 call    ds:MessageBoxA
  22. .text:004086E1                 push    ecx             ; lpData
  23. .text:004086E2                 mov     ecx, esp
  24. .text:004086E4                 mov     [esp+0E8h+var_D8], esp
  25. .text:004086E8                 push    (offset Src+20h) ; Src
  26. .text:004086ED                 call    sub_47F96A
  27. .text:004086F2                 call    sub_408310
  28. .text:004086F7                 add     esp, 4
  29. .text:004086FA                 mov     dword ptr Src+0E8h, 1
  30. .text:00408704                 push    1               ; nResult
  31. .text:00408706                 push    esi             ; hDlg
  32. .text:00408707                 call    ds:EndDialog
  33. .text:0040870D                 jmp     loc_408982
  34. .text:00408712 ; --------------------------------------------------
  35. .text:00408712 loc_408712:
  36. ; Вывести сообщение о неправильной регистрации
  37. .text:00408712                 push    10h             ; uType
  38. .text:00408714                 push    0               ; lpCaption
  39. .text:00408716                 push    offset aYourRegistrati
  40. ; "Your registration key is wrong, please "...
  41. .text:0040871B                 push    esi             ; hWnd
  42. .text:0040871C                 call    ds:MessageBoxA
  43. .text:00408722                 push    414h            ; nIDDlgItem
  44. .text:00408727                 push    esi             ; hDlg
  45. ...
Как и в прошлый раз, здесь есть два варианта. Можно пропатчить процедуру проверки серийного номера по адресу 00408060, чтобы она всегда возвращала EAX=1, в этом случае программа станет портативной и ее можно будет таскать с собой на флешке. Для собственный нужд я сделал именно такой вариант. А чтобы немного порадовать приверженцев кейгенов, разберем алгоритм проверки серийного номера. Он очень похож на алгоритм, который использовался в программе PDF Password Remover, ну это и не удивительно.
  1. .text:00408060                 sub     esp, 18h
  2. .text:00408063                 or      ecx, 0FFFFFFFFh
  3. .text:00408066                 xor     eax, eax
  4. .text:00408068                 push    ebx
  5. .text:00408069                 push    esi
  6. .text:0040806A                 mov     esi, [esp+20h+arg_0]
  7. .text:0040806E                 push    edi
  8. ; Самопальная функция получения длины строки
  9. .text:0040806F                 mov     edi, esi
  10. .text:00408071                 repne scasb
  11. .text:00408073                 not     ecx
  12. .text:00408075                 dec     ecx
  13. ; После отработки в регистре ECX содержится значение длины строки
  14. .text:00408076                 cmp     ecx, 14h
  15. ; Должно быть 14h (20 в десятичной системе) символов
  16. .text:00408079                 jz      short loc_408082
  17. .text:0040807B                 pop     edi
  18. .text:0040807C                 pop     esi
  19. .text:0040807D                 pop     ebx
  20. .text:0040807E                 add     esp, 18h
  21. ; Если это не так, то на выход
  22. .text:00408081                 retn
Длина серийного номера, как и в прошлый раз, равна 20 символам.
  1. ; Первая проверка. Берутся 14-й и 15-й символы серийного номера
  2. .text:00408082                 mov     al, [esi+0Eh]
  3. .text:00408085                 mov     cl, [esi+0Fh]
  4. .text:00408088                 lea     edx, [esp+24h+Str]
  5. .text:0040808C                 xor     bl, bl
  6. .text:0040808E                 push    edx             ; Str
  7. .text:0040808F                 mov     [esp+28h+var_C], al
  8. .text:00408093                 mov     [esp+28h+var_B], bl
  9. .text:00408097                 mov     [esp+28h+Str], cl
  10. .text:0040809B                 mov     [esp+28h+var_17], bl
  11. ; Оба символа преобразуются в числа и складываются
  12. .text:0040809F                 call    _atoi
  13. .text:004080A4                 mov     edi, eax
  14. .text:004080A6                 lea     eax, [esp+28h+var_C]
  15. .text:004080AA                 push    eax             ; Str
  16. .text:004080AB                 call    _atoi
  17. .text:004080B0                 add     edi, eax
  18. .text:004080B2                 add     esp, 8
  19. ; В сумме должно получиться 10
  20. .text:004080B5                 cmp     edi, 0Ah
  21. .text:004080B8                 jz      short loc_4080C3
  22. .text:004080BA                 pop     edi
  23. .text:004080BB                 pop     esi
  24. .text:004080BC                 xor     eax, eax
  25. .text:004080BE                 pop     ebx
  26. .text:004080BF                 add     esp, 18h
  27. .text:004080C2                 retn
Первая проверка. Из серийного номера берутся 14-й и 15-й символы, переводятся в численное значение и складываются. В сумме должно получиться 10.
  1. ; Вторая проверка. Берутся 1-й и 2-й символы серийного номера
  2. .text:004080C3                 mov     cl, [esi]
  3. .text:004080C5                 mov     dl, [esi+1]
  4. .text:004080C8                 lea     eax, [esp+24h+Str]
  5. .text:004080CC                 mov     [esp+24h+var_C], cl
  6. .text:004080D0                 push    eax             ; Str
  7. .text:004080D1                 mov     [esp+28h+var_B], bl
  8. .text:004080D5                 mov     [esp+28h+Str], dl
  9. .text:004080D9                 mov     [esp+28h+var_17], bl
  10. ; Оба символа преобразуются в числа и складываются
  11. .text:004080DD                 call    _atoi
  12. .text:004080E2                 lea     ecx, [esp+28h+var_C]
  13. .text:004080E6                 mov     edi, eax
  14. .text:004080E8                 push    ecx             ; Str
  15. .text:004080E9                 call    _atoi
  16. .text:004080EE                 add     edi, eax
  17. .text:004080F0                 add     esp, 8
  18. ; В сумме должно получиться 11
  19. .text:004080F3                 cmp     edi, 0Bh
  20. .text:004080F6                 jz      short loc_408101
  21. .text:004080F8                 pop     edi
  22. .text:004080F9                 pop     esi
  23. .text:004080FA                 xor     eax, eax
  24. .text:004080FC                 pop     ebx
  25. .text:004080FD                 add     esp, 18h
  26. .text:00408100                 retn
Во второй проверке суммируются первый и второй символы серийного номера, в сумме они должны дать 11.
  1. ; Третья проверка: 6-й символ серийного номера должен быть "2"
  2. .text:00408101                 cmp     byte ptr [esi+5], 32h
  3. .text:00408105                 jz      short loc_408110
  4. .text:00408107                 pop     edi
  5. .text:00408108                 pop     esi
  6. .text:00408109                 xor     eax, eax
  7. .text:0040810B                 pop     ebx
  8. .text:0040810C                 add     esp, 18h
  9. .text:0040810F                 retn
Третья проверка - 6-й символ серийного номера должен быть "2".
  1. ; Последняя проверка. Берутся 8-й и 9-й символы серийного номера
  2. .text:00408110                 mov     dl, [esi+7]
  3. .text:00408113                 mov     al, [esi+8]
  4. .text:00408116                 lea     ecx, [esp+24h+Str]
  5. .text:0040811A                 mov     [esp+24h+var_C], dl
  6. .text:0040811E                 push    ecx             ; Str
  7. .text:0040811F                 mov     [esp+28h+var_B], bl
  8. .text:00408123                 mov     [esp+28h+Str], al
  9. .text:00408127                 mov     [esp+28h+var_17], bl
  10. ; Оба символа преобразуются в числа и складываются
  11. .text:0040812B                 call    _atoi
  12. .text:00408130                 lea     edx, [esp+28h+var_C]
  13. .text:00408134                 mov     esi, eax
  14. .text:00408136                 push    edx             ; Str
  15. .text:00408137                 call    _atoi
  16. .text:0040813C                 add     esp, 8
  17. .text:0040813F                 add     esi, eax
  18. .text:00408141                 xor     eax, eax
  19. ; В сумме должно получиться 15
  20. .text:00408143                 cmp     esi, 0Fh
  21. .text:00408146                 pop     edi
  22. .text:00408147                 pop     esi
  23. .text:00408148                 setz    al
  24. .text:0040814B                 pop     ebx
  25. .text:0040814C                 add     esp, 18h
  26. .text:0040814F                 retn
В последней проверке складываются 8-й и 9-й символы серийного номера, в сумме они должны дать 15. Остальные символы серийного номера не учитываются и могут быть любыми. Готовый серийный номер может быть, например, таким: 56PCL2078MANHU55NTER. Рабочий кейген вы теперь можете написать самостоятельно.

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

Последний момент. Не знаю как вас, а меня просто вымораживают уродливые скины, которые используются для оформления программ. Для того, чтобы окна программ PDF Password Cracker или PDF Password Remover приняли обычный вид, достаточно удалить файл xpgrean.smf, который находится в папке с программой.

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

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

Комментарии

Отзывы посетителей сайта о статье
Виталий (02.02.2012 в 19:25):
Спасибо за помощь!
ManHunter (23.11.2010 в 08:52):
AyTkACT, да тут для патча вообще бы одного HIEW хватило. Просто привычка, HIEW у меня забинден на Alt-F3 в качестве альтернативного просмотрщика в Total Commander, поэтому все файлы исследую сперва через него.

У каждого ресурса есть свой уникальный идентификатор, по которому он загружается и который можно найти. Многоязычные строки обычно хранятся в одном контейнере с одним ID, или в разных файлах, но тоже с одинаковым ID. Так что и тут никаких проблем не вижу, все действия стандартные.

А если чего-то нет на паблике, это не значит, что этого нет в природе :)
AyTkACT (23.11.2010 в 07:10):
Давно назревал вопрос: бинарный поиск в IDA отменили или просто так привык к hiew? Кстати, не заметил на паблике hiew версии 8.12. Честно купленный?
Собсна что бинарный поиск, что hiew мало выручат, если нет xref'ов на строки, а скажем строки в ресурсах файла на нескольких языках.
Как мне кажется пора раскрыть тему как выкручиваться в подобных ситуациях.

з.ы. Тема кейгенинга раскрыта! =)

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

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

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