Исследование защиты программы GIF Player
Скриншот программы GIF Player
GIF Player - программа для просмотра анимированных файлов в формате GIF с некоторыми дополнительными функциями. Например, можно выполнять покадровую прокрутку и сохранять отдельные кадры. В остальном самый обычный просмотрщик, ну разве что денег просит.
Забираем с офсайта дистрибутив, устанавливаем, смотрим что и как. Я специально перевел системное время, чтобы испытательный период закончился. По истечении триального периода программа выдает вот такое окно. Оно же появляется при попытке воспроизвести файл.
Триальное окно
Соответствующая надпись присутствует и в окне "О программе".
Окно "О программе"
Исходные данные у нас имеются, отправляем исполняемый файл в дизассемблер. Но для разнообразия сегодня давайте начнем с косметических правок. В основном меню имеются два пункта, относящиеся к регистрации и покупке. У них есть числовые индексы, но в листинге дизассемблера они нигде не встречаются. Стало быть они будут висеть в программе постоянно. Исправим этот недочет.
Удаляем пункты меню
Открываем файл в редакторе ресурсов и удаляем из меню пункты, отвечающие за регистрацию и покупку, а также оставшийся лишний разделитель. Сохраняем изменения.
Шаблон диалога "О программе"
Там же в ресурсах находим шаблон диалогового окна "О программе", а в нем определяем идентификаторы кнопок "Buy Now" и "Register", это 1007 и 1010 соответственно. Переведем их в шестнадцатеричные значения и поищем в листинге дизассемблера. На этот раз обнаружится следующий код:
Code (Assembler) : Убрать нумерацию
- .text:00423CDE sub_423CDE proc near
- .text:00423CDE mov eax, offset loc_4AFD60
- .text:00423CE3 call __EH_prolog
- .text:00423CE8 push ecx
- .text:00423CE9 push ebx
- .text:00423CEA push esi
- .text:00423CEB push edi
- .text:00423CEC mov edi, ecx
- .text:00423CEE mov esi, offset unk_4DE75C
- .text:00423CF3 mov ecx, esi
- ; Вызвать функцию проверки
- .text:00423CF5 call sub_424399
- ; Манипуляции с результатом вызова
- .text:00423CFA neg eax
- .text:00423CFC sbb eax, eax
- .text:00423CFE mov ecx, edi
- .text:00423D00 and al, 0FBh
- .text:00423D02 add eax, 5
- ; Флаг отображения элемента диалогового окна
- .text:00423D05 mov ebx, eax
- .text:00423D07 push ebx ; nCmdShow
- .text:00423D08 push 3EFh ; nIDDlgItem
- ; Скрыть или отобразить кнопку
- .text:00423D0D call sub_49C363
- .text:00423D12 mov ecx, eax
- .text:00423D14 call sub_49C5C2
- .text:00423D19 push ebx ; nCmdShow
- .text:00423D1A push 3F2h ; nIDDlgItem
- .text:00423D1F mov ecx, edi
- ; Скрыть или отобразить кнопку
- .text:00423D21 call sub_49C363
- .text:00423D26 mov ecx, eax
- .text:00423D28 call sub_49C5C2
- .text:00423D2D lea eax, [ebp+lpString]
- .text:00423D30 mov ecx, esi
- .text:00423D32 push eax
- .text:00423D33 call sub_424421
- .text:00423D38 push [ebp+lpString] ; lpString
- .text:00423D3B and [ebp+var_4], 0
- .text:00423D3F mov ecx, edi
- .text:00423D41 push 3EDh ; nIDDlgItem
- .text:00423D46 call sub_49C3BB
- .text:00423D4B or [ebp+var_4], 0FFFFFFFFh
- .text:00423D4F lea ecx, [ebp+lpString]
- .text:00423D52 call sub_49CEA0
- .text:00423D57 mov ecx, [ebp+var_C]
- .text:00423D5A pop edi
- .text:00423D5B pop esi
- .text:00423D5C pop ebx
- .text:00423D5D mov large fs:0, ecx
- .text:00423D64 leave
- .text:00423D65 retn
- .text:00423D65 sub_423CDE endp
Code (Assembler) : Убрать нумерацию
- .text:00420400 dec eax
- .text:00420401 mov byte ptr [ebp+var_4], 3
- .text:00420405 jz loc_4204AD
- .text:0042040B dec eax
- .text:0042040C jz short loc_42045B
- .text:0042040E dec eax
- .text:0042040F dec eax
- .text:00420410 jnz loc_420502
- .text:00420416 cmp [ebp+arg_A], 0Ah
- .text:0042041B jz short loc_420454
- .text:0042041D cmp [ebp+arg_C], 0Ah
- .text:00420421 jz short loc_42043B
- .text:00420423 cmp [ebp+arg_C], 0Bh
- .text:00420427 jz short loc_42043B
- .text:00420429 push offset aYourFreeTrialH
- ; "Your free trial has expired!"
- .text:0042042E loc_42042E:
- .text:0042042E lea ecx, [ebp+var_10]
- .text:00420431 call ??4CString@@QAEABV0@PBG@Z
- .text:00420436 jmp loc_420502
- .text:0042043B ; ---------------------------------------
- .text:0042043B loc_42043B:
- .text:0042043B push [ebp+arg_10] ; int
- .text:0042043E push offset aYourFreeDDayTr
- ; "Your free %d-day trial has expired!"
- .text:00420443 loc_420443:
- .text:00420443 lea eax, [ebp+var_10]
- .text:00420446 push eax ; int
- .text:00420447 call sub_49679D
- .text:0042044C add esp, 0Ch
- .text:0042044F jmp loc_420502
- .text:00420454 ; ---------------------------------------
- .text:00420454 loc_420454:
- .text:00420454 push offset aThisLicenseDoe
- ; "This license doesn't work with the curr"...
- .text:00420459 jmp short loc_42042E
- .text:0042045B ; ---------------------------------------
- .text:0042045B loc_42045B:
- .text:0042045B movzx eax, [ebp+arg_A]
- .text:0042045F sub eax, 0
- .text:00420462 jz short loc_42047D
- .text:00420464 dec eax
- .text:00420465 jnz loc_420502
- .text:0042046B mov eax, [ebp+arg_1C]
- .text:0042046E push dword ptr [eax+8]
- .text:00420471 push dword ptr [eax+4]
- .text:00420474 push dword ptr [eax]
- .text:00420476 push offset aYourLicenseH_0
- ; "Your license has expired!\r\n[Expiration "...
- .text:0042047B jmp short loc_4204F6
- .text:0042047D ; ---------------------------------------
- .text:0042047D loc_42047D:
- .text:0042047D mov eax, [ebp+arg_1C]
- .text:00420480 mov ecx, [eax]
- .text:00420482 test ecx, ecx
- .text:00420484 jle short loc_4204A3
- .text:00420486 push dword ptr [eax+8]
- .text:00420489 push dword ptr [eax+4]
- .text:0042048C lea eax, [ebp+var_10]
- .text:0042048F push ecx
- .text:00420490 push [ebp+arg_18] ; int
- .text:00420493 push offset aThisProductIsL
- ; "This product is licensed to:\r\n%s\r\n[Expi"...
- .text:00420498 push eax ; int
- .text:00420499 call sub_49679D
- .text:0042049E add esp, 18h
- .text:004204A1 jmp short loc_420502
- .text:004204A3 ; ---------------------------------------
- .text:004204A3 loc_4204A3:
- .text:004204A3 push [ebp+arg_18]
- .text:004204A6 push offset aThisProductI_0
- ; "This product is licensed to:\r\n%s"
- .text:004204AB jmp short loc_420443
- .text:004204AD ; ---------------------------------------
- .text:004204AD loc_4204AD:
- .text:004204AD movzx eax, [ebp+arg_A]
- .text:004204B1 sub eax, 0
- .text:004204B4 jz short loc_4204CE
- .text:004204B6 dec eax
Окно "О программе"
Красота, да и только. Теперь переходим к триальному окну, которое появляется при запуске, а также к снятию ограничения по функционалу. В ресурсах находим шаблон триального окна, который имеет индекс 528 или 210h, если в шестнадцатеричной системе.
Шаблон триального окна
Вновь возвращаемся в дизассемблер и ищем код, где используется этот индекс, причем желательно недалеко от какой-нибудь функции работы с окнами. Обнаружится единственная процедура, где создается диалог с нужным нам индексом:
Code (Assembler) : Убрать нумерацию
- .text:0041CBDE sub_41CBDE proc near
- .text:0041CBDE mov eax, offset loc_4AF1D1
- .text:0041CBE3 call __EH_prolog
- .text:0041CBE8 push ecx
- .text:0041CBE9 push esi
- .text:0041CBEA push edi
- .text:0041CBEB mov edi, ecx
- .text:0041CBED mov [ebp+var_10], edi
- .text:0041CBF0 push [ebp+arg_8C]
- .text:0041CBF6 and [ebp+var_4], 0
- ; Создать диалоговое окно из шаблона
- .text:0041CBFA push 210h
- .text:0041CBFF call ??0CDialog@@QAE@IPAVCWnd@@@Z
- ; CDialog::CDialog(uint,CWnd *)
- .text:0041CC04 lea esi, [edi+5Ch]
- .text:0041CC07 mov byte ptr [ebp+var_4], 1
- .text:0041CC0B mov ecx, esi
- ...
- ...
Программа успешно "зарегистрирована"
Никаких окон не появляется, перевод системного времени вперед на функционале тоже не сказывается, в интерфейсе тоже все красиво. Цель достигнута.
Просмотров: 641 | Комментариев: 0
Метки: исследование защиты, графика
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария