- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果允许加载或不允许加载,而不使用异常,我希望能够从库中进行控制,这意味着在某些情况下,我希望dlopen(“mylib.so”)返回null,并且只有在所有条件都正确的情况下,它才会成功。
很多人都问过我的动机,在我的库中,我多次使用dlopen,我想确保在加载库之前,已经加载了所有需要的组件。
请记住,我必须使用标准解决方案,这意味着我不能使用外部插件或做诸如重写dlopen之类的事情。
最佳答案
据我所知,不,你不能,至少以正常的方式。如果库存在给定的路径,它将被加载。它不是为您自行设计的任何“业务检查”。最多,它将遵守任何文件系统权限/etc,如果进程没有访问该文件的权限,则返回错误,仅此而已。
如果您对将加载库的代码拥有完全控制权,那么像atterson建议的那样包装它并使用dlopen
就完成了。
如果您没有完全控制,那么dlopen2
仍然不会阻止任何人使用原始dlopen2
并绕过检查。您可以尝试使它更智能,例如,让您的dlopen
执行一些可检测的操作,这样,如果库是由dlopen2
而不是dlopen
打开的,则它可以拒绝工作,但是……有人可以伪造“可检测的东西”,然后使用“完成”。然后它归结为使得攻击者很难复制“可检测的东西”。
简单地说,它并不是要做这些事情。如果操作系统允许(~文件系统权限等),它将加载库。
对于任何其他“访问检查”,比如“你有许可证吗?”不?然后走开“你必须在图书馆里实现它。让他们通过dlopen2
加载它,然后让库检查权限,例如,在每次调用它的函数时。请使用异常,或者不执行任何操作并返回空值。或者更好的方法是,您可以使用dlopen
函数(参见https://stackoverflow.com/a/1602459/717732+http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html#INIT-AND-CLEANUP)并在加载lib时执行一次检查。注意,这个函数接受并返回dlopen
,所以仍然没有办法使initialization
失败,但至少库可以有时间禁用它的函数。
关于c++ - 有没有办法使dlopen故意失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50851613/
我是一名优秀的程序员,十分优秀!