没有导出函数的DLL?

时间:2011-07-05 20:06:57

标签: c++ dll dllexport

我在MS-Office DLL中窥探了一下,我注意到有些DLL没有任何导出功能。我不太明白,应用程序如何在不导出任何函数的情况下使用这些DLL?!

我的意思是,dllmain()确实在LoadLibrary()上执行,但是重点是什么?为什么有人会在没有导出函数的情况下创建DLL?

谢谢! : - )

5 个答案:

答案 0 :(得分:3)

我没有看过有问题的DLL;但有可能像MSOffice这样的东西,微软已经这样做来混淆DLL,使调试/逆向工程更加困难。

但是,正如您所问,您将如何使用这样的DLL?好吧,如果应用程序知道 DLL的布局,那么它可以创建一个带有已知函数地址的函数指针并调用它。

如果你真的想进一步深入挖掘,你可以找到DLL并寻找标准的C / C ++ ABI函数序言& epilogues并且可能解决函数开始的问题。

答案 1 :(得分:3)

处理发往不同语言的程序版本的一种方法是将所有资源放入语言DLL中。 DLL不包含任何代码,只包含已转换为目标语言的资源。当主程序启动时,它需要做的只是加载正确的语言DLL。

答案 2 :(得分:2)

当你调用LoadLibrary时,DLL会调用它的DllMain。 那是DLL入口点。它在进程附加和线程附加上调用。 所以你确实有入口点。

只要它具有至少一个入口点,那么它就可以创建某个界面(例如工厂)的实例,并将其设置为例如TLS变量,其他模块将拾取它们。

所以你可以拥有类似COM的接口系统,除了应用程序之外没有暴露在外面。类似的东西 - 很多变化都是可能的。

答案 3 :(得分:2)

资源

DLL可能具有资源,如字符串表,图像,图标等,由Office的其余部分使用。

答案 4 :(得分:1)

总是有可能他们只是不将它们作为C接口导出。 DLL不是魔术,它只是位和字节,没有任何东西说如果你不向Windows请求它就不能从DLL中获取代码。我相信.NET采用这种方法 - 它们在DLL中保存元数据,告诉CLR其中的内容,而不是通过正常的GetProcAddress方法使.NET函数可用。除非你明确要求它。