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

时间:2014-04-27 21:25:43

标签: 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;
    
  3. 创建该类的对象,以便引用/使用该类。

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

  5. 使用十六进制查看器并在可执行文件中搜索类名称(TPerson)。
  6. 如何防止将类名写入可执行文件?

    也:

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

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

2 个答案:

答案 0 :(得分: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

<强> BEFORE: enter image description here

<强> AFTER: enter image description here

答案 1 :(得分:2)

类名存储在可执行文件中,因为需要实现TObject.ClassName

没有简单的方法可以阻止这种情况发生。我可以假设,有一个修改后步骤,修改可执行文件以覆盖可执行文件中的名称。这显然会破坏任何依赖ClassName方法的代码。

另一种选择是混淆。老实说,我不确定恶意黑客能够知道所有程序类的名称会有多大帮助。


您的最新编辑添加了一个新问题:

  

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

在程序语句后立即将其添加到.dpr文件的最顶层:

{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

虽然显然,在.dpr文件中全局执行此操作的能力是无意的。 Delphi XE6“修复”了这种行为:http://qc.embarcadero.com/wc/qcmain.aspx?d=79943

因此,如果您恰好使用XE6,似乎没有全局项目范围来禁用RTTI。