C++ 从dll中去掉符号

C++ 从dll中去掉符号,c++,c,gcc,mingw,symbols,C++,C,Gcc,Mingw,Symbols,我在windows上使用MingWGCC构建了一个dll。我使用.def来指定导出函数并生成.lib导入lib。然后,我使用strip.exe删除符号表。我尝试了objdump,它打印出空的符号表。但是当我使用strings.exe时,它仍然可以打印一堆函数名和类名。这是个问题吗?其他人是否能够根据dll中的名称查询函数?剥离对dll所做的只是删除调试符号。它不会从dll中删除函数。换句话说,如果有人导入或使用您的dll,他们只能访问您导出的任何内容。如果您不希望他们能够访问它,请不要导出它 此

我在windows上使用MingWGCC构建了一个dll。我使用.def来指定导出函数并生成.lib导入lib。然后,我使用strip.exe删除符号表。我尝试了objdump,它打印出空的符号表。但是当我使用strings.exe时,它仍然可以打印一堆函数名和类名。这是个问题吗?其他人是否能够根据dll中的名称查询函数?

剥离对dll所做的只是删除调试符号。它不会从dll中删除函数。换句话说,如果有人导入或使用您的dll,他们只能访问您导出的任何内容。如果您不希望他们能够访问它,请不要导出它


此外,在执行发布版本生成时,如果启用了-s选项,则应将其剥离。

剥离对dll所做的一切就是删除调试符号。它不会从dll中删除函数。换句话说,如果有人导入或使用您的dll,他们只能访问您导出的任何内容。如果您不希望他们能够访问它,请不要导出它


另外,当您进行发布构建时,如果启用了-s选项,则应该将其剥离。

阅读PE,它有地址和名称表。若清理名称表,则任何进程都无法按名称(仅按地址)定位导出的函数,这是由链接器完成的,但不是动态完成的:


有许多方法可以保护从dll导出的函数的安全,但所有这些方法都发布了漏洞利用。如果您确实想保护您的函数,请在所有导出的函数中创建自定义调用约定或签名验证。

了解PE,它有地址和名称表。若清理名称表,则任何进程都无法按名称(仅按地址)定位导出的函数,这是由链接器完成的,但不是动态完成的:

有许多方法可以保护从dll导出的函数的安全,但所有这些方法都发布了漏洞利用。如果您真的想保护您的函数-在所有导出的函数中创建自定义调用约定或签名验证