Delphi: запретить имена меток в исполняемых файлах

Я пишу класс для обработки безопасности в своем исполняемом файле (проверка серийных номеров, проверка даты проверки и т.д.). После компиляции исполняемого файла (даже в сборке Release, при отключении отладки и генерации RTTI), когда я открываю его в NotePad и просматриваю имя метода в необработанных данных, я могу видеть все имена методов, которые собирают мой класс, В базе данных нет опубликованных элементов в любом классе.

Это плохо для защиты. Есть ли способ сказать Delphi не хранить имена методов в исполняемом файле? Почему они хранят их вообще, если нет необходимости в RTTI и нет COM-взрыва? Есть ли опция компилятора, контролирующая это?

Может быть, что ЛЮБОЙ метод ЛЮБОГО класса в исполняемом файле цели хранится внутри исполняемого файла в текстовой форме. По-видимому, это связано с тем, что расширенный RTTI включен по умолчанию для всех классов в Delphi 2010.

Ответы

Ответ 1

Если вы спрашиваете о расширенном RTTI в Delphi 2010, его можно отключить на

{$ RTTI EXPLICIT METHODS ([]) СВОЙСТВА ([]) ПОЛЯ ([])}

см. также docwiki.

Ответ 2

Также переместите ретрансляции, возьмите в файле проекта dpr следующее:

{$IFDEF RELEASE}
  // Leave out Relocation Table in Release version
  {$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
{$ENDIF RELEASE}

Ответ 3

... и не забудьте отключить "td 32 debug info" (в старых версиях) или отладочную информацию на вкладке компоновщика в более поздних версиях.

Ответ 4

То, что вы, вероятно, увидите, - это определение вашей формы в качестве ресурса (например, двоичная репрезентация файлов DFM вашего проекта).

Если вы не хотите показывать их (для экранной информации и т.д.), вы должны создавать эти формы "в коде". Например, создайте TForm, поместите на него TButton и TEdit, присоедините обработчики событий в коде.

Чтобы сделать это ручным способом: начните с формы и создайте DFM. При изменении формы выберите "Просмотр" в виде текста из контекстного меню, и вы узнаете, что нужно скопировать в код. И убедитесь, что НЕ размещать какие-либо varaiablerefernces в опубликованном (всегда ставьте public/protected/private как первую строку в определении вашего класса.