3.1.简介
父进程欺骗技术是说,把一个恶意进程的 PID指定为一个合法的进程(lsass.exe)的 PID。
安全软件会通过对父子进程间关系的检测来判断该进程是否异常,攻击者以此技术规避启发式检测等防御手段。
3.2.原理
父进程欺骗用的最多的方法就是通过 C r e a t e P r o c e s s textcolor{cornflowerblue}{CreateProcess} CreateProcess函数实现,其原型如下:
要执行的模块的名称。 该模块可以是基于 Windows 的应用程序。 如果适当的子系统在本地计算机上可用,它可以是某种其他类型的模块。
该字符串可以指定要执行的模块的完整路径和文件名,也可以指定部分名称。 在部分名称的情况下,该函数使用当前驱动器和当前目录来完成规范。 该函数不会使用搜索路径。 该参数必须包含文件扩展名; 假定没有默认扩展名。
lpApplicationName 参数可以是 NULL 。 在这种情况下,模块名称必须是 lpCommandLine字符串中第一个以空格分隔的标记。 如果您使用包含空格的长文件名,请使用带引 的字符串来指示文件名的结束位置和参数的开始位置; 否则,文件名不明确。 例如,考虑字符串 “c:programfilessubdirprogramname”。 这个字符串可以用多种方式解释。 系统尝试按以下顺序解释可能性:
- c:程序.exe
- c:程序文件sub.exe
- c:程序文件子目录program.exe
- c:程序文件子目录程序名称.exe
如果可执行模块是 16 位应用程序, lpApplicationName 应该是 NULL 指向的字符串 lpCommandLine 应该指定可执行模块以及它的参数。
要执行的命令行。
此字符串的最大长度为 32,767 个字符,包括 Unicode 终止空字符。 如果 lpApplicationName 为 NULL 的模块名称部分 lpCommandLine 仅限于 MAX_PATH 字符。
此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。 因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。 如果此参数是一个常量字符串,该函数可能会导致访问冲突。
lpCommandLine 。 参数可以为 NULL 在这种情况下,函数使用 lpApplicationName 作为命令行。
一个指针 结构,确定返回的新进程对象的句柄是否可以被子进程继承。 如果 lpProcessAttributes 为 NULL ,则不能继承句柄。
该 lpSecurityDescriptor 成员指定新进程的安全描述符。 如果 lpProcessAttributes 为 NULL 或 lpSecurityDescriptor 为 NULL ,则进程获取默认安全描述符。 进程的默认安全描述符中的 ACL 来自创建者的主令牌。 Windows XP: 进程的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。 这种行为在带有 SP2 的 Windows XP 和 Windows Server 2003 中发生了变化。
一个指针 结构,确定返回的新线程对象的句柄是否可以被子进程继承。 如果 lpThreadAttributes 为 NULL,则不能继承句柄。
该 lpSecurityDescriptor 成员指定主线程的安全描述符。 如果 lpThreadAttributes为 NULL 或 lpSecurityDescriptor 为 NULL,则线程获取默认安全描述符。 线程的默认安全描述符中的 ACL 来自进程令牌。 Windows XP: 线程的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。 这种行为在带有 SP2 的 Windows XP 和 Windows Server 2003 中发生了变化。
如果此参数为 TRUE,则调用进程中的每个可继承句柄都由新进程继承。 如果参数为 FALSE,则不继承句柄。
控制优先级和进程创建的标志。参见下表
常数/值 | 描述 |
---|---|
CREATE_BREAKAWAY_FROM_JOB 0x01000000 | 与作业关联的进程的子进程不与该作业关联。 如果调用进程没有与作业相关联,则此常量无效。 如果调用进程与作业相关联,则作业必须设置 JOB_OBJECT_LIMIT_BREAKAWAY_OK 限制。 |
CREATE_DEFAULT_ERROR_MODE 0x04000000 | 新进程不继承调用进程的错误模式。 相反,新进程获取默认错误模式。 此功能对于在禁用硬错误的情况下运行的多线程 shell 应用程序特别有用。 默认行为是让新进程继承调用者的错误模式。 设置此标志会更改该默认行为。 |
CREATE_NEW_CONSOLE 0x00000010 | 新进程有一个新控制台,而不是继承其父控制台(默认)。 |
CREATE_NEW_PROCESS_GROUP 0x00000200 | 新进程是新进程组的根进程。 进程组包括作为该根进程的后代的所有进程。 新进程组的进程标识符与进程标识符相同,在 lpProcessInformation 参数中返回。 使用进程组 GenerateConsoleCtrlEvent 来启用向一组控制台进程发送 CTRL+BREAK 信 。 如果指定了此标志,则将为新进程组中的所有进程禁用 CTRL+C 信 。 指定,则忽略此标志 CREATE_NEW_CONSOLE 。 |
CREATE_NO_WINDOW 0x08000000 | 该进程是一个在没有控制台窗口的情况下运行的控制台应用程序。 因此,未设置应用程序的控制台句柄。 如果应用程序不是控制台应用程序,或者与 CREATE_NEW_CONSOLE 或 DETACHED_PROCESS 。 |
CREATE_PROTECTED_PROCESS 0x00040000 | 该进程将作为受保护进程运行。 系统限制对受保护进程和受保护进程线程的访问。 有关进程如何与受保护进程交互的更多信息,请参阅 进程安全和访问权限 。 要激活受保护的进程,二进制文件必须具有特殊签名。 此签名由 Microsoft 提供,但目前不适用于非 Microsoft 二进制文件。 目前有四个受保护的进程:媒体基础、音频引擎、Windows 错误 告和系统。 加载到这些二进制文件中的组件也必须经过签名。 多媒体公司可以利用前两个受保护的流程。 有关详细信息,请参阅 受保护媒体路径概述 。 Windows Server 2003 和 Windows XP: 不支持此值。 |
CREATE_PRESERVE_CODE_AUTHZ_LEVEL 0x02000000 | 允许调用者执行绕过通常会自动应用于进程的进程限制的子进程。 |
CREATE_SECURE_PROCESS 0x00400000 | 此标志允许在基于虚拟化的安全环境中运行的安全进程启动。 |
CREATE_SEPARATE_WOW_VDM 0x00000800 | 此标志仅在启动基于 Windows 的 16 位应用程序时有效。 如果设置,新进程将在专用虚拟 DOS 机 (VDM) 中运行。 默认情况下,所有基于 Windows 的 16 位应用程序作为线程在单个共享 VDM 中运行。 单独运行的好处是崩溃只会终止单个 VDM; 在不同 VDM 中运行的任何其他程序继续正常运行。 此外,在单独的 VDM 中运行的基于 Windows 的 16 位应用程序具有单独的输入队列。 这意味着如果一个应用程序暂时停止响应,不同 VDM 中的应用程序将继续接收输入。 单独运行的缺点是这样做需要更多的内存。 仅当用户请求 16 位应用程序应在其自己的 VDM 中运行时,才应使用此标志。 |
CREATE_SHARED_WOW_VDM 0x00001000 | 该标志仅在启动基于 Windows 的 16 位应用程序时有效。 如果 WIN.INI 的 Windows 部分中的 DefaultSeparateVDM 开关为 TRUE ,则此标志将覆盖该开关。 新进程在共享的虚拟 DOS 机中运行。 |
CREATE_SUSPENDED 0x00000004 | 新进程的主线程以挂起状态创建,直到 调用 ResumeThread 函数才运行。 |
CREATE_UNICODE_ENVIRONMENT 0x00000400 | 如果设置了这个标志,lpEnvironment 使用 Unicode 字符。 否则,环境块使用 ANSI 字符。 |
DEBUG_ONLY_THIS_PROCESS 0x00000002 | 调用线程启动并调试新进程。 接收所有相关的调试事件 WaitForDebugEvent 函数 |
DEBUG_PROCESS 0x00000001 | 调用线程启动并调试新进程和新进程创建的所有子进程。 接收所有相关的调试事件 WaitForDebugEvent 函数 使用 DEBUG_PROCESS 成为调试链的根。 这一直持续到使用 DEBUG_PROCESS 。 如果此标志与 DEBUG_ONLY_THIS_PROCESS ,则调用者仅调试新进程,而不调试任何子进程。 |
DETACHED_PROCESS 0x00000008 | 对于控制台进程,新进程不会继承其父控制台(默认)。 新进程可以稍后调用 AllocConsole 函数来创建控制台。 有关更多信息,请参阅 创建控制台 。 此值不能与 CREATE_NEW_CONSOLE 。 |
EXTENDED_STARTUPINFO_PRESENT 0x00080000 | 该进程是使用扩展启动信息创建的; lpStartupInfo参数 指定一个 STARTUPINFOEX 结构。 Windows Server 2003 和 Windows XP: 不支持此值。 |
INHERIT_PARENT_AFFINITY 0x00010000 | 该进程继承其父进程的亲和性。 如果父进程在多个处理器组,则新进程将继承父进程使用的任意组的组相对亲和性。 Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 不支持此值。 |
C r e a t e P r o c e s s textcolor{cornflowerblue}{CreateProcess} CreateProcess用于创建一个新进程,默认情况下由父进程创建。该函数的 lpStartupInfo参数允许调用者设定父进程,所以这就是用来实现父进程欺骗的关键点。 顺 便 说 一 句 , 该 功 能 最 初 用 于 W i n d o w s V i s t a 中 设 置 U A C 的 。 textcolor{green}{顺便说一句,该功能最初用于 Windows Vista中设置UAC的。} 顺便说一句,该功能最初用于WindowsVista中设置UAC的。
lpStartupInfo参数中有个 lpAttributeList属性,该属性可通过调用函数 I n i t i a l i z e P r o c T h r e a d A t t r i b u t e L i s t textcolor{cornflowerblue}{InitializeProcThreadAttributeList} InitializeProcThreadAttributeList进行初始化,并调用 U p d a t e P r o c T h r e a d A t t r i b u t e textcolor{cornflowerblue}{UpdateProcThreadAttribute} UpdateProcThreadAttribute函数给lpAttributeList属性添加 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS标志即可实现父进程欺骗。
3.3.代码
3.4.演示
3.5.最后
最后想说说进程树。通过这种修改父进程的方式,可以以 notepad.exe为根节点,cmd.exe或者其他进程为子节点,
最后可以形成如下的树形结构:
-
notepad.exe是整棵树的根节点,也是 cmd.exe和 calc.exe的父进程;同理,cmd.exe是 calc.exe和 cmd.exe的父进程,calc.exe是 cmd.exe和 cmd.exe的父进程。
-
如果以结束进程树的方式结束 notepad.exe进程,则整棵树下的所有子节点和叶子节点的进程都会被结束,如果一普通结束进程的方式结束 notepad.exe进程,则下面的进程不会被结束。
-
如果以普通结束进程的方式结束树中某个节点的进程,进程树的连接性就会被破坏,例如这种情形:
- 对应的树形结构:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!