4

我试图使用反编译器“破解”我自己的应用程序。我可以清楚地看到函数名称和许多参数名称。

因此,我认为我以某种方式使用我的代码编译调试信息,尽管它设置为 Release。

此外,编译器告诉我类似的事情

mylib.lib(vq.obj):警告 LNK4099:在“mylib.lib(vq.obj)”或“M:\myapp\Release\vc100.pdb”中找不到 PDB“vc100.pdb”;对象将被链接,就好像没有可用的调试信息一样。

这是 VC 试图包含一些调试信息的暗示吗?

此外,我的解决方案包含 3 个项目,生成 3 个编译形式的 dll。

当我“破解” 3 个 dll 之一时,我可以在其中看到另外 2 个 dll 的函数名称。我不知道为什么。

有人可以告诉我如何使 dll 的可调试性降低,以及如何仅“使用”dll 中的 dll 函数而不是 1 dll 中的所有函数。我希望我能解释清楚。

4

1 回答 1

5

这是 VC 试图包含一些调试信息的暗示吗?

是的,这实际上意味着您正在将您的 dll 与调试信息链接起来。您可以通过将 Linker -> Debugging -> Generate Debug Info 设置为 No 来禁用它。但是请注意,此选项不会(大约)影响您的 dll 文件,但它会切换 pdb 文件的生成。

有两种类型的实体,它们的名称将显式存储在 dll 文件中:

  • 接口函数
  • 多态类名

你无法摆脱第一个。任何使用 dll 的人都必须知道,接口函数是如何命名的。

但是,您可以禁用第二个。仅当启用RTTI时,才需要多态类名。这就是你正在做的dynamic_casttypeid。如果您不需要这些功能,可以通过转到 C/C++ -> 语言 -> 启用运行时类型信息并将其设置为否来禁用 RTTI。请参阅从二进制 dll 文件中删除 C++ 类名称

所有其他实体的名称将被编译器剥离。

于 2013-04-27T07:32:39.263 回答