Blog. Just Blog

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

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

Программа CollageIt - очень удобная утилита для создания красивых коллажей из множества фотографий. Буквально несколько кликов мышкой и вы получаете готовый результат. Программа почему-то платная, и надо выложить за лицензию почти двадцатку баксов.

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

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

Эта строчка находится в ресурсах, код ресурса 106 в десятичной или 6Ah в шестнадцатеричной системе счисления.

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

Исходные данные для исследования защиты есть, переходим к исполняемому файлу. Он ничем не упакован, можно сразу же отправлять его на дизассемблирвание. Когда дизассемблер закончит свою работу, поищем место, где программа обращается к ресурсам с кодом 6Ah. Первое же вхождение все ставит на свои места:
  1. ...
  2. .text:0040AC33                 mov     ecx, [ecx]
  3. .text:0040AC35                 lea     eax, [ebp+var_1C]
  4. .text:0040AC38                 push    eax
  5. ; Вызвать функцию проверки
  6. .text:0040AC39                 call    ds:?CheckCode@CRegisterUtility
  7. ; CRegisterUtility::CheckCode(ATL::CStringT)
  8. .text:0040AC3F                 movzx   eax, al
  9. ; Если она вернула AL=0, то регистрационный код неправильный
  10. .text:0040AC42                 test    eax, eax
  11. ; Вывести сообщение о неправильной регистрации
  12. .text:0040AC44                 jz      short loc_40AC94
  13. .text:0040AC46                 mov     esi, ds:?GetInstance@RegConfig@@SAPAV1@XZ
  14. ; RegConfig::GetInstance(void)
  15. .text:0040AC4C                 lea     edx, [ebp+var_14]
  16. .text:0040AC4F                 push    edx
  17. .text:0040AC50                 call    esi
  18. ; RegConfig::GetInstance(void) ; RegConfig::GetInstance(void)
  19. .text:0040AC52                 mov     ecx, eax
  20. .text:0040AC54                 add     ecx, 8
  21. .text:0040AC57                 call    ds:mfc90u_811
  22. .text:0040AC5D                 call    esi
  23. ; RegConfig::GetInstance(void) ; RegConfig::GetInstance(void)
  24. .text:0040AC5F                 mov     ecx, eax
  25. .text:0040AC61                 call    ds:?SaveData@RegConfig@@QAEXXZ
  26. ; RegConfig::SaveData(void)
  27. .text:0040AC67                 lea     eax, [ebp+var_18]
  28. ; Загрузить сообщение об успешной регистрации
  29. .text:0040AC6A                 push    69h
  30. .text:0040AC6C                 push    eax
  31. .text:0040AC6D                 call    sub_417570
  32. .text:0040AC72                 mov     byte ptr [ebp+var_4], 2
  33. .text:0040AC76                 mov     ecx, [ebp+var_18]
  34. .text:0040AC79                 push    0
  35. .text:0040AC7B                 push    ecx
  36. .text:0040AC7C                 call    ds:?BCGPMessageBox@@YAHPBGI@Z
  37. ; BCGPMessageBox(ushort const *,uint)
  38. .text:0040AC82                 mov     ecx, [ebp+var_20]
  39. .text:0040AC85                 mov     edx, [ecx]
  40. .text:0040AC87                 mov     eax, [edx+160h]
  41. .text:0040AC8D                 add     esp, 10h
  42. .text:0040AC90                 call    eax
  43. .text:0040AC92                 jmp     short loc_40ACB1
  44. .text:0040AC94 ; --------------------------------------------
  45. .text:0040AC94 loc_40AC94:
  46. .text:0040AC94                 lea     ecx, [ebp+var_18]
  47. ; Загрузить строку ресурсов с кодом 6Ah
  48. .text:0040AC97                 push    6Ah
  49. .text:0040AC99                 push    ecx
  50. .text:0040AC9A                 call    sub_417570
  51. .text:0040AC9F                 mov     byte ptr [ebp+var_4], 3
  52. .text:0040ACA3                 mov     edx, [eax]
  53. .text:0040ACA5                 push    0
  54. .text:0040ACA7                 push    edx
  55. ; Вывести сообщение о неправильной регистрации
  56. .text:0040ACA8                 call    ds:?BCGPMessageBox@@YAHPBGI@Z
  57. ; BCGPMessageBox(ushort const *,uint)
  58. .text:0040ACAE                 add     esp, 10h
  59. ...
Дизассемблер показал даже имя вызываемой функции, и это неспроста. Это имя содержится в секции импорта, значит сама функция проверки содержится в какой-то другой внешней библиотеке. В какой именно - тоже покажет дизассемблер.

Список импортируемых функций
Список импортируемых функций

В папке программы лежит файл AlbumDesignCore.dll, теперь загоняем в дизассемблер его, а основную программу запускаем под отладчиком. Затем в отлаживаемой программе надо поставить точку останова на начало функции CheckCode:
  1. .text:10043690 ; public: bool __thiscall CRegisterUtility::CheckCode
  2. .text:10043690                 push    ebp
  3. .text:10043691                 mov     ebp, esp
  4. .text:10043693                 push    ecx
  5. .text:10043694                 mov     [ebp+var_4], ecx
  6. .text:10043697                 mov     eax, [ebp+var_4]
  7. .text:1004369A                 add     eax, 8
  8. .text:1004369D                 push    eax
  9. .text:1004369E                 mov     ecx, [ebp+var_4]
  10. .text:100436A1                 mov     edx, [ecx+4]
  11. .text:100436A4                 push    edx
  12. .text:100436A5                 mov     eax, [ebp+arg_0]
  13. .text:100436A8                 push    eax
  14. .text:100436A9                 call    ?CheckRandomSerialCode
  15. .text:100436AE                 add     esp, 0Ch
  16. .text:100436B1                 mov     esp, ebp
  17. .text:100436B3                 pop     ebp
  18. .text:100436B4                 retn    4
Как видите, основная проверка выполняется в функции CheckRandomSerialCode той же самой библиотеки. И вот тут начинается самое интересное, а именно алгоритм проверки правильности серийного номера.
  1. ...
  2. .text:100431FC                 call    ds:mfc90u_290
  3. .text:10043202                 mov     [ebp+var_4], 0
  4. .text:10043209                 lea     ecx, [ebp+var_14]
  5. .text:1004320C                 call    ds:mfc90u_3185
  6. ; Первая проверка - длина серийника должна быть 1Dh (29) символов
  7. .text:10043212                 cmp     eax, 1Dh
  8. ; Переход, если длина соответствует
  9. .text:10043215                 jz      short loc_10043233
  10. .text:10043217                 mov     [ebp+var_2D], 0
  11. .text:1004321B                 mov     [ebp+var_4], 0FFFFFFFFh
  12. .text:10043222                 lea     ecx, [ebp+var_14]
  13. .text:10043225                 call    ds:mfc90u_600
  14. .text:1004322B                 mov     al, [ebp+var_2D]
  15. .text:1004322E                 jmp     loc_100433FF
  16. .text:10043233 ; --------------------------------------------
  17. .text:10043233 loc_10043233:
  18. ; Выполняется проверка формата серийного номера
  19. .text:10043233                 push    5
  20. .text:10043235                 lea     ecx, [ebp+var_14]
  21. .text:10043238                 call    ds:mfc90u_2676
  22. .text:1004323E                 movzx   eax, ax
  23. ; В позиции 05h должен быть символ '-'
  24. .text:10043241                 cmp     eax, 2Dh
  25. .text:10043244                 jnz     short loc_1004327F
  26. .text:10043246                 push    0Bh
  27. .text:10043248                 lea     ecx, [ebp+var_14]
  28. .text:1004324B                 call    ds:mfc90u_2676
  29. .text:10043251                 movzx   ecx, ax
  30. ; В позиции 0Bh должен быть символ '-'
  31. .text:10043254                 cmp     ecx, 2Dh
  32. .text:10043257                 jnz     short loc_1004327F
  33. .text:10043259                 push    11h
  34. .text:1004325B                 lea     ecx, [ebp+var_14]
  35. .text:1004325E                 call    ds:mfc90u_2676
  36. .text:10043264                 movzx   edx, ax
  37. ; В позиции 11h должен быть символ '-'
  38. .text:10043267                 cmp     edx, 2Dh
  39. .text:1004326A                 jnz     short loc_1004327F
  40. .text:1004326C                 push    17h
  41. .text:1004326E                 lea     ecx, [ebp+var_14]
  42. .text:10043271                 call    ds:mfc90u_2676
  43. .text:10043277                 movzx   eax, ax
  44. .text:1004327A                 cmp     eax, 2Dh
  45. ; В позиции 17h должен быть символ '-'
  46. .text:1004327D                 jz      short loc_1004329B
  47. .text:1004327F loc_1004327F:
  48. .text:1004327F                 mov     [ebp+var_2E], 0
  49. .text:10043283                 mov     [ebp+var_4], 0FFFFFFFFh
  50. .text:1004328A                 lea     ecx, [ebp+var_14]
  51. .text:1004328D                 call    ds:mfc90u_600
  52. .text:10043293                 mov     al, [ebp+var_2E]
  53. .text:10043296                 jmp     loc_100433FF
  54. ...
После разбора первых двух проверок мы знаем длину и формат серийного номера: это должно быть что-то типа "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX". Смотрим дальше в режиме пошаговой трассировки.
  1. ...
  2. .text:1004329B                 push    5
  3. .text:1004329D                 push    0
  4. .text:1004329F                 lea     ecx, [ebp+var_34]
  5. .text:100432A2                 push    ecx
  6. .text:100432A3                 lea     ecx, [ebp+var_14]
  7. ; Отрезать от серийника первые 5 символов
  8. .text:100432A6                 call    ds:mfc90u_4519
  9. .text:100432AC                 mov     [ebp+var_44], eax
  10. .text:100432AF                 mov     edx, [ebp+var_44]
  11. .text:100432B2                 mov     [ebp+var_48], edx
  12. .text:100432B5                 mov     byte ptr [ebp+var_4], 1
  13. .text:100432B9                 mov     ecx, [ebp+var_48]
  14. .text:100432BC                 call    ds:mfc90u_909
  15. .text:100432C2                 push    eax
  16. .text:100432C3                 lea     ecx, [ebp+var_10]
  17. .text:100432C6                 call    ds:mfc90u_306
  18. .text:100432CC                 mov     byte ptr [ebp+var_4], 3
  19. .text:100432D0                 lea     ecx, [ebp+var_34]
  20. .text:100432D3                 call    ds:mfc90u_600
  21. .text:100432D9                 mov     eax, [ebp+arg_8]
  22. .text:100432DC                 push    eax
  23. .text:100432DD                 lea     ecx, [ebp+var_10]
  24. .text:100432E0                 push    ecx
  25. ; Сравнить символы со строкой "CLGIT"
  26. .text:100432E1                 call    sub_10043730
  27. .text:100432E6                 add     esp, 8
  28. .text:100432E9                 movzx   edx, al
  29. .text:100432EC                 test    edx, edx
  30. .text:100432EE                 jz      short loc_10043319
  31. ...
В этой проверке выполняется сравнение первых 5 символов серийного номера со строкой "CLGIT", если они не совпадают, то серийный номер неправильный. Трассируем дальше:
  1. ...
  2. .text:10043322 loc_10043322:
  3. .text:10043322                 mov     eax, [ebp+var_28]
  4. .text:10043325                 add     eax, 1
  5. .text:10043328                 mov     [ebp+var_28], eax
  6. .text:1004332B loc_1004332B:
  7. .text:1004332B                 cmp     [ebp+var_28], 4
  8. .text:1004332F                 jge     short loc_1004339F
  9. .text:10043331                 push    5
  10. .text:10043333                 mov     ecx, [ebp+var_28]
  11. .text:10043336                 imul    ecx, 6
  12. .text:10043339                 add     ecx, 6
  13. .text:1004333C                 push    ecx
  14. .text:1004333D                 lea     edx, [ebp+var_3C]
  15. .text:10043340                 push    edx
  16. .text:10043341                 lea     ecx, [ebp+var_14]
  17. .text:10043344                 call    ds:mfc90u_4519
  18. .text:1004334A                 mov     [ebp+var_4C], eax
  19. .text:1004334D                 mov     eax, [ebp+var_4C]
  20. .text:10043350                 mov     [ebp+var_50], eax
  21. .text:10043353                 mov     byte ptr [ebp+var_4], 4
  22. .text:10043357                 mov     ecx, [ebp+var_50]
  23. .text:1004335A                 call    ds:mfc90u_909
  24. .text:10043360                 push    eax
  25. .text:10043361                 lea     ecx, [ebp+var_2C]
  26. .text:10043364                 call    ds:mfc90u_306
  27. .text:1004336A                 mov     byte ptr [ebp+var_4], 6
  28. .text:1004336E                 lea     ecx, [ebp+var_3C]
  29. .text:10043371                 call    ds:mfc90u_600
  30. .text:10043377                 lea     ecx, [ebp+var_2C]
  31. .text:1004337A                 call    ds:mfc90u_2697
  32. .text:10043380                 push    eax             ; Str
  33. ; Преобразовать строку в шестнадцатеричное число
  34. .text:10043381                 call    ?HexToInt@@YAHPBD@Z
  35. .text:10043386                 add     esp, 4
  36. .text:10043389                 mov     ecx, [ebp+var_28]
  37. .text:1004338C                 mov     [ebp+ecx*4+var_24], eax
  38. .text:10043390                 mov     byte ptr [ebp+var_4], 3
  39. .text:10043394                 lea     ecx, [ebp+var_2C]
  40. .text:10043397                 call    ds:mfc90u_601
  41. .text:1004339D                 jmp     short loc_10043322
  42. ...
В этом участке кода последовательно преобразуются оставшиеся 4 пятисимвольных блока цифр серийного номера в их шестнадцатеричные значения. Результат конвертирования записывается в стеке. И, наконец, последняя проверка:
  1. ; Взять первое число
  2. .text:1004339F                 mov     edx, [ebp+var_24]
  3. ; Добавить к нему третье число
  4. .text:100433A2                 add     edx, [ebp+var_1C]
  5. ; Сумма должна быть равна 17CB6h
  6. .text:100433A5                 cmp     edx, [ebp+arg_4]
  7. ; Если не равно, то серийный номер неправильный
  8. .text:100433A8                 jnz     short loc_100433B5
  9. ; Взять второе число
  10. .text:100433AA                 mov     eax, [ebp+var_20]
  11. ; Добавить к нему четвертое число
  12. .text:100433AD                 add     eax, [ebp+var_18]
  13. ; Сумма должна быть равна 17CB6h
  14. .text:100433B0                 cmp     eax, [ebp+arg_4]
  15. ; Если равно, то серийный номер правильный
  16. .text:100433B3                 jz      short loc_100433DB
Вот и вся проверка. Подведем итог. Серийный номер состоит из 5 блоков по 5 символов, разделенных дефисом "-". Первый блок всегда равен "CLGIT", остальные четыре являются числами и состоят из шестнадцатеричных цифр. Сумма первого числа с третьим, а также второго с четвертым числом в сумме должны давать 17CB6h. Так, валидным серийным номером будет "CLGIT-17CB6-17CB6-00000-00000".

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

После перезапуска заголовок программы изменился на "CollageIt Pro", надоедливые окна исчезли, а готовые коллажи больше не портятся маркерами. Защита оказалась несложной, но интересной за счет выполнения проверки введенного серийного номера во внешней библиотеке. Рабочий кейген теперь напишете самостоятельно.

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

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

Комментарии

Отзывы посетителей сайта о статье
Jul (14.01.2012 в 16:58):
Вау!!! Прикольно, все получилось))) Спасибо огромное!
CoStick (17.11.2011 в 13:42):
region59.net - да, добротный был ресурс...
ManHunter (16.11.2011 в 09:12):
Нет, я ж у себя готовый варез не выкладываю. Да и масштабы не те, что были раньше, когда постил по несколько релизов в день.
AyTkACT (16.11.2011 в 04:18):
На момент написания каммента - 7ая строка в поиске http://www.google.ru/search?aq...ollageIt+Pro

Manhunter, правообладатели не достают?
Never (15.11.2011 в 11:12):
"Программа почему-то платная" - внезапно! )))
guest (15.11.2011 в 10:54):
thanks. i like it.

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

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

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