2013-04-27 60 views
4

我试图用反编译器“破解”我自己的应用程序。 我可以清楚地看到函数名称和许多参数名称。C++ VS2010将我的代码编译成几乎可读的代码

因此,我认为我以某种方式编译调试信息与我的代码,虽然它设置为发布。

此外,该编译器告诉我之类的东西

MYLIB.LIB(vq.obj):警告LNK4099:PDB “vc100.pdb” 不与发现 “MYLIB.LIB(vq.obj)” 或者“ M:\ MYAPP \发布\ vc100.pdb“;对象将被链接,就好像调试信息不​​可用一样。

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

此外,我的解决方案由3个项目导致编译形式的3个DLL。

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

有人可以告诉我如何让dll少调试,以及如何“使用”DLL中的dll函数而不是1 dll中的所有函数。我希望我能解释得很好。

回答

5

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

是的,它意味着你正在链接你的DLL与调试信息。你可以通过设置链接器 - >调试 - >生成调试信息来禁用它。不过,请注意,这个选项不会(近似)影响你的dll文件,但它会切换生成pdb文件。

有两种类型的实体,它的名字将被明确地存储在DLL文件:

  • 接口功能
  • 态类名

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

但是,您可以禁用第二个。只有启用RTTI时,多态类名称才是必需的。这就是你如何做dynamic_casttypeid。如果您不需要这些功能,可以通过转到C/C++ - >语言 - >启用运行时类型信息来禁用RTTI并将其设置为否。请参阅Remove C++ class names from binary dll file

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

+0

通过“接口函数”,我假设你的意思是导出函数。你*可以*给他们真正的短名称,或者在.DEF文件的EXPORTS部分重新命名它们,并且可以选择通过序号导入它们。 – 2013-04-27 07:35:39

+0

“按顺序导入它们”?我不知道这个功能。你能否回答一下细节? – Mikhail 2013-04-27 07:38:46

+2

例如,请参阅http://blogs.msdn.com/b/peterrosser/archive/2006/02/22/exporteddllfunctions.aspx – 2013-04-27 07:40:08