Исследование защиты программы ZMover
Скриншот программы ZMover
ZMover - полезный инструмент, который дает возможность пользователю автоматически устанавливать расположение окон на рабочем столе, менять их размер и позицию, перемещать на нужный монитор, включать режим "поверх всех окон". Как только окно появляется, к нему применяются сохраненные правила. В пробном режиме программа работает всего 30 дней, потом надо будет метнуться в кассу. Или не надо, если прочитаете эту статью.
Забираем с офсайта дистрибутив, устанавливаем, запускаем. Сразу появляется окно с напоминанием о шароварности и предложением оплатить лицензию.
Окно регистрации
Как видим, серийник состоит из двух частей. На ввод левых регистрационных данных программа реагирует следующим сообщением:
Сообщение о неправильной регистрации
Исполняемый файл ничем не упакован, отправляем его в дизассемблер. Строка сообщения обнаруживается в ресурсах под индексом 25224 или 6288h, если представить это число в шестнадцатеричной системе счисления.
Строка сообщения в ресурсах
Поиском по индексу строки сообщения в дизассемблерном листинге обнаруживается следующий код:
Code (Assembler) : Убрать нумерацию
- .text:0042E7F2 mov dword ptr [ebp+Data], 0
- ; Вызывать функцию проверки
- .text:0042E7F9 call sub_437F90
- ; Если EAX=0, то переход на вывод сообщения
- .text:0042E7FE test eax, eax
- .text:0042E800 jz short loc_42E817
- ; Если контрольное значение не равно 5, то переход на вывод сообщения
- .text:0042E802 cmp dword ptr [ebp+Data], 5
- .text:0042E806 jnz short loc_42E817
- .text:0042E808 push [ebp+var_2C]
- .text:0042E80B mov ecx, edi
- .text:0042E80D call sub_42E2B0
- .text:0042E812 jmp loc_42E8DA
- .text:0042E817 ; ---------------------------------------
- .text:0042E817 loc_42E817:
- .text:0042E817 push [ebp+var_2C]
- .text:0042E81A call sub_476693
- .text:0042E81F add esp, 4
- .text:0042E822 mov ebx, eax
- .text:0042E824 mov dword ptr [ebp+Data], ebx
- .text:0042E827 xor esi, esi
- .text:0042E829 call sub_4486F6
- .text:0042E82E mov ecx, [eax+10h]
- .text:0042E831 test ecx, ecx
- .text:0042E833 jz short loc_42E85D
- .text:0042E835 movzx eax, word ptr [ecx]
- .text:0042E838 mov edx, 1
- .text:0042E83D test ax, ax
- .text:0042E840 jz short loc_42E85D
- .text:0042E842 mov ebx, eax
- .text:0042E844 loc_42E844:
- .text:0042E844 movzx eax, bx
- .text:0042E847 lea ecx, [ecx+2]
- .text:0042E84A imul eax, edx
- .text:0042E84D inc edx
- .text:0042E84E add esi, eax
- .text:0042E850 movzx eax, word ptr [ecx]
- .text:0042E853 mov ebx, eax
- .text:0042E855 test ax, ax
- .text:0042E858 jnz short loc_42E844
- .text:0042E85A mov ebx, dword ptr [ebp+Data]
- .text:0042E85D loc_42E85D:
- .text:0042E85D mov eax, ebx
- .text:0042E85F sub eax, esi
- .text:0042E861 cmp eax, 64Dh
- .text:0042E866 jz short loc_42E88D
- .text:0042E868 cmp eax, 643h
- .text:0042E86D jz short loc_42E88D
- .text:0042E86F cmp eax, 65Fh
- .text:0042E874 jz short loc_42E88D
- .text:0042E876 cmp eax, 5F0h
- .text:0042E87B jz short loc_42E88D
- ; Вывести сообщение о неправильном серийном номере
- .text:0042E87D push 0
- .text:0042E87F push 30h
- .text:0042E881 push 6288h
- .text:0042E886 call sub_448009
Отправляем программу в отладчик, ставим точку останова на адрес начала функции проверки, то есть 00437F90. Запускаем программу, повторяем регистрацию. Функция проверки достаточно объемная и разделена на несколько этапов. В пошаговом режиме видим, что серийный номер на проверку передается единой строкой, сперва считается ее длина, она должна быть 16 юникодных символов. Затем проверяется тип каждого символа, они все должны быть цифрами. А вот потом начинается проверка серийника.
Code (Assembler) : Убрать нумерацию
- .text:00437FC8 movzx eax, word ptr [ebx+esi*2-2]
- .text:00437FCD dec esi
- .text:00437FCE push eax
- .text:00437FCF call sub_475506
- .text:00437FD4 add esp, 4
- .text:00437FD7 test eax, eax
- .text:00437FD9 jz loc_438192
- .text:00437FDF test esi, esi
- .text:00437FE1 jnz short loc_437FC8
- .text:00437FE3 movzx esi, word ptr [ebx+1Eh]
- .text:00437FE7 mov ecx, 0Ah
- .text:00437FEC sub esi, 30h
- .text:00437FEF mov eax, esi
- .text:00437FF1 mov [esp+20h+var_C], esi
- .text:00437FF5 imul eax, esi
- .text:00437FF8 cdq
- .text:00437FF9 idiv ecx
- .text:00437FFB add edx, 30h
- .text:00437FFE cmp [ebx+esi*2], dx
- .text:00438002 jnz loc_438192
- .text:00438008 lea eax, [esi+1]
- .text:0043800B mov [esp+20h+var_10], 1
- .text:00438013 cmp eax, 0Fh
- .text:00438016 mov edx, 0FFFFFFF2h
- .text:0043801B mov ecx, edx
- .text:0043801D cmovl ecx, [esp+20h+var_10]
- .text:00438022 add ecx, esi
- .text:00438024 mov esi, 3
- .text:00438029 movzx eax, word ptr [ebx+ecx*2]
- .text:0043802D sub eax, 30h
- .text:00438030 mov [edi], eax
- .text:00438032 lea eax, [ecx+1]
- .text:00438035 cmp eax, 0Fh
- .text:00438038 mov edi, 0FFFFFFF4h
- .text:0043803D cmovl edx, [esp+20h+var_10]
- .text:00438042 add edx, ecx
- .text:00438044 mov ecx, edi
- .text:00438046 lea eax, [edx+3]
- .text:00438049 cmp eax, 0Fh
- .text:0043804C movzx eax, word ptr [ebx+edx*2]
- .text:00438050 cmovl ecx, esi
- .text:00438053 sub eax, 30h
- .text:00438056 mov [esp+20h+var_4], eax
- .text:0043805A lea esi, [ecx+edx]
- .text:0043805D mov edx, edi
- .text:0043805F lea eax, [esi+3]
- .text:00438062 cmp eax, 0Fh
- .text:00438065 mov eax, 3
- .text:0043806A cmovl edx, eax
- .text:0043806D movzx eax, word ptr [ebx+esi*2]
- .text:00438071 add edx, esi
- .text:00438073 lea ecx, [eax+eax*4]
- .text:00438076 movzx eax, word ptr [ebx+edx*2]
- .text:0043807A lea eax, [eax+ecx*2]
- .text:0043807D lea ecx, [eax+eax*4]
- .text:00438080 lea eax, [edx+3]
- .text:00438083 cmp eax, 0Fh
- .text:00438086 mov eax, 3
- .text:0043808B cmovl edi, eax
- .text:0043808E add edi, edx
- .text:00438090 movzx eax, word ptr [ebx+edi*2]
- .text:00438094 lea eax, [eax+ecx*2]
- .text:00438097 cmp eax, 14DBh
- .text:0043809C jnz loc_438192
- .text:004380A2 xor ebp, ebp
- .text:004380A4 mov eax, 10h
- .text:004380A9 nop dword ptr [eax+00000000h]
- .text:004380B0 loc_4380B0:
- .text:004380B0 movzx ecx, word ptr [ebx+eax*2-2]
- .text:004380B5 dec eax
- .text:004380B6 imul ecx, eax
- .text:004380B9 add ebp, ecx
- .text:004380BB test eax, eax
- .text:004380BD jnz short loc_4380B0
- .text:004380BF mov edx, [esp+20h+var_C]
- .text:004380C3 or ecx, 0FFFFFFFFh
- .text:004380C6 mov esi, 0Eh
- .text:004380CB lea eax, [edx+0Eh]
- .text:004380CE cmp eax, 0Fh
- .text:004380D1 cmovl ecx, esi
- .text:004380D4 lea esi, [ecx+edx]
- .text:004380D7 movzx ecx, word ptr [ebx+esi*2]
- .text:004380DB lea eax, [esi-1]
- .text:004380DE sar eax, 1Fh
- .text:004380E1 lea edx, [esi-1]
- .text:004380E4 and eax, 0Fh
- .text:004380E7 imul ecx, esi
- .text:004380EA add edx, eax
- .text:004380EC movzx edi, word ptr [ebx+edx*2]
- .text:004380F0 mov eax, edi
- .text:004380F2 imul eax, edx
- .text:004380F5 add ecx, eax
- .text:004380F7 mov eax, 66666667h
- .text:004380FC sub ebp, ecx
- .text:004380FE imul ebp
- .text:00438100 sar edx, 2
- .text:00438103 mov eax, edx
- .text:00438105 shr eax, 1Fh
- .text:00438108 add eax, edx
- .text:0043810A lea eax, [eax+eax*4]
- .text:0043810D add eax, eax
- .text:0043810F sub ebp, eax
- .text:00438111 add ebp, 30h
- .text:00438114 cmp bp, di
- .text:00438117 jnz short loc_438188
- .text:00438119 xor ebp, ebp
- .text:0043811B mov [esp+20h+var_C], 2
- .text:00438123 xor edi, edi
- .text:00438125 mov [esp+20h+var_8], 1
- .text:0043812D xor esi, esi
- .text:0043812F nop
- .text:00438130 loc_438130:
- .text:00438130 movzx eax, word ptr [ebx+esi*2]
- .text:00438134 push eax
- .text:00438135 call sub_475506
- .text:0043813A add esp, 4
- .text:0043813D test eax, eax
- .text:0043813F jz short loc_438163
- .text:00438141 movzx eax, word ptr [ebx+esi*2]
- .text:00438145 mov ecx, [esp+edi*4+20h+var_C]
- .text:00438149 sub eax, 30h
- .text:0043814C imul ecx, eax
- .text:0043814F cmp ecx, 0Ah
- .text:00438152 lea eax, [ecx-9]
- .text:00438155 cmovl eax, ecx
- .text:00438158 add ebp, eax
- .text:0043815A xor eax, eax
- .text:0043815C test edi, edi
- .text:0043815E setz al
- .text:00438161 mov edi, eax
- .text:00438163 loc_438163:
- .text:00438163 inc esi
- .text:00438164 cmp esi, 10h
- .text:00438167 jl short loc_438130
- .text:00438169 test ebp, ebp
- .text:0043816B jz short loc_438188
- .text:0043816D mov eax, ebp
- .text:0043816F cdq
- .text:00438170 idiv [esp+20h+var_4]
- .text:00438174 mov eax, 0
- .text:00438179 test edx, edx
- .text:0043817B cmovz eax, [esp+20h+var_10]
- .text:00438180 pop esi
- .text:00438181 pop edi
- .text:00438182 pop ebp
- .text:00438183 pop ebx
- .text:00438184 add esp, 10h
- .text:00438187 retn
- .text:00438188 ; ---------------------------------------
- .text:00438188 loc_438188:
- .text:00438188 pop esi
- .text:00438189 pop edi
- .text:0043818A pop ebp
- .text:0043818B xor eax, eax
- .text:0043818D pop ebx
- .text:0043818E add esp, 10h
- .text:00438191 retn
Code (PHP) : Убрать нумерацию
- $serial=array();
- while(true) {
- for($i=0; $i<15; $i++) {
- $serial[$i]=mt_rand(0,9);
- }
- $serial[15]=mt_rand(0,9);
- $serial[$serial[15]]=($serial[15]*$serial[15]%10);
- $v9 = -14;
- $v10 = -14;
- if ( $serial[15] + 1 < 15 ) { $v10 = 1; }
- $v11 = $serial[15] + $v10;
- $v3=$serial[$v11];
- if ($v3!=5) { continue; }
- $v12 = -12;
- if ( $v11 + 1 < 15 ) { $v9 = 1; }
- $v13 = $v11 + $v9;
- $v14 = -12;
- if ( $v13 + 3 < 15 ) { $v14 = 3; }
- $v31 = $serial[$v13];
- if ($v31==0) { continue; }
- $v15 = $v14 + $v13;
- $v16 = -12;
- if ( $v15 + 3 < 15 ) { $v16 = 3; }
- $v17 = $v15 + $v16;
- if ( $v17 + 3 < 15 ) { $v12 = 3; }
- if ((48+$serial[$v17+$v12]) + 10 *
- ((48+$serial[$v17]) + 10*(48+$serial[$v15])) != 5339 ) {
- continue;
- }
- $v18 = 0;
- for($i=0; $i<16; $i++) {
- $v18 += $i * ($serial[$i]+48);
- }
- $v21 = -1;
- if ( $serial[15] + 14 < 15 ) { $v21 = 14; }
- $v22 = ((($v21+$serial[15]-1)>>31)&0xF)+$v21+$serial[15]-1;
- if ((($v18 - ($v22 * ($serial[$v22]+48) + ($v21 + $serial[15]) *
- ($serial[$v21+$serial[15]]+48))) % 10) != $serial[$v22]) {
- continue;
- }
- $v23 = 0;
- $v29 = array(2,1);
- $v24 = 0;
- $v30 = 1;
- $v25 = 0;
- do {
- $v26 = ($serial[$v25] * $v29[$v24]);
- $v27 = $v26 - 9;
- if ( $v26 < 10 ) { $v27 = ($serial[$v25] * $v29[$v24]); }
- $v23 += $v27;
- $v24 = ($v24 == 0);
- $v25++;
- } while ( $v25 < 16 );
- if ($v23) {
- if (!($v23 % $v31)) {
- break;
- }
- }
- }
- echo join('',$serial)."\n";
Программа успешно зарегистрирована
Смотрим в окно "О программе", там пропала надпись о незарегистрированности и счетчик оставшихся дней. При старте больше не появляется наг-окно с предложением покупки, в окне регистрации пропали поля для ввода серийника, перевод системного времени на работоспособность программы не влияет. Цель достигнута.
Просмотров: 1861 | Комментариев: 7
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(07.12.2020 в 16:16):
Плохо искал. Китайский релиз IDA 6.8.150423 на Doskey Lee, Kingsoft Internet Security Software, там все есть. Свой палить не собираюсь, он куплен на организацию.
1
(07.12.2020 в 16:10):
А можно плагин ваш попросить , в рунете нашел но он как то не так работает
user
(04.12.2020 в 11:51):
v7.79 (XP/2003) - Не, под XP/SP2 инсталляция обламывается. Фтопку.
Luna ©orporation
(03.12.2020 в 20:19):
@user,
тут у них
_https://basta.com/zmover#oldversions
крайняя версия v7.79 (XP/2003)
тут у них
_https://basta.com/zmover#oldversions
крайняя версия v7.79 (XP/2003)
user
(03.12.2020 в 13:23):
Да, это так.
Тем болеее, для программ, которые не требуют "установки"
и могут храниться в обычных архивах.
Тем болеее, для программ, которые не требуют "установки"
и могут храниться в обычных архивах.
brute
(03.12.2020 в 09:34):
во всех "исследованиях" дело заканчивется поиском ключа, либо патчем, чтобы подходил любой ключ. В итоге, на каждом компе приходится его "вспоминать". Имхо, лучше искать и патчить "бит проверки", чтобы вылечить навсегда. За пример брутфорсера - спасибо!
user
(02.12.2020 в 22:09):
Версия 8, рассмотренная в статье, работает только в Vista+.
Удалось найти две версии, запускающиеся в WinXP - это v.5.5 и v.7.1.
Алгоритм генерации серийного номера в них такой же, как в этой статье.
Удалось найти две версии, запускающиеся в WinXP - это v.5.5 и v.7.1.
Алгоритм генерации серийного номера в них такой же, как в этой статье.
Добавить комментарий
Заполните форму для добавления комментария