Появилась мысль, реализовать защитный механизм, путем внедрения в программу, виртуальной машины, исполняющей байт-код. Как мне кажется, это значительно усложнит жизнь кракеру. Ведь чтобы взломать программу, ему прийдется изучить логику работы виртуальной машины. А это довольно сложно и муторно. Для примера, написал классический пример: IF (сериник не совпадает) { MessageBox "Invalid Serial Key" } И откомпилировал этот пример компилятором байт-кода, а линковщиком собрал EXE сборку содержащую смешанный нативный и байт-код. Мне кажется, проанализировать работу этой кодовой каши будет нелегко. У меня пара вопросов к господам кракерам: 1) Насколько трудно/легко пропатчить этот пример. Ну чтобы он не запрашивал серийник, или воспринимал любой номер как правильный? 2) Стоит ли вообще, копать в этом направлении. Переводить кракоопасные ветки программы на virtual machine. Затруднит ли это анализ и реверсинг проги? Серийный номер: 1823782474122314 287662290__vm.rar
Ну это уже не ново - ExeCryptor, VMProtect, StarForce, ASProtect Скорость взлома упирается в скорость написания дизассемблера для конкретной VM. Потом все патчится также как native код.
...Aladdin (hardlock). Имхо, основная задача VM - это не сделать пресловутый jnz @@InvalidPassword размазанным по телу программы, а сделать плоходоступным для "вытаскивания" критичные алгоритмы. Что же до InvalidPassword, так (по-моему) что байт-код, что обычные переменные - все так же точно трейсится с помощью bpm от места ввода в форме до проверки. Вот расчет my_hash(password) имеет смысл доверить VM.
Скорость взлома упирается в скорость написания дизассемблера для конкретной VM. Потом все патчится также как native код. Вот расчет my_hash(password) имеет смысл доверить VM. Значит, если я применю малораспостраненную VM в своей проге. Кракер поковырявшись в ней, пойдет в конце концов пить пиво... Какой смысл мучиться с этой VM, ведь при взломе другой проги этот опыт не пригодится. С VMProtect ситуация другая, этой VM защищается много софта и время для ее изучения, потратить не жалко.
Хмм... Тогда надо написать генератор виртуальных машин, чтобы каждый пак она была разной Да нет, это излишне. Если VM редкоиспользуемая никакой генератор не нужен
_Chingachguk_ Ну, вот алгоритм выводит число 249022032, которое потом сверяется (CompareStringA) с этим же числом, зашитым в прогу Код (Text): ;===================================================================== format pe gui include '%fasminc%\win32a.inc' ;===================================================================== table file 'vm_table' serial db '1823782474122314',0 fmt db '%u',0 message rb 32 ;===================================================================== entry $ mov ecx,serial mov esi,16 mov eax,-1 @@: mov edx,eax xor ebx,ebx mov bl,byte[ecx] and edx,0FFh xor edx,ebx shr eax,8 mov edx,dword[table+edx*4] xor eax,edx inc ecx dec esi jnz @B invoke wsprintf,message,fmt,eax add esp,4*3 invoke MessageBox,0,message,message,0 invoke ExitProcess,0 ;===================================================================== data import library kernel32,'kernel32.dll',\ user32,'user32.dll' include '%fasminc%\apia\kernel32.inc' include '%fasminc%\apia\user32.inc' end data ;===================================================================== 417718280__test.zip
А кейгенится за милую душу, пол-минуты брутфорса и уже первый валидный серийник: ЄYш` Первая буква украинская, вот ASCII хекс 0xAA,0x59,0xF8,0x60, у кого нет украинского, пробуйте через Ctrl+C или Alt %)
Какая идея? Идея была не у меня В проге число 249022032d (т.е. 0ED7C650h), есть таблица, прогоняем цикл возможных комбинаций пока не выпадет джекпот Код (Text): next_serial: ... mov ecx,0-serial_len xor edx,edx xor eax,eax dec eax @@: mov dl,al xor dl,byte [serial+serial_len+ecx] shr eax,8 xor eax,dword [table+edx*4] inc ecx jnz @B cmp eax,0ED7C650h jnz next_serial valid: Серийников просто море: rQC1D[пробел]
А кейгенится за милую душу, пол-минуты брутфорса и уже первый валидный серийник: И не сомневался, что вы за минуту эту прожку сломаете! Думал что просто один байт перехода пропатчите. Но все же, не получил ответа. Байт-код труднее сломать чем native? Кому интересно исходники этого примера с компилером можно скачать тут : http://scriptcom.narod.ru/files/vm.zip Для сборки EXE надо запустить BUILD.BAT
А он там точно есть? Я наверное не знаю, что такое байт-код(с точки зрения процессора), по-этому его там(в отладчике) и не заметил
bogrus ok! Я протормозил - подумал, ты споришь с моим утверждением и дал какой-то опровергающий его код - типа попробуй в нем проследи использование критичных данных.
Да не, я спорить не любитель, просто согласился с твоим мнением после просмотра этой проги, специально ж запятую поставил
А он там точно есть? Я наверное не знаю, что такое байт-код(с точки зрения процессора), по-этому его там(в отладчике) и не заметил Так в отладчике он выглядет как натив? Ну чтож, спасибо автору скрипт-машины, видимо там хороший JIT
parov Так это опять ты jangle Конкурс методов защиты программ Разработка защиты серийными номерами Скоро будем деньги с тебя брать за тестирование защит Ж)
bogrus Очень на то похоже. parov Уважаемый. Мне не нравятся две вещи. 1. Регистрация на форуме под разными именами. 2. Постинг одного и того же на многих форумах. Еще раз что-нибудь из этого повторится - бан.