我创建了一个非托管C ++ DLL,我想提供给第三方。 DLL将公开发布,但我不希望任何其他人能够调用DLL中的方法。什么是限制访问的好方法?
FWIW - 该DLL将在Mac和Windows上使用。
答案 0 :(得分:1)
任何有权访问dll的人都可以检查它,加载它,并获取指向dll中函数的指针。正如你所说,我不确定你是否严格意味着dll:
FWIW - 该DLL将在Mac和Windows上使用。
Dlls aren't a Mac thing - 它们是运行时加载/链接库的Windows特定实现。所以你是真正的问题,我假设,必须只是限制只为某些第三方访问图书馆。为了实现您的目标,其他一些选择可能更合适:
而不是一个DLL,将所有内容编译成一个monolothic exe。在框上运行该exe作为服务或第二个进程。让第三方通过套接字/命名管道/任何其他形式的进程间通信连接到它。验证服务的用户,以便只有具有正确凭据的第三方软件才能访问该服务。其他人都被拒绝访问。
为第三方应用程序创建帐户。第三方应用程序只能在该帐户登录时运行。将dll(或Mac中的dylib)放在只能访问该帐户的文件夹中。没有其他人可以访问该位置,因此除非以管理员身份运行,否则没有其他应用程序可以运行它。
答案 1 :(得分:1)
最终,你无法阻止那些有决心的人,但你可以做一些事情让未经授权的用户生活困难。
显而易见的是加密(至少大部分)DLL中的代码。有一个用户必须调用的入口点(例如)一个指向实际函数的指针表。当调用入口点时,必须提供密钥并用于解密其余内容,然后返回指针。如果用户提供了错误的密钥,它们会获得指针,但数据将无法正确解密,因此当他们尝试调用它时,它不起作用。
这无论如何都不是万无一失的。仅举一个明显的例子,如果某人在调试器下运行授权程序,他们可以看到传递了什么密钥,并简单地重复使用它。如果你想让攻击者的生活变得有点棘手,你可以做一些事情,比如让DLL对可执行文件执行校验和,并将其作为密钥使用(并且用户必须嵌入一些数据才能获得校验和出右)。这仍然可以解决,但它至少需要一些工作。
编辑:确切的加密并不重要。我可能会使用AES,因为它很容易找到一个实现并且运行速度非常快,因此没有太多理由使用其他东西。
就调用代码的工作原理而言,它将是这样的:
struct functions {
rettype1 (*func1)(args1);
rettype2 (*func2)(args2);
rettype3 (*func3)(args3);
// ...
};
void entry_point(key_type key) {
functions f;
decrypt(data_block);
f.func1 = data_block.offset1;
f.func2 = data_block.offset2;
// ...
return f;
}
在调用代码中,您将初始化类似于:
functions f = entry_point(myKey);
然后调用一个函数就像:
f.whatever(arg1, arg2, arg3);
本质上,你正在重新创建一小块面向对象的编程,让你的入口点返回一个“对象”,DLL的实际功能就是那个“对象”的“成员函数”。 / p>
就校验和而言,我没有详细考虑过它。基本上只是想要存储可执行文件的地址。您可以使用VirtualQuery遍历模块,也可以使用GetModuleHandle(NULL)。