Blog. Just Blog

Исследование защиты программы Teleport Pro

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

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

Запускаем программу, открываем окно регистрации, вводим любые левые данные, получаем отлуп: "We're sorry! The registration number you entered appears to be invalid". Нехорошая строка находится дизассемблером:
  1. .data:0049112C aWeReSorryTheRe db 'We',27h,'re sorry! The registration number'
  2. .data:0049112C                 db ' you entered appears to b...'
  3. .data:0049112C ; DATA XREF: .data:off_48C310
На нее идет ссылка с адреса 48C310:
  1. .data:0048C310 ; LPCSTR off_48C310
  2.                ; DATA XREF: sub_42EC7A:loc_42ED05
  3. .data:0048C310 off_48C310 dd offset aWeReSorryTheRe
  4. .data:0048C310 ; "We're sorry!  The registration number y"...
А на этот указатель ссылка идет уже из секции кода:
  1. ...
  2. .text:0042ECB3                 cmp     esi, ebx
  3. .text:0042ECB5                 mov     ebp, offset aUser ; "User"
  4. .text:0042ECBA                 jz      short loc_42ED15
  5. .text:0042ECBC                 push    dword ptr [edi+0D5h] ; Str
  6. ; Вызвать функцию генерации серийного номера на основании введенного имени
  7. .text:0042ECC2                 call    sub_42F675
  8. ; Сгенерированный серийник совпадает с введенным?
  9. .text:0042ECC7                 cmp     esi, eax
  10. .text:0042ECC9                 pop     ecx
  11. .text:0042ECCA                 jnz     short loc_42ECDB
  12. .text:0042ECCC                 push    ebx             ; int
  13. .text:0042ECCD                 push    ebx             ; uType
  14. ; Сообщение об успешной регистрации
  15. .text:0042ECCE                 push    off_48C290      ; lpText
  16. .text:0042ECD4                 call    sub_4542AB
  17. .text:0042ECD9                 jmp     short loc_42ED50
  18. .text:0042ECDB ; --------------------------------------------
  19. .text:0042ECDB
  20. .text:0042ECDB loc_42ECDB:
  21. .text:0042ECDB                 mov     edi, [edi+0D5h]
  22. .text:0042ECE1                 cmp     [edi-8], ebx
  23. .text:0042ECE4                 jnz     short loc_42ECF0
  24. .text:0042ECE6                 push    ebx
  25. .text:0042ECE7                 push    ebx
  26. .text:0042ECE8                 push    off_48C308
  27. .text:0042ECEE                 jmp     short loc_42ED0B
  28. .text:0042ECF0 ; ----------------------------------------
  29. .text:0042ECF0
  30. .text:0042ECF0 loc_42ECF0:
  31. .text:0042ECF0                 push    edi             ; Str
  32. ; Вызвать функцию проверки введенного серийного номера
  33. .text:0042ECF1                 call    sub_42F675
  34. .text:0042ECF6                 pop     ecx
  35. ; Если функция вернула 0, то введено слишком короткое имя, иначе
  36. ; введены неправильные регистрационные данные
  37. .text:0042ECF7                 test    eax, eax
  38. .text:0042ECF9                 push    ebx             ; int
  39. .text:0042ECFA                 push    ebx             ; uType
  40. .text:0042ECFB                 jnz     short loc_42ED05
  41. ; Сообщение о слишком коротком введенном имени
  42. .text:0042ECFD                 push    off_48C30C
  43. .text:0042ED03                 jmp     short loc_42ED0B
  44. .text:0042ED05 ; -----------------------------------------------------
  45. .text:0042ED05
  46. .text:0042ED05 loc_42ED05:
  47. ; Сообщение об ошибке
  48. .text:0042ED05                 push    off_48C310      ; lpText
  49. .text:0042ED0B
  50. .text:0042ED0B loc_42ED0B:
  51. .text:0042ED0B                 call    sub_4542AB
  52. .text:0042ED10                 jmp     loc_42EDED
  53. ...
Теперь посмотрим процедуру регистрации. Сразу скажу, что просто пропатчить ее не получится, потому что программа проверяет целостность исполняемого файла.
  1. .text:0042F675                 push    edi
  2. .text:0042F676                 mov     edi, [esp+4+Str]
  3. .text:0042F67A                 test    edi, edi
  4. .text:0042F67C                 jz      short loc_42F687
  5. .text:0042F67E                 push    edi             ; Str
  6. ; Получить длину введенного имени
  7. .text:0042F67F                 call    _strlen
  8. .text:0042F684                 pop     ecx
  9. .text:0042F685                 jmp     short loc_42F689
  10. .text:0042F687 ; -------------------------------------------------------
  11. .text:0042F687
  12. .text:0042F687 loc_42F687:
  13. .text:0042F687                 xor     eax, eax
  14. .text:0042F689
  15. .text:0042F689 loc_42F689:
  16. ; Длина имени должна быть не менее 5 символов
  17. .text:0042F689                 cmp     eax, 5
  18. .text:0042F68C                 jnb     short loc_42F692
  19. .text:0042F68E                 xor     eax, eax
  20. .text:0042F690                 pop     edi
  21. .text:0042F691                 retn
  22. .text:0042F692 ; -------------------------------------------------------
  23. .text:0042F692
  24. .text:0042F692 loc_42F692:
  25. .text:0042F692                 push    ebx
  26. .text:0042F693                 push    esi
  27. ; Начальная константа для генерации серийного номера
  28. .text:0042F694                 mov     esi, 5DFEE4A4h
  29. .text:0042F699                 xor     ebx, ebx
  30. .text:0042F69B
  31. .text:0042F69B loc_42F69B:
  32. ; Регистр EDI - указатель на текущее положение "кадра" в имени
  33. .text:0042F69B                 test    edi, edi
  34. .text:0042F69D                 jz      short loc_42F6A8
  35. .text:0042F69F                 push    edi             ; Str
  36. .text:0042F6A0                 call    _strlen
  37. .text:0042F6A5                 pop     ecx
  38. .text:0042F6A6                 jmp     short loc_42F6AA
  39. .text:0042F6A8 ; -------------------------------------------------------
  40. .text:0042F6A8
  41. .text:0042F6A8 loc_42F6A8:
  42. .text:0042F6A8                 xor     eax, eax
  43. .text:0042F6AA
  44. .text:0042F6AA loc_42F6AA:
  45. .text:0042F6AA                 add     eax, 0FFFFFFFCh
  46. ; "Кадр" за 4 символа до конца имени?
  47. .text:0042F6AD                 cmp     ebx, eax
  48. .text:0042F6AF                 jnb     short loc_42F6BD
  49. ; ПоXORить константу с 4 символами имени в "кадре"
  50. .text:0042F6B1                 xor     esi, [ebx+edi]
  51. .text:0042F6B4                 test    bl, 40h
  52. .text:0042F6B7                 jz      short loc_42F6BA
  53. .text:0042F6B9                 inc     ebx
  54. .text:0042F6BA
  55. .text:0042F6BA loc_42F6BA:
  56. .text:0042F6BA                 inc     ebx
  57. .text:0042F6BB                 jmp     short loc_42F69B
  58. .text:0042F6BD ; -------------------------------------------------------
  59. .text:0042F6BD
  60. .text:0042F6BD loc_42F6BD:
  61. ; В регистре EAX правильный серийный номер для введенного имени
  62. ; Переведите его в десятичное число и можно повторить регистрацию уже с этим
  63. ; правильным серийником
  64. .text:0042F6BD                 mov     eax, esi
  65. .text:0042F6BF                 pop     esi
  66. .text:0042F6C0                 pop     ebx
  67. .text:0042F6C1                 pop     edi
  68. .text:0042F6C2                 retn
  69. .text:0042F6C2 sub_42F675      endp
Для большей наглядности лучше пройти функцию генерации в отладчике. Теперь у нас есть алгоритм генерации серийного номера. Регистрационное имя должно быть не короче 5 символов, хотя в сообщении программы не менее 6 символов. Для генерации серийного номера сперва берется константа 5DFEE4A4h, а затем XORится поочередно с каждыми 4 байтами регистрационного имени, после каждой операции XOR 4-байтовый "кадр" в регистрационном имени сдвигается на один символ вправо, пока длина оставшегося "хвоста" не менее 4 символов. Итоговое число переводится в десятичный вид, это и есть правильный серийный номер. Если даже после разбора алгоритма затрудняетесь написать рабочий кейген, то можете ограничиться фишингом серийников из процедуры генерации серийного номера.

А теперь поковыряемся в реестре в ветке, где хранятся данные о регистрации. В программе полей ввода только два: имя и номер, а в реестр записывается еще один пустой ключ Company:

[HKEY_LOCAL_MACHINE\SOFTWARE\Tennyson Maxwell\Teleport Pro]
"Name"="ManHunter"
"Company"=""
"Registration"=dword:1fb7b8db

Попробуем его отредактировать и сохранить изменения. Получается вполне симпатичная картина:

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

Теперь для регистрации можно использовать следующий reg-файл:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Tennyson Maxwell\Teleport Pro]
"Name"="ManHunter"
"Company"="Perm Crack Laboratory"
"Registration"=dword:1fb7b8db

Все поля, естественно, могут быть с вашими регистрационными данными. Вот такая защита. Автор не меняет алгоритм регистрации уже много лет, поэтому есть вероятность, что и в следующих версиях также ничего не изменится.

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

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

Комментарии

Отзывы посетителей сайта о статье
Влад (24.06.2012 в 00:13):
Извините пожалуйста. Не хотел обидеть.
Владимир (22.06.2012 в 15:57):
;---------------------------
push offset Buffer ;В буфере имя, полученное любым способом от пользователя
;---------------------------
call KEY_GEN
;---------------------------
KEY_GEN proc
push ebp
mov  ebp,esp
mov  edi, [ebp+8h]
push edi
call lstrlen
cmp  eax, 5
jnb  loc_42FAAD
;здесь должен быть обработчик события--размер имени не должен быть меньше пяти букв
mov  eax,0FFFFFFFFh ;указатель ошибки
mov  esp,ebp
pop  ebp
ret

loc_42FAAD:
mov  esi,5DFEE4A4h
xor  ebx,ebx

loc_42FAB6:
push edi
call lstrlen
add  eax,0FFFFFFFCh
cmp  ebx,eax
jnb  loc_42FAD8
xor  esi,[ebx+edi]
inc  ebx
jmp  loc_42FAB6

loc_42FAD8:
mov  eax, esi ;в аккумуляторе шестнадцатеричное число, которое надо перевести в десятичное функцией wsprintf
mov  esp,ebp
pop  ebp
ret
KEY_GEN endp
;---------------------------
Весь текст взят из IDA Pro!
Это masm, не fasm!
Все проверено работает!
ManHunter (06.04.2011 в 17:09):
Слышь, школота, если у тебя руки растут из жопы, то лизни розетку, не засоряй своей тупизной генофонд планеты. Читай что такое реестр, что такое шестнадцатеричные числа, а только потом, дебил, разевай свою пасть, что не работает.
vic (06.04.2011 в 17:00):
Эх!!! я так в тебя верил! Не работает твоя кря!!!
Вот учись у пацанов малолетних
[del]
Жека (30.11.2009 в 02:07):
Лучше пропатчить - проверку имени и размера можно убрать легко, заменив 2 условных перехода (0040DB47 и 0040DBA9)на безусловные, а дальше делай с ним что угодно, например перевести на русский. Но дальше что делать? (Я только учусь). Хочется что-б работало без установки и рег.файла.
Вова (24.10.2009 в 05:44):
Аплодисменты !!!!!!!!!

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

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

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