Blog. Just Blog

Исследование защиты программы Total Video Audio Converter

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

Программа Total Video Audio Converter предназначена для конвертирования аудио- и видеофайлов различных форматов в другие форматы. Из плюсов - потрясающая "всеядность", эффективность работы, независимость от установленных в системе кодеков, пакетная многопоточная обработка и т.п. Из минусов - необходимость заплатить за использование. Но главный минус, что по сути это всего лишь надстройка над бесплатными конвертерами ffmpeg, ffmpeg2theora и не менее бесплатной библиотекой BASS. Наглость аффтара дошла до такой степени, что файлы конвертеров не только переименованы, но и ни в одной строчке документации или лицензии про эти продукты нет даже намека. За такую херню надо наказывать самым безжалостным образом.

Скачиваем дистрибутив, устанавливаем. Главный исполняемый файл totalvacvt.exe ничем не упакован, сразу отправляем его в дизассемблер и в редактор ресурсов.

Пункты меню в ресурсах
Пункты меню в ресурсах

Обычно я ищу в ресурсах строки, относящиеся к регистрации или триальности, а сейчас для разнообразия поищем что-нибудь, связанное с пунктами меню. Они имеют индексы 1022 и 1096, соответственно в шестнадцатеричной системе это будут значения 3FEh и 448h. Поищем в коде какие-нибудь операции с этими значениями. Далеко ходить не пришлось, поиск выводит на следующий код:
  1. .text:0040C396                 push    ecx
  2. ; Вызвать функцию проверки
  3. .text:0040C397                 call    sub_426380
  4. .text:0040C39C                 add     esp, 4
  5. ; EAX=0 - перепрыгнуть
  6. .text:0040C39F                 test    eax, eax
  7. .text:0040C3A1                 jz      short loc_40C40C
  8. ; Удалить пункты меню
  9. .text:0040C3A3                 mov     edx, [esi+0FCh]
  10. .text:0040C3A9                 push    0               ; nCmdShow
  11. .text:0040C3AB                 and     edx, 0FFF7FFFFh
  12. .text:0040C3B1                 lea     ecx, [esi+2ACh]
  13. .text:0040C3B7                 or      edx, 614000h
  14. .text:0040C3BD                 mov     [esi+0FCh], edx
  15. .text:0040C3C3                 call    sub_43E54E
  16. .text:0040C3C8                 push    0               ; nCmdShow
  17. .text:0040C3CA                 lea     ecx, [esi+41Ch]
  18. .text:0040C3D0                 call    sub_43E54E
  19. .text:0040C3D5                 mov     eax, [esi+0E1Ch]
  20. .text:0040C3DB                 push    1               ; nPos
  21. .text:0040C3DD                 push    eax             ; hMenu
  22. .text:0040C3DE                 call    ds:GetSubMenu
  23. .text:0040C3E4                 push    eax
  24. .text:0040C3E5                 call    sub_4400CE
  25. .text:0040C3EA                 mov     ebp, ds:DeleteMenu
  26. .text:0040C3F0                 mov     edi, eax
  27. .text:0040C3F2                 push    0               ; uFlags
  28. .text:0040C3F4                 push    3FEh            ; uPosition
  29. .text:0040C3F9                 mov     ecx, [edi+4]
  30. .text:0040C3FC                 push    ecx             ; hMenu
  31. .text:0040C3FD                 call    ebp ; DeleteMenu
  32. .text:0040C3FF                 mov     edx, [edi+4]
  33. .text:0040C402                 push    0               ; uFlags
  34. .text:0040C404                 push    448h            ; uPosition
  35. .text:0040C409                 push    edx             ; hMenu
  36. .text:0040C40A                 call    ebp ; DeleteMenu
  37. .text:0040C40C loc_40C40C:
  38. .text:0040C40C                 mov     ecx, [esi+1Ch]
  39. .text:0040C40F                 lea     eax, [esp+20h+Rect]
Несложно догадаться, что пункты меню, отвечающие за регистрацию, удаляются только в том случае, если программа зарегистрирована. За это отвечает функция проверки по адресу 00426380.
  1. .text:00426380                 sub     esp, 0CCh
  2. .text:00426386                 xor     eax, eax
  3. .text:00426388                 push    ebx
  4. .text:00426389                 push    ebp
  5. .text:0042638A                 push    esi
  6. .text:0042638B                 mov     esi, [esp+0D8h+arg_0]
  7. .text:00426392                 push    edi
  8. .text:00426393                 xor     ebx, ebx
  9. .text:00426395 loc_426395:
  10. .text:00426395                 mov     ecx, ds:dword_453690[ebx]
  11. .text:0042639B                 test    ecx, ecx
  12. .text:0042639D                 jz      loc_42652A
  13. .text:004263A3                 mov     ecx, ds:dword_4536C0[ebx]
  14. .text:004263A9                 mov     edi, [esi+4]
  15. .text:004263AC                 mov     edx, [esi+1Ch]
  16. .text:004263AF                 mov     eax, ecx
  17. .text:004263B1                 mov     [esp+0DCh+var_BC], ecx
  18. .text:004263B5                 and     ecx, edi
  19. .text:004263B7                 not     eax
  20. .text:004263B9                 mov     edi, eax
  21. .text:004263BB                 mov     ebp, [esi+18h]
  22. .text:004263BE                 and     edi, edx
  23. .text:004263C0                 or      ecx, edi
  24. .text:004263C2                 mov     edi, [esi+0Ch]
  25. .text:004263C5                 mov     [esp+0DCh+var_A8], ecx
  26. .text:004263C9                 mov     ecx, ds:dword_4536D8[ebx]
  27. .text:004263CF                 mov     edx, ecx
  28. .text:004263D1                 mov     [esp+0DCh+var_CC], ecx
  29. .text:004263D5                 not     edx
  30. .text:004263D7                 mov     [esp+0DCh+var_C0], edx
  31. .text:004263DB                 and     ecx, ebp
  32. .text:004263DD                 mov     ebp, [esi+10h]
  33. .text:004263E0                 and     edx, edi
  34. .text:004263E2                 or      ecx, edx
  35. .text:004263E4                 mov     edx, ds:dword_4536F0[ebx]
  36. .text:004263EA                 mov     edi, edx
  37. .text:004263EC                 mov     [esp+0DCh+var_B4], edx
  38. .text:004263F0                 not     edi
  39. .text:004263F2                 and     edx, ebp
  40. .text:004263F4                 mov     ebp, [esi+8]
  41. .text:004263F7                 mov     [esp+0DCh+var_B8], edi
  42. .text:004263FB                 and     edi, ebp
  43. .text:004263FD                 or      edx, edi
  44. .text:004263FF                 mov     ebp, [esi]
  45. .text:00426401                 mov     [esp+0DCh+var_AC], edx
  46. .text:00426405                 mov     edx, ds:dword_4536A8[ebx]
  47. .text:0042640B                 mov     edi, edx
  48. .text:0042640D                 mov     [esp+0DCh+var_C8], edx
  49. .text:00426411                 not     edi
  50. .text:00426413                 mov     [esp+0DCh+var_C4], edi
  51. .text:00426417                 and     edi, ebp
  52. .text:00426419                 mov     ebp, [esi+14h]
  53. .text:0042641C                 and     edx, ebp
  54. .text:0042641E                 mov     ebp, [esi+1Ch]
  55. .text:00426421                 or      edi, edx
  56. .text:00426423                 mov     edx, [esi+4]
  57. .text:00426426                 and     eax, edx
  58. .text:00426428                 mov     edx, [esp+0DCh+var_BC]
  59. .text:0042642C                 and     edx, ebp
  60. .text:0042642E                 mov     ebp, [esi+8]
  61. .text:00426431                 or      eax, edx
  62. .text:00426433                 mov     edx, [esi+10h]
  63. .text:00426436                 mov     [esp+0DCh+var_64], eax
  64. .text:0042643A                 mov     eax, [esp+0DCh+var_B8]
  65. .text:0042643E                 and     eax, edx
  66. .text:00426440                 mov     edx, [esp+0DCh+var_B4]
  67. .text:00426444                 and     edx, ebp
  68. .text:00426446                 mov     ebp, [esi+14h]
  69. .text:00426449                 or      eax, edx
  70. .text:0042644B                 mov     edx, [esi]
  71. .text:0042644D                 mov     [esp+0DCh+var_8], eax
  72. .text:00426454                 mov     eax, [esp+0DCh+var_C8]
  73. .text:00426458                 and     eax, edx
  74. .text:0042645A                 mov     edx, [esp+0DCh+var_C4]
  75. .text:0042645E                 and     edx, ebp
  76. .text:00426460                 mov     ebp, [esi+0Ch]
  77. .text:00426463                 or      eax, edx
  78. .text:00426465                 mov     edx, [esi+18h]
  79. .text:00426468                 mov     [esp+0DCh+var_68], eax
  80. .text:0042646C                 mov     eax, [esp+0DCh+var_C0]
  81. .text:00426470                 and     eax, edx
  82. .text:00426472                 mov     edx, [esp+0DCh+var_CC]
  83. .text:00426476                 and     edx, ebp
  84. .text:00426478                 mov     ebp, ds:dword_453618[ebx]
  85. .text:0042647E                 or      eax, edx
  86. .text:00426480                 mov     edx, ds:dword_453630[ebx]
  87. .text:00426486                 xor     ecx, ebp
  88. .text:00426488                 mov     ebp, [esp+0DCh+var_AC]
  89. .text:0042648C                 xor     ebp, edx
  90. .text:0042648E                 mov     edx, ds:dword_453648[ebx]
  91. .text:00426494                 xor     edi, edx
  92. .text:00426496                 mov     [esp+0DCh+var_AC], ebp
  93. .text:0042649A                 mov     edx, ecx
  94. .text:0042649C                 xor     edx, [esp+0DCh+var_A8]
  95. .text:004264A0                 cmp     edx, ds:dword_453690[ebx]
  96. .text:004264A6                 jnz     short loc_42651D
  97. .text:004264A8                 mov     edx, [esp+0DCh+var_68]
  98. .text:004264AC                 xor     edx, ebp
  99. .text:004264AE                 cmp     edx, ds:dword_453660[ebx]
  100. .text:004264B4                 jnz     short loc_42651D
  101. .text:004264B6                 mov     edx, ds:dword_453678[ebx]
  102. .text:004264BC                 xor     eax, ecx
  103. .text:004264BE                 cmp     eax, edx
  104. .text:004264C0                 jnz     short loc_42651D
  105. .text:004264C2                 mov     eax, 0F0F0F0F1h
  106. .text:004264C7                 mul     edi
  107. .text:004264C9                 shr     edx, 4
  108. .text:004264CC                 imul    edx, ebp
  109. .text:004264CF                 mov     eax, 4EC4EC4Fh
  110. .text:004264D4                 mov     [esp+0DCh+var_CC], edx
  111. .text:004264D8                 mul     edi
  112. .text:004264DA                 shr     edx, 2
  113. .text:004264DD                 imul    edx, ecx
  114. .text:004264E0                 mov     eax, [esp+0DCh+var_CC]
  115. .text:004264E4                 add     eax, edx
  116. .text:004264E6                 mov     edx, ebp
  117. .text:004264E8                 imul    edx, ecx
  118. .text:004264EB                 add     eax, edx
  119. .text:004264ED                 mov     edx, [esp+0DCh+var_64]
  120. .text:004264F1                 not     eax
  121. .text:004264F3                 cmp     eax, edx
  122. .text:004264F5                 jnz     short loc_42651D
  123. .text:004264F7                 mov     edx, edi
  124. .text:004264F9                 mov     eax, 0AAAAAAABh
  125. .text:004264FE                 imul    edx, ecx
  126. .text:00426501                 mul     edx
  127. .text:00426503                 mov     eax, [esp+0DCh+var_8]
  128. .text:0042650A                 shr     edx, 1
  129. .text:0042650C                 sub     edi, edx
  130. .text:0042650E                 add     edi, ebp
  131. .text:00426510                 not     edi
  132. .text:00426512                 cmp     edi, eax
  133. .text:00426514                 jnz     short loc_42651D
  134. .text:00426516                 mov     eax, 1
  135. .text:0042651B                 jmp     short loc_42651F
  136. .text:0042651D ; -------------------------------
  137. .text:0042651D loc_42651D:
  138. .text:0042651D                 xor     eax, eax
  139. .text:0042651F loc_42651F:
  140. .text:0042651F                 add     ebx, 4
  141. .text:00426522                 test    eax, eax
  142. .text:00426524                 jz      loc_426395
  143. .text:0042652A loc_42652A:
  144. .text:0042652A                 pop     edi
  145. .text:0042652B                 pop     esi
  146. .text:0042652C                 pop     ebp
  147. .text:0042652D                 pop     ebx
  148. .text:0042652E                 add     esp, 0CCh
  149. .text:00426534                 retn
Проверка линейная, если есть много свободного времени, то можете даже пореверсить алгоритм проверки. А сводится все к установке регистра EAX=1 или его обнулению XOR EAX,EAX. Значит для того, чтобы программа почувствовала себя зарегистрированной, надо прописать в начало функции проверки команды MOV EAX,1 и RET. Проверяем.

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

Исчезли цветные ссылки, пункты в меню. В окне "О программе" написано, что программа зарегистрирована, только непонятно на кого. Ну и ладно. Цель достигнута, справедливость восстановлена.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (21.09.2019 в 14:22):
Написано же, 00426380
Ламер (21.09.2019 в 13:43):
"А сводится все к установке регистра EAX=1 или его обнулению XOR EAX,EAX. Значит для того, чтобы программа почувствовала себя зарегистрированной, надо прописать в начало функции проверки команды MOV EAX,1 и RET. Проверяем." В какую именно строку  ?
X-Wing Top Ace (12.11.2016 в 20:03):
Цитатавполне хватает одного байта 40C3A1 74 69 > 00

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

ЦитатаЧтобы увидеть свои данные в about Total Video Audio Converter, достаточно записать их в ветку реестра

Вот это, не спорю, инфа полезная.
Noobie (10.11.2016 в 18:24):
> Итого 4 байта, причем и компактно, и 100% работает, не требуя долгих уточнений под клоподавом.
Если не зацикливаться на 0040C397 call 426380, а опустить глаза чуть ниже, то вполне хватает одного байта 40C3A1 74 69 > 00
Чтобы увидеть свои данные в about Total Video Audio Converter, достаточно записать их в ветку реестра
HKEY_CURRENT_USER\Software\Total Video Audio Converter 4
"SN"=hex:... (32 любых байта)
"RegUsername"="Your name"
X-Wing Top Ace (08.11.2016 в 14:19):
ЦитатаА раз проверка с нулем, то можно и еще короче: mov al,1 и ret

Неверно. Проверка с нулем проходит в оригинале потому, что функция возвращает в eax либо 0, либо 1 (команды xor eax, eax и mov eax, 1). При выполнении ломаного экзюка в 24-х старших битах eax'а может быть какой-то мусор, оставшийся от операций ДО вызова рутины, и из-за него проверка может глючить.

Цитатаесли уточнить состояние регистров под отладчиком, то вообще inc eax и ret.

Команда xor eax, eax нужна как раз для избавления от мусора в старших байтах регистра. Поэтому долго и упорно уточнять под клоподавом - это я ленюсь... это мне неохота... ;) Мусор еще и не обязан быть статичным.

Цитатаxor eax, eax
inc al
retn

Блин, я ламернулся - команда inc al занимает 2 байта, а inc eax однобайтовая. Так что:

31 C0: xor eax, eax
40:    inc eax ; inc al даст лишний байтик.
C3:    retn

Итого 4 байта, причем и компактно, и 100% работает, не требуя долгих уточнений под клоподавом.
voffka (08.11.2016 в 11:49):
Кто собрался кейгенить. На сколько я помню тут этот алгос используется
http://www.crackmes.de/users/m..._keygenme_p/
Doxtur (05.11.2016 в 20:59):
Вставлю пять копеек своих:
игра Arcade Lines (люблю клоны lines) - вообще какая-то мутная схема регистрации, на рутрекере валяется недолом, после набора определенного количества очков отказывается работать.
Но все признаки триала на лице, тупо ищем сообщения и патчим переходы.
Тут сел за кейген, не осилил...
ManHunter (05.11.2016 в 14:30):
А раз проверка с нулем, то можно и еще короче: mov al,1 и ret, а если уточнить состояние регистров под отладчиком, то вообще inc eax и ret.
X-Wing Top Ace (05.11.2016 в 11:05):
Цитатакоманды MOV EAX,1 и RET

Или, чтобы поменьше байтов:

xor eax, eax
inc al
retn
Noobie (05.11.2016 в 09:23):
>хутек кейгенить надо
Дык закейгенили уже и довольно давно. Некто mazuki в 2011 году сделал сначала патчер+кейген, а потом кейген практически для всех софтов Хутека. Правда, есть один ма-а-аленький нюанс: NetMeter охотно принимает ключ, но потом все равно срабатывает триал. Кто только не ломал этот несчастный NetMeter, и что характерно, всегда криво, поскольку подождать 5 минут после истечения триала ни у кого терпения не хватало, и кейген тоже не работает. Разумеется, я доломал до победного конца несколько лет назад, поскольку постоянно пользуюсь софтом, но вопрос в проверке крякерами своих изделий так и не закрыт. Примитивнейшая таймбомба способна подгадить не одной крякерской тиме, которая спешит заявить об очередном quality release, но наступает на те же грабли :-)
P.S. Nothing personal, FYI only!
DimitarSerg (04.11.2016 в 15:59):
Эх, хутек кейгенить надо, там, если не ошибаюсь прикольная битовая арифметика. Один продукт точно релизил их.. cda2mp3 или как-то так.
Anonymous (03.11.2016 в 23:56):
Я в 2013 точно так ломал его же софтину WAV MP3 Converter (нужно было быстро пожать вавки, качнул первое, что в гугле нашлось).

Сейчас глянул - софтина переименована в Total Audio MP3 Converter, а патчик (есть привычка создавать "search and replace") так и подходит :D

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

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

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