动态加载DLL的安全性

时间:2015-09-30 08:48:07

标签: c++

我想通过在dll文件中按系统时间滚动代码来设计一个简单的安全系统。 DLL将只有一个导出函数,如" bool result()"因此,当调用时,将返回true或false给我的主应用程序。 DLL将动态加载到主应用程序,使用" LoadLibrary(...)"方法及其功能将在之后调用。

但我对黑客和代码安全没有任何了解。

这就是问题:黑客能否看到我在DLL函数中所做的事情,特别是为了决定结果而执行的操作,或者他可以改变我从动态加载的dll返回的结果?

4 个答案:

答案 0 :(得分:4)

为了理解和编写好的共享库,重要的是你要了解loader和elf格式的交互方式。

我发现真正有用的文章是Ulrich Depper:

http://www.akkadia.org/drepper/dsohowto.pdf

它提供了对如何加载共享库,如何控制符号可见性,优化等的真正了解。这本身就是一个非常广泛的话题,需要一些时间来理解,但这是值得的。

如果您涉及数据结构和类似内容,甚至还有关于如何使用bloom过滤器,哈希表和其他内容进行查找的解释。

  

黑客能否看到我在DLL函数中所做的事情尤其如此   执行操作以确定结果

他只能看到您导出的符号。 隐藏/导出符号的方法有很多种。 例如:__attribute__((visibility(hidden)))

https://gcc.gnu.org/wiki/Visibility

  

他可以改变我从动态加载的dll返回的结果吗?

如果在实现中正确处理通过共享库公开给api的输入(检查缓冲区溢出等),我猜应​​该没问题。用户可以控制提供给API的输入并影响输出。如果我在这里遗漏了一些东西,那么如果有人可以纠正我就会很棒。

答案 1 :(得分:2)

局外人可以看到所有导出的功能签名(你可以使用depWalker并尝试)。但他们无法看到内部的实施(据我所知)。如果你只是返回true,外人也可以用相同的函数创建自己的DLL,返回true。

可能您可以返回动态生成的代码而不是true或false,并且您可以在加载DLL后验证主exe中的代码。

还有另一种方法可以使用序列号导出DLL中的函数,而不是使用* .def文件的签名。可以看一下。

答案 2 :(得分:1)

这是一个棘手的问题......

基本上黑客无法看到你在DLL中做了什么,因为DLL被加载到应用程序中并且应用程序的内存受到保护(参见here

更重要的是,如果您返回的结果可以预测,例如如果你使用随机数,它们是否可以预测? (您可以阅读有关此here

的更多信息

答案 3 :(得分:0)

他当然可以。特别是如果你的DLL很小。