替换dll,监视dll的使用情况

时间:2013-06-28 16:17:03

标签: windows winapi hook

假设我有一个写入文件的控制台应用程序。如果我理解正确,C ++使用一些dll来创建和写入文件。

是否有可能创建一个具有相同名称的dll,具有相同的功能签名,并将这些调用转发给真正的api?应用程序不会看到任何更改,并且可以通知或限制某些调用。

我担心的是 - 应用程序在dll中检查是否有任何安全签名? 是否会与图书馆名称发生冲突?

2 个答案:

答案 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。