Delphi: предотвращение появления имен методов в исполняемых файлах

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

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

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


person Vladislav Rastrusny    schedule 30.01.2010    source источник
comment
@FractalizeR - не поймите это неправильно, но если вы основываете (часть) своей безопасности на обфускации, вы принимаете неправильный подход. Я почти ничего не знаю о безопасности, но достаточно, чтобы знать, что вам не следует пытаться разработать свою собственную «неразрушаемую» схему. Я бы посоветовал вам поискать коммерческое решение или решение с открытым исходным кодом для обеспечения безопасности вашего приложения.   -  person Lieven Keersmaekers    schedule 30.01.2010
comment
Если вы хотите увидеть, какие символы (например, имена процедур и функций) остаются в вашем exe, хорошим тестом будет загрузка exe в Ida (интерактивный дизассемблер): hex-rays.com/idapro.   -  person Remko    schedule 30.01.2010
comment
@Lieven Я планирую использовать Themida Protector поверх своего exe, но даже в этом случае нужно удалить всю лишнюю информацию из exe, чтобы усилить защиту.   -  person Vladislav Rastrusny    schedule 31.01.2010


Ответы (4)


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

{ЯВНЫЕ МЕТОДЫ $ RTTI ([]) СВОЙСТВА ([]) ПОЛЯ ([])}

см. также docwiki.

person kludg    schedule 30.01.2010
comment
Думаю ты прав. Но разве эта опция не управляется из графического интерфейса? Если да - то как? - person Vladislav Rastrusny; 30.01.2010
comment
AFAIK нет графического интерфейса для расширенного RTTI. Вам нужно добавить эти директивы к каждому модулю. - person Jim McKeeth; 30.01.2010

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

{$IFDEF RELEASE}
  // Leave out Relocation Table in Release version
  {$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
{$ENDIF RELEASE}
person Remko    schedule 30.01.2010
comment
Выдает ошибку компилятора в Delphi 2010. Для какой версии он предназначен? - person Vladislav Rastrusny; 01.02.2010
comment
Константа объявлена ​​в Windows.pas: IMAGE_FILE_RELOCS_STRIPPED = $ 0001; {Информация о перемещении удалена из файла. } Таким образом, вам нужно добавить модуль Windows в раздел uses в dpr или объявить его самостоятельно. - person Remko; 01.02.2010

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

person Marco van de Voort    schedule 30.01.2010

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

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

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

person Ritsaert Hornstra    schedule 30.01.2010
comment
Речь идет не о формах, а о пользовательских классах, производных от TObject. - person Vladislav Rastrusny; 30.01.2010
comment
@FraktalizeR: Учитывая информацию, которую вы дали ранее, это могло быть о встроенных ресурсах И RTTI. Только в своем более позднем обновлении вы упомянули, что речь идет о новом расширенном RTTI. Тем не менее: ресурсы также выдают имена классов, поэтому я не могу понять, почему вы отклоняете эту информацию таким образом. Верно, что это метод встраивания имен классов в исполняемый файл. - person Ritsaert Hornstra; 30.10.2010