Здравствуйте, Vedern, Вы писали:
V>а в программном коде что-то можно сделать?
В современной программе — возможностей очень много. Попробуте проанализируйте 250к машинного кода... (ВАШЕГО КОДА — библиотечный код легко отсеивается) Или, если оно дизассемблировано, то порядка 4 мегов ассемблера. Попа порвется.
Так что, "защит от дизассемблера" для этого совсем не надо. Обьем кода вас защищает. В любом случае, крякер следует за потоком данных — т.е. от момента ввода серийного номера до момента его анализа. Лучше заморочиться на затруднении пути крякера к коду анализа серийника. Простейший для этого способ — хранить данные на хипе.
Причем, перед распределением памяти под "ключевую" информацию, нужно внести в это дело энтропию... То есть, сделать случайное количество пустых распределений и, лучше всего — случайного размера. Короче, чем случайнее, тем лучше. А еще лучше, если те функции из которых вы извлекаете энтропию задействованы но своему прямому назначению...
Второй способ — косвенность. Threads, QueueUserWorkItem, виртуальные вызовы, фабрики классов и тд — чем больше прыжков по коду и косвенных вызовоы — тем лучше. НО... Не забывать про энтропию! Чем СЛУЧАЙНЕЕ, тем ЛУЧШЕ!
Еше одна заповедь: не передавать серийник через глобальную переменную. Только через стек, параметры сообщений, что-угодно, но ТОЛЬКО не ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ! Именно в итоге таких промашек появляется заметка "The author is klever isdiot" в описании кряков...
...А еще лучше, побродите по сети, попытайтесь что-нить сами сломать, подумайте над результатами и придете к одному порстому выводу (известному вот уже 10 лет): сломают все. Вопрос тоьько в том, сколько автор потратил на защиту.
Мораль: не тратьте на нее слишком много... Все равно сломают, если надо... А если не надо, то нафиг она нужна?
__________
16.There is no cause so right that one cannot find a fool following it.