我想通过在dll文件中按系统时间滚动代码来设计一个简单的安全系统。 DLL将只有一个导出函数,如" bool result()"因此,当调用时,将返回true或false给我的主应用程序。 DLL将动态加载到主应用程序,使用" LoadLibrary(...)"方法及其功能将在之后调用。
但我对黑客和代码安全没有任何了解。
这就是问题:黑客能否看到我在DLL函数中所做的事情,特别是为了决定结果而执行的操作,或者他可以改变我从动态加载的dll返回的结果?
答案 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很小。