c++ - 如何将对非托管 dll 的访问限制为仅特定的第 3 方(拒绝所有其他人的访问)?

标签 c++ security dll

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

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

最佳答案

最终,您无法阻止下定决心的人,但您可以做一些事情让未经授权的用户生活困难。

显而易见的是加密(至少大部分)DLL 中的代码。有一个入口点,用户必须调用该入口点才能获得(例如)指向实际函数的指针表。当调用入口点时,必须提供一个 key ,用于解密其余内容,然后返回指针。如果用户提供了错误的 key ,他们会得到指针,但数据不会被正确解密,因此当他们尝试调用它时,它不起作用。

这无论如何都不是万无一失的。仅举一个明显的例子,如果有人在调试器下运行授权程序,他们可以看到传递了什么 key ,并简单地重新使用它。如果你想让攻击者的生活变得有点棘手,你可以做一些事情,比如让 DLL 对可执行文件执行校验和,并将其用作 key (用户必须嵌入一些数据才能获得校验和正确)。这仍然可以弄清楚,但至少需要一些工作。

编辑:确切的加密并不重要。我可能会使用 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 的实际函数作为该“对象”的“成员函数”。

就获取校验和而言,我还没有仔细考虑过它。基本上只需要存储可执行文件的地址。您可以使用 VirtualQuery 遍历模块,也可以使用 GetModuleHandle(NULL)。

关于c++ - 如何将对非托管 dll 的访问限制为仅特定的第 3 方(拒绝所有其他人的访问)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7720349/

相关文章:

javascript - 通过JavaScript或者dll或者jar文件获取客户端信息?

c# - 如何处理非托管dll和C#之间的内容

c++ - 在 C++ 成员函数中使用 "Static"关键字限制访问

java - 如何传递 SSL keystore 密码?

java - 如何在应用程序中为所需页面实现 HTTPS?

.net - dll旁边的xml文件的用途是什么?

c++ - CRC计算输出

c++ - 为什么 CMake 生成的 Makefile 找不到外部库?

c++ - C++中的对象创建和成员声明

java - 如何从部署到 Websphere 6.1 的 EJB 访问身份验证别名