【发布时间】:2013-10-12 02:41:49
【问题描述】:
我在 Windows 上使用 MinGW gcc 构建了一个 dll。我使用 .def 来指定导出的函数并生成 .lib 导入库。然后我使用 strip.exe 去除符号表。我尝试了 objdump,它打印出空符号表。但是当我使用strings.exe时,它仍然可以打印一堆函数和类名。这是一个问题吗?其他人可以根据dll中的名称查询函数吗?
【问题讨论】:
我在 Windows 上使用 MinGW gcc 构建了一个 dll。我使用 .def 来指定导出的函数并生成 .lib 导入库。然后我使用 strip.exe 去除符号表。我尝试了 objdump,它打印出空符号表。但是当我使用strings.exe时,它仍然可以打印一堆函数和类名。这是一个问题吗?其他人可以根据dll中的名称查询函数吗?
【问题讨论】:
阅读 PE,它有地址和名称表。如果您清理名称表,则没有进程能够按名称定位导出的函数,只能通过地址,这是由链接器完成的,但不是动态的: http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
有很多方法可以保护从 dll 导出的函数,但它们都已发布了漏洞利用程序。如果您真的想保护您的函数 - 在所有导出的函数中创建自定义调用约定或签名验证。
【讨论】:
剥离对 dll 所做的只是删除调试符号。它不会从 dll 中删除函数。换句话说,如果有人导入或使用您的 dll,他们只能访问您导出的任何内容。如果您不希望他们能够访问它,请不要导出它。
此外,当您进行发布构建时,如果您启用了 -s 选项,它应该将其剥离。
【讨论】: