如何将对非托管dll的访问权限仅限于特定的第三方(拒绝访问所有其他方)?

时间:2011-10-11 00:57:58

标签: c++ security dll

我创建了一个非托管C ++ DLL,我想提供给第三方。 DLL将公开发布,但我不希望任何其他人能够调用DLL中的方法。什么是限制访问的好方法?

FWIW - 该DLL将在Mac和Windows上使用。

2 个答案:

答案 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)。