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