Приемы, облегчающие работу противника. Часть 4.
Библиотечные функции могут импортироваться и экспортироваться не только по имени (by name), но и по номеру (by ordinal). Это позволяет вообще исключить соответствующие имена из программы и библиотек.
Однако никогда не помешает в готовых исполняемых файлах выполнить поиск текстовых строк, содержащих названия важных для защиты функций — никогда нельзя быть уверенным, что компилятор или редактор связей нигде не оставил важных имен.
Некоторые широко распространенные языки программирования в процессе компиляции преобразуют исходный текст в так называемый псевдокод — некоторое промежуточное представление текста программы, не являющееся машинным кодом. К таким языкам можно отнести Clipper, C#, FoxPro, инсталляционные сценарии InstallShield, Java, Maplnfo Map Basic, MicroStation
Теоретически использование виртуальной машины может являться эффективным способом противодействия исследованию программы, т. к. до начала анализа алгоритма необходимо разобраться с устройством виртуальной машины. Но это справедливо только для ситуации, когда система команд, применяемая машиной, нигде и никем не была описана, т. е. является уникальной.
Очевидно, что для популярных языков программирования это совершенно не так. Для некоторых языков (например С#, Java и Python) в Интернете нетрудно найти подробное описание того, как кодируется та или иная операция, поддерживаемая виртуальной машиной. А интерпретатор языка Python вообще распространяется в исходных текстах, что не позволяет сохранять устройство виртуальной машины в тайне.