Исследование защиты программы Salview
Скриншот программы Salview
Salview - шустрый просмотрщик изображений для Windows, поддерживающий основные графические форматы, но работающий также и с другими изоображениями при наличии установленных кодеков. Ничем особо не выделяется, до признанных топчиков типа XnView, IrfanView и ACDSee ему как до Китая ползком, но тем не менее, имеет место быть. А шароварность мы сейчас поправим.
Забираем с сайта дистрибутив, устанавливаем, смотрим. Единственный исполняемый файл ничем не упакован и не защищен, отправляем его в дизассемблер. Нам надо найти зацепку, чтобы начать исследование. На ввод неправильных регистрационных данных программа реагирует следующим сообщением:
Сообщение о неправильной регистрации
Отлично, строка у нас есть. Поищем ее в файле. Строка юникодная, обнаруживается без проблем.
Строка сообщения в файле
Теперь нам надо найти условие, при котором она появляется, то есть при каких условиях серийник считается неправильным. По перекрестным ссылкам в дизассемблере выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:004B58CD push dword_A2CEAC ; hWnd
- .text:004B58D3 call ds:GetWindowTextLengthW
- ; Первая проверка. Длина серийника = 29 символов
- .text:004B58D9 cmp eax, 1Dh
- .text:004B58DC jnz loc_4B5B0B
- .text:004B58E2 push 1Eh ; nMaxCount
- .text:004B58E4 lea eax, [esp+2CCh+String]
- .text:004B58E8 push eax ; lpString
- .text:004B58E9 push dword_A2CEAC ; hWnd
- .text:004B58EF call ds:GetWindowTextW
- ; Вторая проверка. Разделительные дефисы на своих позициях
- .text:004B58F5 cmp [esp+2C8h+var_28A], 2Dh
- .text:004B58FB jnz loc_4B5B0B
- .text:004B5901 cmp [esp+2C8h+var_27E], 2Dh
- .text:004B5907 jnz loc_4B5B0B
- .text:004B590D cmp [esp+2C8h+var_272], 2Dh
- .text:004B5913 jnz loc_4B5B0B
- .text:004B5919 cmp [esp+2C8h+var_266], 2Dh
- .text:004B591F jnz loc_4B5B0B
- .text:004B5925 xor ecx, ecx
- .text:004B5927 mov [esp+2C8h+hKey], 6
- .text:004B592F lea edi, [esp+2C8h+Data]
- ; Выделить все валидные символы из серийника
- .text:004B5933 loc_4B5933:
- .text:004B5933 lea eax, [ecx+1]
- .text:004B5936 cdq
- .text:004B5937 idiv [esp+2C8h+hKey]
- .text:004B593B test edx, edx
- .text:004B593D jz short loc_4B5963
- .text:004B593F movzx eax, [esp+ecx*2+2C8h+String]
- .text:004B5944 cmp eax, 30h
- .text:004B5947 jb short loc_4B594E
- .text:004B5949 cmp eax, 39h
- .text:004B594C jbe short loc_4B5960
- .text:004B594E loc_4B594E:
- .text:004B594E cmp eax, 41h
- .text:004B5951 jb loc_4B5B0B
- .text:004B5957 cmp eax, 5Ah
- .text:004B595A ja loc_4B5B0B
- .text:004B5960 loc_4B5960:
- .text:004B5960 mov [edi], al
- .text:004B5962 inc edi
- .text:004B5963 loc_4B5963:
- .text:004B5963 inc ecx
- .text:004B5964 cmp ecx, 1Dh
- .text:004B5967 jl short loc_4B5933
- .text:004B5969 lea ecx, [esp+2C8h+Data]
- ; Вызвать основную функцию проверки
- .text:004B596D call sub_4B42E0
- .text:004B5972 test al, al
- ; Если она вернула AL!=0, то серийник правильный
- .text:004B5974 jz loc_4B5B0B
- .text:004B597A cmp dword_A2C660, 0
- .text:004B5981 lea eax, [esp+2C8h+hKey]
- ...
- ...
- .text:004B5B0B loc_4B5B0B:
- .text:004B5B0B push 10h ; uType
- .text:004B5B0D push offset aRegistrationEr
- ; "Registration error"
- .text:004B5B12 push offset aInvalidKey_
- ; "Invalid key."
- .text:004B5B17 push esi ; hWnd
- .text:004B5B18 call ds:MessageBoxW
- .text:004B5B1E push dword_A2CEAC ; hWnd
- .text:004B5B24 call ds:SetFocus
- .text:004B5B2A jmp loc_4B5C67
Code (Assembler) : Убрать нумерацию
- .text:004B42E0 push ebp
- .text:004B42E1 mov ebp, esp
- .text:004B42E3 sub esp, 28h
- .text:004B42E6 mov eax, dword_A268A4
- .text:004B42EB xor eax, ebp
- .text:004B42ED mov [ebp+var_4], eax
- .text:004B42F0 push esi
- .text:004B42F1 push edi
- .text:004B42F2 xorps xmm0, xmm0
- .text:004B42F5 mov [ebp+var_8], 0
- .text:004B42FC mov esi, ecx
- .text:004B42FE mov edi, 2
- .text:004B4303 movups [ebp+var_28], xmm0
- .text:004B4307 sub edi, esi
- .text:004B4309 movups [ebp+var_18], xmm0
- .text:004B430D nop dword ptr [eax]
- .text:004B4310 loc_4B4310:
- .text:004B4310 mov al, [ecx+2]
- .text:004B4313 cmp al, [ecx+1]
- .text:004B4316 jnz short loc_4B4320
- .text:004B4318 cmp al, [ecx]
- .text:004B431A jz loc_4B44A5
- .text:004B4320 loc_4B4320:
- .text:004B4320 inc ecx
- .text:004B4321 lea eax, [edi+ecx]
- .text:004B4324 cmp eax, 19h
- .text:004B4327 jl short loc_4B4310
- .text:004B4329 xor ecx, ecx
- .text:004B432B nop dword ptr [eax+eax+00h]
- .text:004B4330 loc_4B4330:
- .text:004B4330 mov dl, [esi+ecx]
- .text:004B4333 lea eax, [edx-41h]
- .text:004B4336 cmp al, 19h
- .text:004B4338 ja short loc_4B4343
- .text:004B433A movzx eax, dl
- .text:004B433D inc byte ptr [ebp+eax-69h]
- .text:004B4341 jmp short loc_4B4355
- .text:004B4343 ; ------------------------------------
- .text:004B4343 loc_4B4343:
- .text:004B4343 lea eax, [edx-30h]
- .text:004B4346 cmp al, 9
- .text:004B4348 ja loc_4B44A5
- .text:004B434E movzx eax, dl
- .text:004B4351 inc [ebp+eax+var_3E]
- .text:004B4355 loc_4B4355:
- .text:004B4355 inc ecx
- .text:004B4356 cmp ecx, 19h
- .text:004B4359 jl short loc_4B4330
- .text:004B435B xor eax, eax
- .text:004B435D nop dword ptr [eax]
- .text:004B4360 loc_4B4360:
- .text:004B4360 cmp byte ptr [ebp+eax+var_28], 3
- .text:004B4365 ja loc_4B44A5
- .text:004B436B inc eax
- .text:004B436C cmp eax, 24h
- .text:004B436F jl short loc_4B4360
Code (Assembler) : Убрать нумерацию
- .text:004B4371 movzx ecx, byte ptr [esi]
- .text:004B4374 xor edx, edx
- .text:004B4376 movzx eax, byte ptr [esi+11h]
- .text:004B437A add eax, ecx
- .text:004B437C mov ecx, 6
- .text:004B4381 div ecx
- .text:004B4383 cmp edx, 5
- .text:004B4386 jnz loc_4B44A5
- .text:004B438C movzx ecx, byte ptr [esi+13h]
- .text:004B4390 movzx eax, byte ptr [esi+1]
- .text:004B4394 add ecx, eax
- .text:004B4396 cmp ecx, 80h
- .text:004B439C jnz loc_4B44A5
- .text:004B43A2 movzx ecx, byte ptr [esi+2]
- .text:004B43A6 xor edx, edx
- .text:004B43A8 movzx eax, byte ptr [esi+7]
- .text:004B43AC add eax, ecx
- .text:004B43AE mov ecx, 0Bh
- .text:004B43B3 div ecx
- .text:004B43B5 cmp edx, 2
- .text:004B43B8 jnz loc_4B44A5
- .text:004B43BE movzx ecx, byte ptr [esi+3]
- .text:004B43C2 xor edx, edx
- .text:004B43C4 movzx eax, byte ptr [esi+18h]
- .text:004B43C8 add eax, ecx
- .text:004B43CA mov ecx, 0Fh
- .text:004B43CF div ecx
- .text:004B43D1 cmp edx, 9
- .text:004B43D4 jnz loc_4B44A5
- .text:004B43DA movzx ecx, byte ptr [esi+4]
- .text:004B43DE xor edx, edx
- .text:004B43E0 movzx eax, byte ptr [esi+16h]
- .text:004B43E4 add eax, ecx
- .text:004B43E6 mov ecx, 11h
- .text:004B43EB div ecx
- .text:004B43ED cmp edx, 3
- .text:004B43F0 jnz loc_4B44A5
- .text:004B43F6 movzx ecx, byte ptr [esi+5]
- .text:004B43FA xor edx, edx
- .text:004B43FC movzx eax, byte ptr [esi+0Ch]
- .text:004B4400 add eax, ecx
- .text:004B4402 mov ecx, 0Eh
- .text:004B4407 div ecx
- .text:004B4409 cmp edx, 7
- .text:004B440C jnz loc_4B44A5
- .text:004B4412 movzx ecx, byte ptr [esi+6]
- .text:004B4416 xor edx, edx
- .text:004B4418 movzx eax, byte ptr [esi+12h]
- .text:004B441C add eax, ecx
- .text:004B441E mov ecx, 17h
- .text:004B4423 div ecx
- .text:004B4425 test edx, edx
- .text:004B4427 jnz short loc_4B44A5
- .text:004B4429 movzx ecx, byte ptr [esi+15h]
- .text:004B442D movzx eax, byte ptr [esi+8]
- .text:004B4431 add ecx, eax
- .text:004B4433 cmp ecx, 88h
- .text:004B4439 jnz short loc_4B44A5
- .text:004B443B movzx ecx, byte ptr [esi+9]
- .text:004B443F movzx eax, byte ptr [esi+0Dh]
- .text:004B4443 add eax, ecx
- .text:004B4445 mov ecx, 1Ch
- .text:004B444A div ecx
- .text:004B444C cmp edx, 8
- .text:004B444F jnz short loc_4B44A5
- .text:004B4451 movzx ecx, byte ptr [esi+0Fh]
- .text:004B4455 movzx eax, byte ptr [esi+0Ah]
- .text:004B4459 add ecx, eax
- .text:004B445B cmp ecx, 0A2h
- .text:004B4461 jnz short loc_4B44A5
- .text:004B4463 movzx ecx, byte ptr [esi+10h]
- .text:004B4467 movzx eax, byte ptr [esi+0Bh]
- .text:004B446B add ecx, eax
- .text:004B446D cmp ecx, 9Dh
- .text:004B4473 jnz short loc_4B44A5
- .text:004B4475 movzx ecx, byte ptr [esi+0Eh]
- .text:004B4479 xor edx, edx
- .text:004B447B movzx eax, byte ptr [esi+14h]
- .text:004B447F add eax, ecx
- .text:004B4481 mov ecx, 0Dh
- .text:004B4486 div ecx
- .text:004B4488 cmp edx, 2
- .text:004B448B jnz short loc_4B44A5
- .text:004B448D test byte ptr [esi+17h], 3
- .text:004B4491 jnz short loc_4B44A5
Программа успешно зарегистрирована
Повторяем регистрацию с найденным серийником. Программа благодарит за регистрацию. Да не за что, всегда пожалуйста, рад был помочь, заходите еще. Цель достигнута, кейген нарисуете самостоятельно.
Просмотров: 1114 | Комментариев: 2
Метки: исследование защиты, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(07.06.2021 в 14:38):
Если патчить под любой серийник, то придется нейтрализовать целую груду условных переходов. И не только здесь при вводе, но и при старте программы наверняка есть какой-то подобный код. По-моему, оно того не стоит.
федя
(07.06.2021 в 13:24):
Не совсем понял кусок кода отвечающий за финальную проверку чтоб его пропачить
Добавить комментарий
Заполните форму для добавления комментария