Исследование защиты программы QSetup Installation Suite
Скриншот программы QSetup Installation Suite
QSetup Installation Suite - очень толковая софтина для создания инсталляторов. Огромное количество настроек, удобный и интуитивно понятный интерфейс, все действия выполняются при помощи пошаговых мастеров, а промежуточный результат создаваемого дистрибутива можно сразу же посмотреть. Короче, годная вещь. И все бы хорошо, только за полновесную профессиональную лицензию придется выложить заоблачную сумму в полторы тысячи баксов. Вспоминается анекдот: "На базаре мужик продает петуха. К нему подходит покупатель. - Почем петух? - Пятьдесят тысяч. - А что так дорого-то? - Деньги очень нужны."
Забираем с офсайта дистрибутив, устанавливаем, смотрим что и как. Кстати, инсталлятор QSetup сделан в нем же самом, так что можно считать это презентацией продукта. Беглым осмотром главного исполняемого файла выясняется, что он упакован UPX. Упаковщик самый обычный, никаких модификаций и сюрпризов, снимается он командой upx -d Composer.exe
Сообщение о неправильной регистрации
Отправляем распакованный файл на дизассемблирование, параллельно посмотрим на всякую триальность и прочее. На ввод неправильного серийника программа реагирует вот таким сообщением. Код, где оно используется, легко находится:
Code (Assembler) : Убрать нумерацию
- CODE:005940FD mov eax, [ebp+var_4]
- ; Вызвать функцию проверки
- CODE:00594100 call @SvrHTTP@_16513 ; SvrHTTP::_16513
- CODE:00594105 test al, al
- ; Если она вернула AL=0, то серийник неправильный
- CODE:00594107 jnz short loc_59412D
- CODE:00594109 push 0
- CODE:0059410B push 0
- CODE:0059410D lea ecx, [ebp+var_1C]
- CODE:00594110 mov edx, offset _str_Illegal_Registr.Text
- CODE:00594115 mov eax, offset _str_QMain_06.Text
- CODE:0059411A call sub_4F6118
- CODE:0059411F mov edx, [ebp+var_1C]
- CODE:00594122 xor ecx, ecx
- CODE:00594124 xor eax, eax
Code (Assembler) : Убрать нумерацию
- CODE:00517554 push ebp
- CODE:00517555 mov ebp, esp
- CODE:00517557 push ecx
- CODE:00517558 push ebx
- CODE:00517559 mov [ebp+var_4], eax
- CODE:0051755C mov eax, [ebp+var_4]
- CODE:0051755F call @System@@LStrAddRef$qqrpv
- CODE:00517564 xor eax, eax
- CODE:00517566 push ebp
- CODE:00517567 push offset loc_5175F3
- CODE:0051756C push dword ptr fs:[eax]
- CODE:0051756F mov fs:[eax], esp
- CODE:00517572 lea eax, [ebp+var_4]
- CODE:00517575 call sub_5161D4
- CODE:0051757A mov eax, [ebp+var_4]
- CODE:0051757D call unknown_libname_92
- ; Первая проверка - длина серийника должна быть не менее 10h (16) символов
- CODE:00517582 cmp eax, 10h
- CODE:00517585 jl short loc_51759B
- CODE:00517587 mov eax, [ebp+var_4]
- ; Вторая проверка - первый символ серийника должен быть "4"
- CODE:0051758A cmp byte ptr [eax], 34h
- CODE:0051758D jnz short loc_51759B
- CODE:0051758F mov eax, [ebp+var_4]
- ; Следующий большой этап проверки
- CODE:00517592 call sub_5169D0
- CODE:00517597 test al, al
- CODE:00517599 jnz short loc_51759F
- CODE:0051759B loc_51759B:
- CODE:0051759B xor ebx, ebx
- CODE:0051759D jmp short loc_5175A1
- CODE:0051759F ; ----------------------------------------
- CODE:0051759F loc_51759F:
- CODE:0051759F mov bl, 1
- CODE:005175A1 loc_5175A1:
- ; Серийник правильный?
- CODE:005175A1 test bl, bl
- CODE:005175A3 jz short loc_5175D5
- ; Дополнительно проверить тип лицензии
- CODE:005175A5 mov eax, [ebp+var_4]
- CODE:005175A8 call sub_516FC8
- CODE:005175AD test al, al
- ; Тип лицензии LITE
- CODE:005175AF jnz short loc_5175D9
- CODE:005175B1 mov eax, [ebp+var_4]
- CODE:005175B4 call sub_5170E0
- CODE:005175B9 test al, al
- ; Тип лицензии STUDIO
- CODE:005175BB jnz short loc_5175D9
- CODE:005175BD mov eax, [ebp+var_4]
- CODE:005175C0 call sub_5171F8
- CODE:005175C5 test al, al
- ; Тип лицензии PRO
- CODE:005175C7 jnz short loc_5175D9
- CODE:005175C9 mov eax, [ebp+var_4]
- ; Еще какая-то проверка, до которой дело, скорее всего, даже не дойдет
- CODE:005175CC call sub_5173BC
- CODE:005175D1 test al, al
- CODE:005175D3 jnz short loc_5175D9
- CODE:005175D5 loc_5175D5:
- ; Введенный серийник неправильный
- CODE:005175D5 xor eax, eax
- CODE:005175D7 jmp short loc_5175DB
- CODE:005175D9 ; -----------------------------------------
- CODE:005175D9 loc_5175D9:
- ; Серийный номер правильный
- CODE:005175D9 mov al, 1
- CODE:005175DB loc_5175DB:
- CODE:005175DB mov ebx, eax
- CODE:005175DD xor eax, eax
- CODE:005175DF pop edx
- CODE:005175E0 pop ecx
- CODE:005175E1 pop ecx
- CODE:005175E2 mov fs:[eax], edx
- CODE:005175E5 push offset loc_5175FA
- CODE:005175EA loc_5175EA:
- CODE:005175EA lea eax, [ebp+var_4]
- CODE:005175ED call @System@@LStrClr$qqrpv
- CODE:005175F2 retn
Code (Assembler) : Убрать нумерацию
- CODE:005169D0 push ebp
- CODE:005169D1 mov ebp, esp
- CODE:005169D3 xor ecx, ecx
- CODE:005169D5 push ecx
- CODE:005169D6 push ecx
- CODE:005169D7 push ecx
- CODE:005169D8 push ecx
- CODE:005169D9 push ebx
- CODE:005169DA push esi
- CODE:005169DB mov [ebp+var_4], eax
- CODE:005169DE mov eax, [ebp+var_4]
- CODE:005169E1 call @System@@LStrAddRef$qqrpv
- CODE:005169E6 xor eax, eax
- CODE:005169E8 push ebp
- CODE:005169E9 push offset loc_516A6D
- CODE:005169EE push dword ptr fs:[eax]
- CODE:005169F1 mov fs:[eax], esp
- CODE:005169F4 lea eax, [ebp+var_4]
- CODE:005169F7 call sub_5161D4
- CODE:005169FC xor ebx, ebx
- CODE:005169FE mov eax, [ebp+var_4]
- CODE:00516A01 call unknown_libname_92
- CODE:00516A06 mov esi, eax
- CODE:00516A08 cmp esi, 4
- CODE:00516A0B jle short loc_516A52
- CODE:00516A0D lea eax, [ebp+var_8]
- CODE:00516A10 push eax
- CODE:00516A11 mov ecx, esi
- CODE:00516A13 sub ecx, 4
- CODE:00516A16 mov edx, 1
- CODE:00516A1B mov eax, [ebp+var_4]
- CODE:00516A1E call @System@@LStrCopy$qqrv
- CODE:00516A23 lea eax, [ebp+var_C]
- CODE:00516A26 push eax
- CODE:00516A27 mov edx, esi
- CODE:00516A29 sub edx, 3
- CODE:00516A2C mov ecx, 4
- CODE:00516A31 mov eax, [ebp+var_4]
- CODE:00516A34 call @System@@LStrCopy$qqrv
- CODE:00516A39 lea edx, [ebp+var_10]
- CODE:00516A3C mov eax, [ebp+var_8]
- ; Вызвать функцию подсчета контрольного значения
- CODE:00516A3F call sub_516910
- CODE:00516A44 mov edx, [ebp+var_10]
- CODE:00516A47 mov eax, [ebp+var_C]
- ; Сравнить контрольную строку с последними 4 символами серийника
- CODE:00516A4A call @System@@LStrCmp$qqrv
- ; Установить результат сравнения в BL
- CODE:00516A4F setz bl
- CODE:00516A52 loc_516A52:
- CODE:00516A52 xor eax, eax
- CODE:00516A54 pop edx
- CODE:00516A55 pop ecx
- CODE:00516A56 pop ecx
- CODE:00516A57 mov fs:[eax], edx
- CODE:00516A5A push offset loc_516A74
- CODE:00516A5F loc_516A5F:
- CODE:00516A5F lea eax, [ebp+var_10]
- CODE:00516A62 mov edx, 4
- CODE:00516A67 call @System@@LStrArrayClr$qqrpvi
- CODE:00516A6C retn
- CODE:00516A6D loc_516A6D:
- CODE:00516A6D jmp unknown_libname_76
- CODE:00516A72 jmp short loc_516A5F
- CODE:00516A74 ; -----------------------------------------------
- CODE:00516A74 loc_516A74:
- CODE:00516A74 mov eax, ebx
- CODE:00516A76 pop esi
- CODE:00516A77 pop ebx
- CODE:00516A78 mov esp, ebp
- CODE:00516A7A pop ebp
- CODE:00516A7B retn
Code (Assembler) : Убрать нумерацию
- CODE:00516910 push ebp
- CODE:00516911 mov ebp, esp
- CODE:00516913 push ecx
- CODE:00516914 push ebx
- CODE:00516915 push esi
- CODE:00516916 mov esi, edx
- CODE:00516918 mov [ebp+var_4], eax
- CODE:0051691B mov eax, [ebp+var_4]
- CODE:0051691E call @System@@LStrAddRef$qqrpv
- CODE:00516923 xor eax, eax
- CODE:00516925 push ebp
- CODE:00516926 push offset loc_5169C1
- CODE:0051692B push dword ptr fs:[eax]
- CODE:0051692E mov fs:[eax], esp
- CODE:00516931 lea eax, [ebp+var_4]
- CODE:00516934 call sub_5161D4
- CODE:00516939 mov eax, [ebp+var_4]
- CODE:0051693C call unknown_libname_92
- CODE:00516941 mov ebx, 1
- CODE:00516946 cmp eax, 1
- CODE:00516949 jl short loc_51695F
- ; Получить число из символов серийника
- CODE:0051694B loc_51694B:
- CODE:0051694B mov edx, [ebp+var_4]
- CODE:0051694E movzx edx, byte ptr [edx+eax-1]
- CODE:00516953 imul edx, ebx
- CODE:00516956 add edx, eax
- CODE:00516958 mov ebx, edx
- CODE:0051695A dec eax
- CODE:0051695B test eax, eax
- CODE:0051695D jnz short loc_51694B
- ; Привести число к четырехсимвольному значению
- CODE:0051695F loc_51695F:
- CODE:0051695F mov eax, ebx
- CODE:00516961 cdq
- CODE:00516962 xor eax, edx
- CODE:00516964 sub eax, edx
- CODE:00516966 mov ebx, eax
- CODE:00516968 cmp ebx, 1869Fh
- CODE:0051696E jge short loc_516981
- CODE:00516970 loc_516970:
- CODE:00516970 mov eax, ebx
- CODE:00516972 shl eax, 4
- CODE:00516975 add eax, ebx
- CODE:00516977 mov ebx, eax
- CODE:00516979 cmp ebx, 1869Fh
- CODE:0051697F jl short loc_516970
- CODE:00516981 loc_516981:
- CODE:00516981 cmp ebx, 270Fh
- CODE:00516987 jle short loc_51699D
- CODE:00516989 loc_516989:
- CODE:00516989 mov eax, ebx
- CODE:0051698B mov ecx, 9
- CODE:00516990 cdq
- CODE:00516991 idiv ecx
- CODE:00516993 mov ebx, eax
- CODE:00516995 cmp ebx, 270Fh
- CODE:0051699B jg short loc_516989
- CODE:0051699D loc_51699D:
- CODE:0051699D mov ecx, esi
- CODE:0051699F mov edx, 4
- CODE:005169A4 mov eax, ebx
- ; Преобразовать число в строку
- CODE:005169A6 call sub_516134
- CODE:005169AB xor eax, eax
- CODE:005169AD pop edx
- CODE:005169AE pop ecx
- CODE:005169AF pop ecx
- CODE:005169B0 mov fs:[eax], edx
- CODE:005169B3 push offset loc_5169C8
- CODE:005169B8 loc_5169B8:
- CODE:005169B8 lea eax, [ebp+var_4]
- CODE:005169BB call @System@@LStrClr$qqrpv
- CODE:005169C0 retn
- CODE:005169C1 loc_5169C1:
- CODE:005169C1 jmp unknown_libname_76
- CODE:005169C6 jmp short loc_5169B8
- CODE:005169C8 loc_5169C8:
- CODE:005169C8 pop esi
- CODE:005169C9 pop ebx
- CODE:005169CA pop ecx
- CODE:005169CB pop ebp
- CODE:005169CC retn
Небольшое лирическое отступление. Вот так выглядит функция очистки серийника от всех не-цифр. Интересный код, ни разу такого не встречал.
Code (Assembler) : Убрать нумерацию
- CODE:005161D4 push ebx
- CODE:005161D5 push esi
- CODE:005161D6 mov esi, eax
- CODE:005161D8 mov eax, [esi]
- CODE:005161DA call unknown_libname_92
- CODE:005161DF mov ebx, eax
- CODE:005161E1 cmp ebx, 1
- CODE:005161E4 jl short loc_516205
- CODE:005161E6 loc_5161E6:
- CODE:005161E6 mov eax, [esi]
- CODE:005161E8 mov al, [eax+ebx-1]
- CODE:005161EC add al, 0D0h
- CODE:005161EE sub al, 0Ah
- CODE:005161F0 jb short loc_516200
- CODE:005161F2 mov eax, esi
- CODE:005161F4 mov ecx, 1
- CODE:005161F9 mov edx, ebx
- CODE:005161FB call @System@@LStrDelete$qqrv
- CODE:00516200 loc_516200:
- CODE:00516200 dec ebx
- CODE:00516201 test ebx, ebx
- CODE:00516203 jnz short loc_5161E6
- CODE:00516205 loc_516205:
- CODE:00516205 pop esi
- CODE:00516206 pop ebx
- CODE:00516207 retn
Code (Assembler) : Убрать нумерацию
- mov esi,szString ; Исходная строка
- mov edi,szFiltered ; Отфильтрованная строка
- @@:
- lodsb
- or al,al
- jz @f
- mov ah,al
- add ah,(256-'0') ; Начальный символ интервала
- sub ah,10 ; Длина интервала
- jnb @b
- stosb
- jmp @b
- @@:
- stosb
Программа успешно зарегистрирована
Программа благодарит за регистрацию, сразу же стали видны изменения в окне "О программе" и в заголовке главного окна.
Программа успешно зарегистрирована
Программа зарегистрирована на PRO-лицензию, все ограничения сняты. При желании можно написать кейген, после разбора тут уже ничего сложного. Но будьте предельно аккуратны! После успешного ввода серийного номера программа открывает браузер, куда передает имя компьютера, серийник, дату регистрации и прочую персональную информацию. Ни в коем случае нельзя ей позволять этого делать.
Просмотров: 1078 | Комментариев: 2
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(01.06.2022 в 21:09):
coldun, это примерно как рассказывать музыканту, что одну песню о любви уже написали :)
coldun
(01.06.2022 в 18:36):
<При желании можно написать кейген, ...>
Так давно уж есть, с 16-го года как... ;)
Так давно уж есть, с 16-го года как... ;)
Добавить комментарий
Заполните форму для добавления комментария