Skif, я одно время пытался что-то такое сделать....
Дилетантски, конечно, но все же... Сорри, если повторю то, что было выше, но я все комбинировал. Все было под DOS, так что под винду некоторое может не прокатить...
1. Нужный участок кода забивается мусором или делается непонятным. Помню, когда надо было сгенерировать какое-то число и вывести на экран - оно генерироваось в 7-ричной системе, кажется, чтоб запутать отладку.
2. Если надо защитить exe-шник от дизассемблирования, то самый простой пособ - упаковка несколько раз разными exe-packer'ами типа pklite, lzexe, Diet (это все было еще под DOS, если кто помнит там такие архиваторы
). После каждого раза заголовок упакованного exe-файла правился так, чтобы затереть сигнатуру упаковщика (PkLite писал даже свое название в начале, кажется). В результате получается такая каша, что дизассемблер выдает просто кашу.
3. Можно попробовать перехватить (хм, вызвать?) прерывание 3, которое есть суть точка останова. Дебаггеры, по идее, должны сами его обрабатывать и удивятся неожиданному вмешательству.
4. Раньше были популярны такие программы типа run-time редакторов памяти. Помогало править ресурсы в играх во время игры. Решается просто - нефиг хранить число в открытом виде
. Если у винтовки осталось, например, 3 патрона, то, в первую очередь, будут искаться в адресном пространстве переменные размером не выше WORD со значением 3 (2 байта максимум - "03 00" или "03" - логично, что у винтовки вряд ли будет больше 65k патронов). Таким образом, если программа будет хранить количество патронов, например, сдвинутым даже на 1 байт влево (умноженное на 2), то найти будет в разы труднее.
5. Как уже правильно сказали - привязка к скорости выполнения...
6. Динамическая генерация кода - видел один раз образец - шедевр на ассемблере, который выполнял сам себя и себя же модифицировал в цикле и к 3-му (или 11-му??) циклу получалось то, что уже должно быть... Но это пока напишешь мозги сломаешь
--
Не в тему, но вспомнилась кустарная попытка обнаружить запущенную MSDOS-сессию из под windows: пытаемся прочитать/записать какое-нибудь значение по заведомо чужому адресу памяти. DOS пропустит, винда вывалит исключение