看来使用APC调用的基于驱动程序的注入在MicrosoftEdge及其相关进程(browser_broker.exe , MicrosoftEdgeCP.exe and MicrosoftEdge.exe)上失败。从分配新的可执行内存。

最终,在尝试注入这些进程后不久,它们全部由于以下原因而失败(0xC0000409,ProcessDynamicCodePolicy除外)。 >以上输出是否暗示这是我面临的问题?

是否有任何方法可以从驱动程序中检测到此过程受到保护?

评论

由于您正在寻找驱动程序,并且现有的答案专门针对UM代码,因此可能会在允许的IRQL方面引入限制,因此您可能希望查看Alex Ionescu的文章系列(此处,此处和此处)

@ 0xC0000022L,我知道受保护的进程(只有Microsoft可以授予该进程的权限)与可以使用SetProcessMitigationPolicy自行设置ProcessDynamicCodePolicy的进程之间存在区别。对于第二种类型的进程,我希望从驱动程序中覆盖此位。你知道SetProcessMitigationPolicy是否也可以从内核空间获得吗?

我非常怀疑,因为我认为这与PPL的实施方式不同。我认为,无论哪种方式,您都不会绕过APC来执行一些用户模式代码,这会使您陷入22种情况。实际上,反恶意软件厂商也可以将特定进程标记为PPL,前提是他们拥有ELAM,并且指定的PPL文件已按照ELAM的说明进行了签名。详细信息实际上受NDA约束。

#1 楼


是否有任何方法可以从驱动程序中检测到此过程受保护? 。通常,这可能在将来的Windows OS版本中不起作用。

这是用于检测受保护进程的示例C代码。程序在其第一个参数中接受有效的进程ID。该代码需要与combase.dll库链接。在用户模式下,某些过程可能需要以管理员身份运行此代码。




要添加或更改进程缓解策略标志,程序使用ntdll.lib函数,该函数使用SetProcessMitigationPolicy()函数(从NtSetInformationProcess()检索)。以下是启用动态代码策略的示例C代码。



#include <Windows.h>
#include <winternl.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
    size_t Size;
    PROCESS_BASIC_INFORMATION BasicInfo;
    union {
        unsigned int Flags;
        struct {
            unsigned int IsProtectedProcess : 1;
            unsigned int IsWow64Process : 1;
            unsigned int IsProcessDeleting : 1;
            unsigned int IsCrossSessionCreate : 1;
            unsigned int IsFrozen : 1;
            unsigned int IsBackground : 1;
            unsigned int IsStronglyNamed : 1;
            unsigned int IsSecureProcess : 1;
            unsigned int IsSubsystemProcess : 1;
            unsigned int SpareBits : 23;
        };
    };
} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION; /* size: 0x0040 */

int main(int argc, char *argv[])
{
    if (argc < 2)
        return;

    void *hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, atoi(argv[1]));
    if (hProcess != NULL)
    {
        unsigned int ret;
        PROCESS_EXTENDED_BASIC_INFORMATION pInfo;
        memset(&pInfo, 0, sizeof pInfo);

        NTSTATUS Status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pInfo, sizeof pInfo, &ret);
        if (Status == 0)
            printf("Protected: %d\n", pInfo.IsProtectedProcess);
        CloseHandle(hProcess);
    }
    else
        printf("OpenProcess error: %d\n", GetLastError());
}




任何策略之一可以使用此方法启用。使用KernelBase.dll函数的Zw替代方法在内核模式下使用。所有这些未记录的结构也可以在ProcessHacker / phnt存储库中找到。

评论


嗨,我认为您的方法论涉及揭示受保护的进程-只有Microsoft才能享有该进程的属性,并且也可以使用内核空间中的调用PsIsProtectedProcess进行检测。我正在寻找可以使用SetProcessMitigationPolicy自行设置标志ProcessDynamicCodePolicy的进程。对于那些进程,我希望从驱动程序中覆盖此位。您知道内核空间是否还提供SetProcessMitigationPolicy吗?

–Zohar81
19年8月5日在10:28



@ Zohar81使用SetProcessMitigationPolicy()内部编辑了我的答案。我也不知道这是否适用于PPL或容器化的UWP流程。

– Biswapriyo
19年8月5日在18:29

@ Zohar81如果可以使用NtSetInformationProcess进行设置,则可以认为这是EPROCESS或KPROCESS(可能是前者)的一部分,因此可以在驱动程序内进行操作。我将尝试WinDbg弄清楚结构的外观。通常,ProcessHacker也是此类信息的良好来源。

– 0xC0000022L♦
19年8月6日下午6:00



@ 0xC0000022L是的,EPROCESS中有一个MitigationFlagsValues结构。但是结构太长且易变,无法包含在源代码中。即使它在Windows 10的每一个版本中都非常适用。

– Biswapriyo
19年8月6日在8:42

@Biswapriyo甚至ProcessHacker都没有开创一种方法,通过该方法可以使用与当前正在运行的系统匹配的调试符号来提取相应的偏移量,然后使用该偏移量?我至少以前看过。当然,在KM中做这种事情可能不是一个好主意;)

– 0xC0000022L♦
19年8月6日在9:06