如何从Delphi可执行文件中删除包含类型名称的字符串,并为项目全局禁用RTTI?

Jam*_*mie 1 delphi

更新:尽管上面提到:问题已经有了答案,链接问题中的解决方案在Delphi XE6中不起作用

只是注意到使用Delphi生成的所有可执行文件(包括发行版)都包含该可执行文件使用的所有类型的名称以及它们所属的单元的名称.如果您不小心删除RTTI信息,那么它还包含类方法,字段和属性名称.

这些字符串用于什么(特别是在发布版本中)?

有没有办法防止类型和单位名称被写入可执行文件?

重现这一步的步骤:

  1. 创建一个新的Delphi项目.
  2. 定义一个类

    {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
    type TPerson = class
    private
      FName: string;
    public
      constructor Create(Name: string);
      destructor Destroy; override; 
    end;
    
    constructor TPerson.Create(Name: string);
    begin
      inherited Create;
      FName := Name;
    end;
    
    destructor TPerson.Destroy;
    begin
      inherited Destroy;
    end;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建该类的对象,以便引用/使用该类.

    var person: TPerson;
    begin
      person := TPerson.Create('John Doe');
      person.Free;
    end;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在发布模式下编译项目.

  5. 使用十六进制查看器并在可执行文件中搜索类的名称(TPerson).

如何防止类名写入可执行文件?

也:

如何在项目级别删除RTTI,这样就不需要手动遍历每个包含的单元并添加{$ RTTI EXPLICIT METHODS([])PROPERTIES([])FIELDS([])}子句?

我尝试在.dpr文件的顶部添加$ RTTI EXPLICIT METHODS([])PROPERTIES([])FIELDS([])}但这在Delphi XE6中不起作用.

Mic*_*ick 5

Pythia是一个可以混淆用Delphi或C++ Builder创建的二进制文件的程序.

但是,请记住,一个称职的逆向工程师只会因为这种混淆而略微减速,所以我只会用它来防止粗略的篡改/检查.

下载编译的v1.1程序:http://www.the-interweb.com/serendipity/index.php?/ archives/86-Pythia-1.1.html

浏览源代码:https: //github.com/sporst/Pythia

之前: 在此输入图像描述

后: 在此输入图像描述

  • 感谢米克提到毕赤酵母。不幸的是,该项目已有9年历史,无法在Delphi的最新版本中使用,但我将尽力使其正常运行。再次感谢,这是一个很好的起点! (3认同)