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", надоедливые окна исчезли, а готовые коллажи больше не портятся маркерами. Защита оказалась несложной, но интересной за счет выполнения проверки введенного серийного номера во внешней библиотеке. Рабочий кейген теперь напишете самостоятельно.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 6000 | Комментариев: 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-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.2 сек. / MySQL: 2 (0.1291 сек.) / Память: 4.75 Mb
Наверх