我有一个 .Net 应用程序,其中 C++ DLL作为资源嵌入到应用程序中。
当 .Net 应用程序运行时,我会将 C++ DLL 提取到一个临时文件夹中,然后,我的 .Net 代码会立即将 C++ DLL 加载到内存中,并通过互操作调用 C++ 上的函数来使用它。
我担心的是,对于这样的方案,攻击者是否有可能以某种方式(仍然)劫持 C++ DLL 并将其替换为他自己的受损版本?或者是否有可能在 C++ DLL 加载到内存空间后劫持它?
如果是,如何?
我有一个 .Net 应用程序,其中 C++ DLL作为资源嵌入到应用程序中。
当 .Net 应用程序运行时,我会将 C++ DLL 提取到一个临时文件夹中,然后,我的 .Net 代码会立即将 C++ DLL 加载到内存中,并通过互操作调用 C++ 上的函数来使用它。
我担心的是,对于这样的方案,攻击者是否有可能以某种方式(仍然)劫持 C++ DLL 并将其替换为他自己的受损版本?或者是否有可能在 C++ DLL 加载到内存空间后劫持它?
如果是,如何?
攻击者有可能通过击败竞争条件来替换磁盘上的文件。当您将文件写入磁盘时,会出现延迟,直到您调用的加载 DLL 的函数实际从磁盘读取它。攻击者可以反转您的应用程序并找出您放置 DLL 的位置,然后在非休眠线程(甚至可能是多线程)中的应用程序可以不断发送垃圾邮件以查看是否放置了新的 DLL,如果有,请快速替换它.
防止您读取它而不是尽可能快地写入它的另一种方法是在文件上获得一个操作锁,以防止您在关闭 oplock 句柄之前读取它。
其次,如果攻击者与您的进程具有相同的权限级别,他可以轻松篡改您的进程。您不需要附加为调试器或“调试”来将代码注入您的进程。攻击者需要做的就是 OpenProcess 你的进程,WriteProcessMemory 他的 shellcode,然后 CreateRemoteThread 这个 shellcode。
这只是注入代码的一种方式,还有多种方式,您永远无法得到 100% 的保护。回到攻击者是否可以劫持您的 DLL 的问题,他们肯定可以。它们可以覆盖您的 DLL 的一部分以挂钩或执行其他操作。