Исследование защиты программы Total Video Audio Converter
Скриншот программы Total Video Audio Converter
Программа Total Video Audio Converter предназначена для конвертирования аудио- и видеофайлов различных форматов в другие форматы. Из плюсов - потрясающая "всеядность", эффективность работы, независимость от установленных в системе кодеков, пакетная многопоточная обработка и т.п. Из минусов - необходимость заплатить за использование. Но главный минус, что по сути это всего лишь надстройка над бесплатными конвертерами ffmpeg, ffmpeg2theora и не менее бесплатной библиотекой BASS. Наглость аффтара дошла до такой степени, что файлы конвертеров не только переименованы, но и ни в одной строчке документации или лицензии про эти продукты нет даже намека. За такую херню надо наказывать самым безжалостным образом.
Скачиваем дистрибутив, устанавливаем. Главный исполняемый файл totalvacvt.exe ничем не упакован, сразу отправляем его в дизассемблер и в редактор ресурсов.
Пункты меню в ресурсах
Обычно я ищу в ресурсах строки, относящиеся к регистрации или триальности, а сейчас для разнообразия поищем что-нибудь, связанное с пунктами меню. Они имеют индексы 1022 и 1096, соответственно в шестнадцатеричной системе это будут значения 3FEh и 448h. Поищем в коде какие-нибудь операции с этими значениями. Далеко ходить не пришлось, поиск выводит на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:0040C396 push ecx
- ; Вызвать функцию проверки
- .text:0040C397 call sub_426380
- .text:0040C39C add esp, 4
- ; EAX=0 - перепрыгнуть
- .text:0040C39F test eax, eax
- .text:0040C3A1 jz short loc_40C40C
- ; Удалить пункты меню
- .text:0040C3A3 mov edx, [esi+0FCh]
- .text:0040C3A9 push 0 ; nCmdShow
- .text:0040C3AB and edx, 0FFF7FFFFh
- .text:0040C3B1 lea ecx, [esi+2ACh]
- .text:0040C3B7 or edx, 614000h
- .text:0040C3BD mov [esi+0FCh], edx
- .text:0040C3C3 call sub_43E54E
- .text:0040C3C8 push 0 ; nCmdShow
- .text:0040C3CA lea ecx, [esi+41Ch]
- .text:0040C3D0 call sub_43E54E
- .text:0040C3D5 mov eax, [esi+0E1Ch]
- .text:0040C3DB push 1 ; nPos
- .text:0040C3DD push eax ; hMenu
- .text:0040C3DE call ds:GetSubMenu
- .text:0040C3E4 push eax
- .text:0040C3E5 call sub_4400CE
- .text:0040C3EA mov ebp, ds:DeleteMenu
- .text:0040C3F0 mov edi, eax
- .text:0040C3F2 push 0 ; uFlags
- .text:0040C3F4 push 3FEh ; uPosition
- .text:0040C3F9 mov ecx, [edi+4]
- .text:0040C3FC push ecx ; hMenu
- .text:0040C3FD call ebp ; DeleteMenu
- .text:0040C3FF mov edx, [edi+4]
- .text:0040C402 push 0 ; uFlags
- .text:0040C404 push 448h ; uPosition
- .text:0040C409 push edx ; hMenu
- .text:0040C40A call ebp ; DeleteMenu
- .text:0040C40C loc_40C40C:
- .text:0040C40C mov ecx, [esi+1Ch]
- .text:0040C40F lea eax, [esp+20h+Rect]
Code (Assembler) : Убрать нумерацию
- .text:00426380 sub esp, 0CCh
- .text:00426386 xor eax, eax
- .text:00426388 push ebx
- .text:00426389 push ebp
- .text:0042638A push esi
- .text:0042638B mov esi, [esp+0D8h+arg_0]
- .text:00426392 push edi
- .text:00426393 xor ebx, ebx
- .text:00426395 loc_426395:
- .text:00426395 mov ecx, ds:dword_453690[ebx]
- .text:0042639B test ecx, ecx
- .text:0042639D jz loc_42652A
- .text:004263A3 mov ecx, ds:dword_4536C0[ebx]
- .text:004263A9 mov edi, [esi+4]
- .text:004263AC mov edx, [esi+1Ch]
- .text:004263AF mov eax, ecx
- .text:004263B1 mov [esp+0DCh+var_BC], ecx
- .text:004263B5 and ecx, edi
- .text:004263B7 not eax
- .text:004263B9 mov edi, eax
- .text:004263BB mov ebp, [esi+18h]
- .text:004263BE and edi, edx
- .text:004263C0 or ecx, edi
- .text:004263C2 mov edi, [esi+0Ch]
- .text:004263C5 mov [esp+0DCh+var_A8], ecx
- .text:004263C9 mov ecx, ds:dword_4536D8[ebx]
- .text:004263CF mov edx, ecx
- .text:004263D1 mov [esp+0DCh+var_CC], ecx
- .text:004263D5 not edx
- .text:004263D7 mov [esp+0DCh+var_C0], edx
- .text:004263DB and ecx, ebp
- .text:004263DD mov ebp, [esi+10h]
- .text:004263E0 and edx, edi
- .text:004263E2 or ecx, edx
- .text:004263E4 mov edx, ds:dword_4536F0[ebx]
- .text:004263EA mov edi, edx
- .text:004263EC mov [esp+0DCh+var_B4], edx
- .text:004263F0 not edi
- .text:004263F2 and edx, ebp
- .text:004263F4 mov ebp, [esi+8]
- .text:004263F7 mov [esp+0DCh+var_B8], edi
- .text:004263FB and edi, ebp
- .text:004263FD or edx, edi
- .text:004263FF mov ebp, [esi]
- .text:00426401 mov [esp+0DCh+var_AC], edx
- .text:00426405 mov edx, ds:dword_4536A8[ebx]
- .text:0042640B mov edi, edx
- .text:0042640D mov [esp+0DCh+var_C8], edx
- .text:00426411 not edi
- .text:00426413 mov [esp+0DCh+var_C4], edi
- .text:00426417 and edi, ebp
- .text:00426419 mov ebp, [esi+14h]
- .text:0042641C and edx, ebp
- .text:0042641E mov ebp, [esi+1Ch]
- .text:00426421 or edi, edx
- .text:00426423 mov edx, [esi+4]
- .text:00426426 and eax, edx
- .text:00426428 mov edx, [esp+0DCh+var_BC]
- .text:0042642C and edx, ebp
- .text:0042642E mov ebp, [esi+8]
- .text:00426431 or eax, edx
- .text:00426433 mov edx, [esi+10h]
- .text:00426436 mov [esp+0DCh+var_64], eax
- .text:0042643A mov eax, [esp+0DCh+var_B8]
- .text:0042643E and eax, edx
- .text:00426440 mov edx, [esp+0DCh+var_B4]
- .text:00426444 and edx, ebp
- .text:00426446 mov ebp, [esi+14h]
- .text:00426449 or eax, edx
- .text:0042644B mov edx, [esi]
- .text:0042644D mov [esp+0DCh+var_8], eax
- .text:00426454 mov eax, [esp+0DCh+var_C8]
- .text:00426458 and eax, edx
- .text:0042645A mov edx, [esp+0DCh+var_C4]
- .text:0042645E and edx, ebp
- .text:00426460 mov ebp, [esi+0Ch]
- .text:00426463 or eax, edx
- .text:00426465 mov edx, [esi+18h]
- .text:00426468 mov [esp+0DCh+var_68], eax
- .text:0042646C mov eax, [esp+0DCh+var_C0]
- .text:00426470 and eax, edx
- .text:00426472 mov edx, [esp+0DCh+var_CC]
- .text:00426476 and edx, ebp
- .text:00426478 mov ebp, ds:dword_453618[ebx]
- .text:0042647E or eax, edx
- .text:00426480 mov edx, ds:dword_453630[ebx]
- .text:00426486 xor ecx, ebp
- .text:00426488 mov ebp, [esp+0DCh+var_AC]
- .text:0042648C xor ebp, edx
- .text:0042648E mov edx, ds:dword_453648[ebx]
- .text:00426494 xor edi, edx
- .text:00426496 mov [esp+0DCh+var_AC], ebp
- .text:0042649A mov edx, ecx
- .text:0042649C xor edx, [esp+0DCh+var_A8]
- .text:004264A0 cmp edx, ds:dword_453690[ebx]
- .text:004264A6 jnz short loc_42651D
- .text:004264A8 mov edx, [esp+0DCh+var_68]
- .text:004264AC xor edx, ebp
- .text:004264AE cmp edx, ds:dword_453660[ebx]
- .text:004264B4 jnz short loc_42651D
- .text:004264B6 mov edx, ds:dword_453678[ebx]
- .text:004264BC xor eax, ecx
- .text:004264BE cmp eax, edx
- .text:004264C0 jnz short loc_42651D
- .text:004264C2 mov eax, 0F0F0F0F1h
- .text:004264C7 mul edi
- .text:004264C9 shr edx, 4
- .text:004264CC imul edx, ebp
- .text:004264CF mov eax, 4EC4EC4Fh
- .text:004264D4 mov [esp+0DCh+var_CC], edx
- .text:004264D8 mul edi
- .text:004264DA shr edx, 2
- .text:004264DD imul edx, ecx
- .text:004264E0 mov eax, [esp+0DCh+var_CC]
- .text:004264E4 add eax, edx
- .text:004264E6 mov edx, ebp
- .text:004264E8 imul edx, ecx
- .text:004264EB add eax, edx
- .text:004264ED mov edx, [esp+0DCh+var_64]
- .text:004264F1 not eax
- .text:004264F3 cmp eax, edx
- .text:004264F5 jnz short loc_42651D
- .text:004264F7 mov edx, edi
- .text:004264F9 mov eax, 0AAAAAAABh
- .text:004264FE imul edx, ecx
- .text:00426501 mul edx
- .text:00426503 mov eax, [esp+0DCh+var_8]
- .text:0042650A shr edx, 1
- .text:0042650C sub edi, edx
- .text:0042650E add edi, ebp
- .text:00426510 not edi
- .text:00426512 cmp edi, eax
- .text:00426514 jnz short loc_42651D
- .text:00426516 mov eax, 1
- .text:0042651B jmp short loc_42651F
- .text:0042651D ; -------------------------------
- .text:0042651D loc_42651D:
- .text:0042651D xor eax, eax
- .text:0042651F loc_42651F:
- .text:0042651F add ebx, 4
- .text:00426522 test eax, eax
- .text:00426524 jz loc_426395
- .text:0042652A loc_42652A:
- .text:0042652A pop edi
- .text:0042652B pop esi
- .text:0042652C pop ebp
- .text:0042652D pop ebx
- .text:0042652E add esp, 0CCh
- .text:00426534 retn
Программа успешно "зарегистрирована"
Исчезли цветные ссылки, пункты в меню. В окне "О программе" написано, что программа зарегистрирована, только непонятно на кого. Ну и ладно. Цель достигнута, справедливость восстановлена.
Просмотров: 3646 | Комментариев: 14
Метки: исследование защиты, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(02.09.2024 в 14:38):
ida pro для дизасма. а обратно оно никогда не собирается
Новичек
(02.09.2024 в 02:59):
Каким приложением вы дизассемблировали данное приложение и собирали обратно .exe ?
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):
Такой кряк запросто может оказаться глючным, если рутина чекушки рега вызывается откуда-то еще - а чаще всего так и бывает. Прога будет показывать окошко "О программе", как зареганная, а работать - как НЕ зареганная. Сам на такие грабли уже наступал, больше не тянет.
Вот это, не спорю, инфа полезная.
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"
Если не зацикливаться на 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):
Неверно. Проверка с нулем проходит в оригинале потому, что функция возвращает в eax либо 0, либо 1 (команды xor eax, eax и mov eax, 1). При выполнении ломаного экзюка в 24-х старших битах eax'а может быть какой-то мусор, оставшийся от операций ДО вызова рутины, и из-за него проверка может глючить.
Команда xor eax, eax нужна как раз для избавления от мусора в старших байтах регистра. Поэтому долго и упорно уточнять под клоподавом - это я ленюсь... это мне неохота... ;) Мусор еще и не обязан быть статичным.
Блин, я ламернулся - команда 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/
http://www.crackmes.de/users/m..._keygenme_p/
Doxtur
(05.11.2016 в 20:59):
Вставлю пять копеек своих:
игра Arcade Lines (люблю клоны lines) - вообще какая-то мутная схема регистрации, на рутрекере валяется недолом, после набора определенного количества очков отказывается работать.
Но все признаки триала на лице, тупо ищем сообщения и патчим переходы.
Тут сел за кейген, не осилил...
игра 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):
Или, чтобы поменьше байтов:
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!
Дык закейгенили уже и довольно давно. Некто 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
Сейчас глянул - софтина переименована в Total Audio MP3 Converter, а патчик (есть привычка создавать "search and replace") так и подходит :D
Добавить комментарий
Заполните форму для добавления комментария