我在 MS-Office DLL 中窥探了一点,我注意到一些 DLL 没有任何导出函数。我不太明白,应用程序如何在不导出任何函数的情况下使用这些 DLL?!
我的意思是,dllmain() 确实在 LoadLibrary() 上执行,但有什么意义呢?为什么有人会创建一个没有导出函数的 DLL?
谢谢!:-)
我还没有查看有问题的 DLL。但在 MSOffice 之类的东西中,微软可能会这样做来混淆 DLL,从而使其更难以调试/逆向工程。
但是,正如您所问的,您将如何使用这样的 DLL?好吧,如果应用程序知道DLL 的布局,那么它可以使用已知函数的地址创建一个函数指针并调用它。
如果您真的想进一步挖掘,您可以 objdump DLL 并查找标准 C/C++ ABI 函数序言和尾声,并可能找出函数的开始位置。
处理用于不同语言的程序版本的一种方法是将所有资源放入语言 DLL 中。DLL 不包含任何代码,仅包含已翻译成目标语言的资源。当主程序启动时,它所要做的就是加载正确的语言 DLL。
DLL 可能具有其他 Office 使用的资源,如字符串表、图像、图标等。
当您调用 LoadLibrary 时,DLL 会调用其 DllMain。那是DLL入口点。它在进程附加和线程附加上调用。所以你确实有切入点。
只要它至少有一个入口点,它就可以创建某个接口(例如工厂)的实例,并将其设置在其他模块将获取它们的 TLS 变量中。
因此,您可以拥有类似于 COM 的接口系统,这些接口系统除了向应用程序外不暴露于外部。类似的东西 - 许多过度变化是可能的。
他们总是有可能只是不将它们导出为 C 接口。DLL 并不神奇,它只是位和字节,没有什么说如果你不向 Windows 索要它,你就不能从 DLL 中获取代码。我相信 .NET 采用了这种方法——它们将元数据保存在 DLL 中,告诉 CLR 里面有什么,而不是通过普通的 GetProcAddress 方法使 .NET 函数可用。除非你明确要求。