假设我有一个写入文件的控制台应用程序。如果我理解正确,C ++使用一些dll来创建和写入文件。
是否有可能创建一个具有相同名称的dll,具有相同的功能签名,并将这些调用转发给真正的api?应用程序不会看到任何更改,并且可以通知或限制某些调用。
我担心的是 - 应用程序在dll中检查是否有任何安全签名? 是否会与图书馆名称发生冲突?
答案 0 :(得分:2)
您不需要创建新的DLL来替换原始DLL,也不应该。这将对整个操作系统产生全球性影响。您应该做的是让您的应用程序使用Detours来挂钩您感兴趣的特定DLL函数。这样,您根本不修改任何DLL,并且操作系统可以正常工作,同时仍然允许您的自定义代码以运行并决定是否调用原始DLL函数。
答案 1 :(得分:0)
是的,完全有可能你已经可以弄清楚功能签名是什么并重新实现它们(嘿,Google已经用Java JRE做了这个:))
你遇到的问题是加载一个具有相同名称的不同dll,尽管完全可以使用固定目录显式执行此操作。你可以加载dll,然后连接它的所有功能。
至少我认为会发生这种情况 - 在同一个过程中有两个同名的dll可能会很麻烦(但我想,不同的路径,一切都好)。
加载dll时通常不会执行安全性,但是MS会对某些.NET程序集执行此操作,但成本是加载它们需要很长时间,因为安全dll所需的解密会导致显着延迟。这就是为什么许多.NET应用程序(尤其是那些使用GAC中安装了dll的应用程序)被认为启动缓慢的原因 - 可能会发生大量的安全检查。
我认为,一般来说,如果某人有足够的权限访问您的计算机来安装dll,他可能会做得更糟。一个技术娴熟的黑客只需用原来的dll取代原来的dll就可以完成上述所有工作 - 然后你就无法在你的系统中看到一个新的,流氓的dll。
如果您有安全意识并担心这种想法,解决问题的正确方法是使用像AIDE这样的入侵检测系统。这将扫描您的计算机并构建一个包含所有文件的数据库,并使用每个文件的安全散列。然后,您定期重新扫描并将结果与原始数据库进行比较:任何更改都将是显而易见的,可以标记为进行调查或忽略为合法更改。许多Linux服务器定期执行此操作,作为其安全加固的一部分。有关详细信息,请转到ServerFault。