【问题标题】:Delphi: Prevent method names from appearing in executablesDelphi:防止方法名称出现在可执行文件中
【发布时间】:2010-01-30 16:05:54
【问题描述】:

我正在编写一个类来处理我的可执行文件中的安全性(检查序列号、试用日期检查等)。编译可执行文件后(即使在发布版本中,关闭所有调试和 RTTI 生成),当我在记事本中打开它并在原始数据中搜索方法名称时,我可以看到组装我的类的所有方法的名称.代码库中的任何类中都没有已发布的成员。

这对保护不利。有没有办法告诉 Delphi 不要在可执行文件中存储方法名称?如果不需要 RTTI 且没有 COM 爆炸,为什么还要存储它们?是否有任何编译器选项控制这个?

可能是目标可执行文件中任何类的任何方法都以文本形式存储在可执行文件中。显然这是由于 Delphi 2010 中所有类默认打开扩展 RTTI 造成的。

【问题讨论】:

  • @FractalizeR - 不要采取错误的方式,但如果您将(部分)安全性建立在混淆之上,那么您采取了错误的方法。我对安全性知之甚少,但足以知道您不应该尝试使用自己的“牢不可破”方案。我建议您搜索商业或开源解决方案来处理应用程序的安全方面。
  • 如果您想查看 exe 中保留哪些符号(例如过程和函数名称),一个很好的测试是在 Ida(交互式反汇编程序)中加载 exe:hex-rays.com/idapro 评估和免费软件版本可用。
  • @Lieven 我打算在我的 exe 上使用 Themida 保护器,但即使在这种情况下,也需要从 exe 中消除所有过多的信息以加强保护。

标签: delphi methods delphi-2010 rtti


【解决方案1】:

如果您询问 Delphi 2010 中的扩展 RTTI,可以通过以下方式关闭它

{$RTTI 显式方法([]) 属性([]) 字段([])}

另见docwiki

【讨论】:

  • 我猜你是对的。但是这个选项不能从 GUI 控制吗?如果是 - 那怎么办?
  • AFAIK 增强型 RTTI 没有 GUI 控件。您需要将这些指令添加到每个单元。
【解决方案2】:

同样剥离重定位,在项目的 dpr 文件中占用以下内容:

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

【讨论】:

  • 它在 Delphi 2010 中给出编译器错误。它适用于什么版本?
  • 常量在Windows.pas中声明:IMAGE_FILE_RELOCS_STRIPPED = $0001; { 从文件中删除重定位信息。所以需要在dpr中的uses子句中加入windows单元或者自己声明。
【解决方案3】:

...并且不要忘记关闭“td 32 debug info”(在旧版本中)或在以后的链接器选项卡中关闭调试信息。

【讨论】:

    【解决方案4】:

    您可能会看到作为资源的表单定义(例如项目的 DFM 文件的二进制表示)。

    如果您不想显示这些(用于串行信息屏幕等),您应该“在代码中”创建这些表单。例如,创建一个 TForm,在其上放置一个 TButton 和 TEdit,在代码中附加事件处理程序。

    要以简便的方式执行此操作:从表单开始并创建 DFM。查看表单时,从上下文菜单中选择以文本形式查看,您将知道应该将哪些内容复制到代码中。并确保不要将任何 varaiablerefernces 放在 de published 下(始终将 public/protected/private 作为类定义中的第一行。

    【讨论】:

    • 这不是关于表单,而是关于从 TObject 派生的自定义类。
    • @FraktalizeR:鉴于您之前提供的信息,它可能与嵌入式资源和 RTTI 有关。只有在您后来的更新中,您才提到它是关于新的扩展 RTTI。仍然:资源也泄露了类名,所以我不明白你为什么以这种方式忽略这些信息。没错,这是一种在可执行文件中嵌入类名的方法。
    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 2010-12-11
    • 2012-04-02
    • 1970-01-01
    • 2021-11-14
    • 2021-12-07
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多