检测或阻止DLL注入(例如通过CreateRemoteThread)

Dav*_*vid 0 c# winapi

我正在寻找ac#方法添加到我的winforms应用程序,它可以:

一个.检测任何不应存在的已加载模块/ dll.要么,

湾 (优选)完全防止dll注入.我已经阅读了这篇有用的文章,但没有提供实际的代码来防范CreateRemoteThread,SetWindowsHookExCode Cave.

编辑

我在考虑运行代码的后台线程,如下所示.我对这个话题很新,所以请原谅我的天真

    var trustedModules = new[] {"kernel32.dll", "user32.dll", "etc"};

    var intrusionDetected =
        Process.GetCurrentProcess()
            .Modules.Cast<ProcessModule>()
            .Any(module => !trustedModules.Contains(module.FileName.ToLowerInvariant()));

    if (intrusionDetected)
    {
        // do something
    }
Run Code Online (Sandbox Code Playgroud)

jos*_*ley 5

对于A,没有简单的方法可以做到这一点.它本质上是一种检测与消除技术之间的猫捉老鼠游戏.记录它们都超出了SO答案的范围.为了帮助您入门,您需要研究各种技术:

  • 监视线程创建(使用CLR框架在托管应用程序上很难创建可能会在您的背后创建线程).
  • 监控PEB的更改(包括观察加载的模块).
  • 扫描地址空间,查找标有"执行"页面的意外内存页面.
  • 使用调试器检测技术(只是调用Debbugger.IsAttached)
  • 使用代码签名和加密有助于防止对二进制文件进行静态修改或替换.
  • 如果操作系统处于"测试模式"(允许未签名的驱动程序运行),请不要运行.

然后,如果没有任何类型的服务器组件或动态质询响应系统,请注意,如果有足够的时间,您的所有保护措施都可以被取消.

对B的简短回答是Windows操作系统明确支持代码注入,因此没有任何简单的方法可以添加到程序中以防止它.