Полиморфный код как средство защиты ShareWare
Автор: p_kolya
В мире существует много условно-бесплатных программ, их автора заботятся о них, пишут защиты от кряков...но все равно встречаются люди способные взломать программу. Взломать возможно все. Но тогда как защитится? Ok, будет защишаться так, чтобы просто замедлить процесс взлома. Защит много, большиство из них ломаются заменой 1-2 байтов в коде. Я тебе предлагаю использовать полиморфизм в защите. Новичку сломать будет очень тяжело да и продвинутому крякеру будет над чем подумать.
Так в чем же заключается защита? И кто такой полиморфизм? Защита заключается в полиморфизме( изменчивости ) кода. Вобще я предлагаю делать так:
- Определенный код (пусть функция которая доступна только в зарегистрированной версии) шифруется по определенному паролю, но перед этим вычисляется CRC оригинала и сохраняется. Код шифруется прямо в проге.
- При запуске программа спрашивает у пользоватеся сериальный ключ. По определенному алгоритму прога пытается восстановить из него ключ расшифровки.
- Какой-бы не получился ключ, кусок кода расшифровываем и только потом по CRC сравниваем результат с изначальным.
- Если CRC совпадают, то функцию можно использовать, иначе это незарегистрированная версия
Алгоритм думаю понятен? Заметь, ключ расшифровки, оригинальный код в хранить проге ненужно... иначе куда такая защита? Потом, придумай алгоритм получения ключа расшифровки из сериального номера. Например путь будет это сумма всех символов цифр ключа. Это даст тебе разнообразие ключей, которые ты можешь продавать. Вот например номера: 1256 и 3092 равносильны. Конечно, это только пример и за тобой придумать более сложный алгоритм.
Теперь давай немного о полиморфизме. Я тебе не буду приводить пример готовой проги, а только покажу кто такой полиморфизм :) Вот смотри на исходник:
; defend.asm by p_kolya
; ------------------------------------------------------------------------------
; ml /c /coff /Cp defend.asm
; link /subsystem:windows /LIBPATH:c:\masm32\lib /section:.text,rwe defend.obj
; del defend.obj
; ------------------------------------------------------------------------------
option casemap:none
.486
.model flat, stdcall
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
password_key equ 13h
encoded_size equ 3Fh
.code
; точка входа
start:
call encode
call message
invoke ExitProcess, NULL
; шифрование функции message
encode:
mov eax, offset message
xor ebx, ebx
xor_loop:
xor byte ptr [eax], password_key
inc eax
inc ebx
cmp ebx, encoded_size
jne xor_loop
ret
; полиморфная фунция
message:
jmp show_msg
msg_text db "Hello, World!", 0
msg_title db "Thank you for registration", 0
show_msg:
invoke MessageBox, NULL, offset msg_title, offset msg_text, MB_OK
ret
end start
Так как сделано в исходнике делать не надо! Тут ключ расшифровки доступен любому! Это только пример!
Ты думаешь этот код будет работать сразу после того, как ты его откомпилируешь? Ты сильно ошибаешься! Чтобы он работал зашифруй код фунции message. Возьми например HIEW или еще какой hex-редактор. И зашифруй каждый байт кода message обычным XOR-ом с ключом password_key (который равен 13h).
Если что-то всеже не получилось, смотри в аттач. Там рабочий пример есть.
Я выбрал ассемблер, потому как думаю, на нем будет проше показать алгоритм. Да и пригодится он тебе при защите программ! На этом все...удачи тебе!
mailto: p_kolya@narod.ru
website: p_kolya.narod.ru
Скачать исходники:
|