
Скриншот программы Emicsoft MTS Converter
После покупки видеокамеры мне потребовалась программа для конвертирования видео из формата MTS в какой-нибудь более удобоваримый. Перепробовал несколько разных решений, как бесплатных, так и шароварных, в результате остановился на
Emicsoft MTS Converter. Простейшая в настройках программа, при этом на выходе она дает самый лучший результат. Как обычно, всю малину испортила необходимость ее покупки.
Скачиваем
дистрибутив, устанавливаем, запускаем. Сразу открывается окно с предложением ввести регистрационные данные или перейти на сайт для покупки:

Окно регистрации программы
На ввод левых регистрационных данных программа реагирует сообщением "The registration code is error." Еще, блин, одни грамотеи. Ладно, посмотрим где это у нас находится. Главный исполняемый файл Emicsoft MTS Converter.exe занимает подозрительно мало места для такой программы - всего около 90 килобайт, и это при том, что он даже ничем не упакован. Подозрения оправдались, искомая строка в нем не находится ни в каком виде.

Файл со строкой найден
На помощь приходит Total Commander, поиском по всему каталогу с вложенными папками файл находится очень быстро. Ну вот, другое дело - dll почти на 16 мегабайт, с его именем, правда, аффтары тоже соригинальничали: EmicVideoMui_dll.dll Посмотрим, при каких условиях появляется сообщение о неправильной регистрации.
...
.text:0041666C lea ecx, [ebp+var_54]
.text:0041666F push ecx
.text:00416670 lea eax, [esi+328h]
.text:00416676 push eax
; Вызвать функцию проверки регистрационных данных
.text:00416677 call sub_41BCE4
.text:0041667C add esp, 8
.text:0041667F mov edx, 2
; Занести в стек результат ее работы
.text:00416684 push eax
.text:00416685 lea eax, [ebp+var_54]
.text:00416688 dec dword ptr [ebx+1Ch]
.text:0041668B call sub_594E88
; Восстановить из стека результат ее работы
.text:00416690 pop ecx
.text:00416691 test cl, cl
; Если CL=0, то регистрационные данные неправильные, переход на
; триальную ветку алгоритма
.text:00416693 jz short loc_4166BA
; Выдать сообщение об успешной регистрации
.text:00416695 push 0 ; uType
.text:00416697 push offset aRegistration_1
; "Registration"
.text:0041669C push offset aSuccessful
; "Successful"
.text:004166A1 mov eax, esi
.text:004166A3 call @Controls@TWinControl@GetHandle$qqrv
.text:004166A8 push eax ; hWnd
.text:004166A9 call MessageBoxA
.text:004166AE mov dword ptr [esi+24Ch], 1
.text:004166B8 jmp short loc_416733
.text:004166BA ; --------------------------------------------------------
.text:004166BA loc_4166BA:
; Сообщение о неправильном регистрационном коде
.text:004166BA push 10h ; uType
.text:004166BC push offset aRegistration_2
; "Registration"
.text:004166C1 push offset aTheRegistratio
; "The registration code is error."
.text:004166C6 mov eax, esi
.text:004166C8 call @Controls@TWinControl@GetHandle$qqrv
.text:004166CD push eax ; hWnd
.text:004166CE call MessageBoxA
...
Нас интересует функция проверки регистрационного номера по адресу 41BCE4, а точнее ее результат. Там используется какая-то криптография, да еще и загружаемая из внешнего модуля. Тратить время на разбор всей этой каши у меня нет никакого желания, так что ограничусь классическим патчем. Нам надо, чтобы функция проверки вернула ненулевое значение в регистре EAX, которое затем будет записано в стек и потом будет проверяться. Значит требуется просто записать пару команд MOV AL,1; RET в начало функции проверки по адресу 41BCE4. Сохраняем изменения, запускаем. Окно регистрации пропало, никаких ограничений нет. Теперь на сэкономленную денежку можно затариться пивом и углубиться в процесс обработки видео из отпуска.