在Windows项目中,我们定义了一个接口类
class Interface {
public:
virtual ~Interface() { }
virtual void func() = 0;
};
和工厂功能
__declspec(dllexport) Interface *construct();
在DLL中。当然,DLL中有Interface
的具体专业化,但我们不会将其导出。不过我们可以在DLL之外使用它。这是如何运作的?由vftable
构造的实例的construct()
由针对未由DLL导出的函数的函数指针组成。这种方法是可接受的还是或多或少是黑客攻击?
答案 0 :(得分:3)
没有必要导出具体类。从Interface指针获得的v表将设置为存储在DLL中的具体v表。其中已经将所有函数指针正确设置为实现方法。所以一旦你得到了v-table指针,那么你就是金色的,可以调用任何具体的方法。与COM比较,除了工厂函数(DllGetClassObject)之外,您永远不会从COM服务器导出任何内容。
你做必须导出construct()函数,外部代码没有任何其他方式可以获取此函数的地址。需要一个查找表,将函数名称映射到函数地址。 DLL的导出表。导出函数和类将条目添加到该导出表。