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

某个进程是否有可能以某种方式检测到它是否已被使用Winapi的另一个进程注入?如果是这样,怎么办?

更具体地说,注入代码是否具有“固定/可能”的特征?例如,从这个问题来看,似乎可以通过始终在设置了以下保护标志的页面中显示注入的代码来表征:PAGE_READWRITE_EXECUTE,PAGE_EXECUTE_READ,PAGE_EXECUTE_WRITECOPY和可能(但不太可能)为PAGE_EXECUTE。您能指出注入代码的其他特征吗?

评论

如果注入的代码将页面保护重置为不太可疑的东西怎么办?

@ 0xC0000022L您能举个不那么可疑的例子吗?

#1 楼

注入的代码可以由但不限于:

可以通过多种技术检测远程创建的线程:使用NtQueryProcessInformation进行处理。

对于每个线程,检查其是否从原始可执行文件的地址空间而不是从某些孤立的内存页面运行: br />将第二个参数设置为NtQueryInformationThread


ThreadQuerySetWin32StartAddress-检查线程起始地址是否在每个已加载模块的范围内,并且那些模块是否合法(按已知列表/按路径) )。
也请在此处进行检查。内存保护API(GetModuleInformation),以检测是否有人试图修改您的代码,然后检查“某人”是否属于合法进程地址空间。
通过保留合法loa列表嵌入式模块,还可以从列表中检查进程中的每个线程是否都属于合法模块的地址空间。 >没有线程的已注入代码


检查过程的完整性-根据过程查找各种API的热补丁。注入的代码可能由当前进程内部的某个补丁触发。
如果目标代码属于当前进程,则监视APC创建API(NtQueryProcessInformation)。操作系统的APC也可以被过滤掉。

甚至在合法进程开始运行并放置其保护之前,还有其他方法可以注入代码-使用CreateToolhelp32Snapshot / VirtualProtect / LoadLibrary的组合,理论上可以绕过所有已实现的保护。当您的代码和注入的代码仅在同一环(用户模式)下运行时,一切都取决于谁先获得控制权。寻找代码洞穴方法,并考虑例如将恶意代码注入explorer.exe并启动程序时:-)。对过程中的代码注入进行更可靠的控制并获得良好的保护,但是原因取决于技巧和要保护的内容。

评论


感谢您的回答。我并不是winapi的专家,因此,如果您能从上面的枚举的每个项目中添加一些我可以搜索的API关键字,我将不胜感激。例如,在第二项中,您提到了检查孤立的内存页面。使用winapi如何完成?

–本尼
2014年1月19日20:29

在上面的枚举中,您对多个winapi函数说“ Monitor ... API ...”。您是要通过为所有正在运行的进程挂接那些API还是其他某种方式进行监视?

–本尼
2014年2月4日14:58在

您可以在自己的进程中监视这些API,而无需跨越所有系统。

– PhoeniX
2014年2月5日,9:09

#2 楼

进程可以检测是否存在注入的线程的一种方法是使用线程本地存储。当注入线程时,除非注入器小心地将其禁用,否则将调用主机的线程本地存储回调。如果调用了回调,则主机可以查询新线程的起始地址,并确定它是否在主机的已定义代码区域内(只有主机会知道),请参见“终极”例如,Debugging Tricks论文(http://pferrie.host22.com/papers/antidebug.pdf)。部分以进行注入),它肯定会抓住一些东西。

但是,对您的问题的简短回答实际上是“否”。在所有情况下,流程都无法“知道”已注入了某些东西。在大多数情况下都是“是”,但并非全部。

评论


+1是指很棒的终极反调试技巧:)

– Stolas
2014年1月20日,7:54

感谢您的添加,这是检查代码注入的补充

–本尼
2014年1月20日上午10:20