Windows 进程是否可以检查它是否已被另一个进程注入?

逆向工程 视窗 记忆 登录
2021-06-11 07:54:25

有很多教程展示了如何检测注入的代码到进程内存中。但是,这通常需要使用调试器。

一个进程是否有可能以某种方式检测它是否已被另一个进程使用 winapi 注入?如果是这样,如何?

更具体地说,注入代码是否有任何“固定/可能”的特征?例如,从这个问题看来,注入的代码的特点是总是出现在设置了以下保护标志的页面中:PAGE_READWRITE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_WRITECOPY 和可能(但不太可能)PAGE_EXECUTE。你能指出注入代码的其他特征吗?

2个回答

注入的代码可以表示为,但不限于:

可以通过多种技术检测远程创建的线程

  1. 定期检查进程线程是否由当前进程使用NtQueryProcessInformation.
  2. 对于每个线程,检查它是否从原始可执行文件的地址空间运行,而不是从某个孤立的内存页面运行:

    1. NtQueryInformationThread
    2. 将第二个参数设置为 ThreadQuerySetWin32StartAddress
    3. GetModuleInformation - 检查线程起始地址是否在每个加载模块的范围内,并且这些模块是否合法(通过已知列表/通过路径)。
    4. 也请检查这里
  3. 监视当前进程内的线程创建 API,并检查创建 PID 是否属于当前进程 - NtQueryProcessInformation, CreateToolhelp32Snapshot.

  4. 监视内存保护 API ( VirtualProtect) 以检测是否有人试图修改您的代码,然后检查该“某人”是否属于合法进程地址空间。
  5. 通过保留合法加载模块的列表,还可以检查进程中的每个线程是否属于列表中合法模块的地址空间。
  6. 监视LoadLibrary是否有人试图将未知模块加载到您的进程中。

无线程注入代码

  1. 检查流程的完整性 - 查找各种 API 的热补丁,具体取决于流程。注入的代码可能由当前进程中的某个补丁触发。

  2. 如果目标代码属于当前进程,则监视 APC 创建 API ( KiUserApcDispatcher)操作系统的 APC 也可以被过滤掉。

还有其他的方式来注入代码,甚至在合法的进程将开始运行,并把它的保护-利用组合WriteProcessMemory/ GetThreadContext/SetThreadContext理论上可以绕过所有实施保护。当您的代码和注入的代码仅在同一个环(用户模式)中运行时,这一切都取决于谁首先获得控制权。寻找代码洞穴方法并考虑例如何时将恶意代码注入到 explorer.exe 并且您正在启动您的程序:-)。

当然,您可以将驱动程序加载到内核中,这将使您更可靠地控制代码注入到您的进程并提供良好的保护,但原因取决于技能和您要保护的内容。

进程可以检测注入线程存在的一种方法是使用线程本地存储。当一个线程被注入时,主机的线程本地存储回调将被调用,除非注入器小心地禁用它。如果回调被调用,则主机可以查询新线程的起始地址并确定它是否在主机定义的代码区域内(只有主机知道)请参阅我的“终极”反中的线程本地存储部分调试技巧论文 ( http://pferrie.host22.com/papers/antidebug.pdf ) 就是一个例子。

虽然这并不能检测到所有东西(一些恶意软件使用主机现有代码部分中的空腔来执行注入),但它肯定会捕获一些东西。

但是,对您的问题的简短回答实际上是“否”。没有办法让进程在所有情况下“知道”某些东西已经被注入。大多数情况下是“是”,但不是所有情况。