首页
社区
课程
招聘
[求助]内核调用ZwProtectVirtualMemory总是失败返回C0000005错误或PAGE_FAULT_IN_NONPAGED_AREA
2021-8-6 19:38 4608

[求助]内核调用ZwProtectVirtualMemory总是失败返回C0000005错误或PAGE_FAULT_IN_NONPAGED_AREA

2021-8-6 19:38
4608

代码如下,未导出函数ssdt已经取成功了,对照了地址这一点没问题,然后就是怎么写都是出错,修改不成功,要么返回NTSTATUS:c0000005说非法访问,要么就是蓝屏PAGE_FAULT_IN_NONPAGED_AREA,求助一下论坛里的大佬!!!!
下面是代码:::搞定了会发帖开源!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ULONG KernelVirtualProtect(HANDLE pid, PVOID addr, SIZE_T size, ULONG protect)
{
    ULONG OldProtect = -32768;//初始化之前的保护
    PEPROCESS process;
    NTSTATUS status;
    HANDLE hProcess = NULL;
    KAPC_STATE apc_state;
    CLIENT_ID stClientId = { 0 };
    OBJECT_ATTRIBUTES objectAttributs = { 0 };
    if ((ULONG_PTR)addr >= 0x70000000 && (ULONG_PTR)addr < 0x80000000) addr = (PVOID)0x70000000;
 
 
    status=PsLookupProcessByProcessId(pid, &process);
    if (!NT_SUCCESS(status)) { return -32766; }
 
    KeStackAttachProcess(process, &apc_state);
    stClientId.UniqueProcess = pid;
    stClientId.UniqueThread = 0;
    InitializeObjectAttributes(&objectAttributs, 0, 0, 0, 0);
    status = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &objectAttributs, &stClientId);   
    if (!NT_SUCCESS(status)){return -32767;}
     if (hProcess != NULL)
    {
        status = pfn_NtProtectVirtualMemory(hProcess, (PVOID*)&addr, &size, PAGE_EXECUTE_READWRITE, &OldProtect);
        if (!NT_SUCCESS(status))
        {
            DPRINT(("[X64Svc] pfn_NtProtectVirtualMemory status = %08X\n", status));
            return status;
 
        }
    }
    KeUnstackDetachProcess(&apc_state);
    ObDereferenceObject(process);
    ZwClose(hProcess);
    DPRINT(("[X64Svc] pfn_NtProtectVirtualMemory status = %08X\n", status));
    return OldProtect;
}

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 12833
活跃值: (8989)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2021-8-6 23:33
2
3
内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
雪    币: 9363
活跃值: (4277)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lononan 2021-8-7 11:36
3
1
KeStackAttachProcess以后hProcess=NtCurrentProcess()就行了,没必要openprocess了.
声明调用,参考BlackBoneDrv就行了
雪    币: 7960
活跃值: (4238)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2021-8-7 11:59
4
0
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
大牛能说说为什么呢?
雪    币: 143
活跃值: (775)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
月生沧海 2021-8-7 16:25
5
0
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
我看了一下ntdll  两者调用index都是0x50 感觉俩是一样的
雪    币: 2541
活跃值: (3104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mr.hack 2021-8-7 20:29
6
0
月生沧海 我看了一下ntdll 两者调用index都是0x50 感觉俩是一样的
如果是从用户模式调用Native API则previous mode是用户态,如果从内核模式调用Native API则previous mode是内核态。previous为用户态时Native API将对传递的参数进行严格的检查,而为内核态时则不会。
调用Nt API时不会改变previous mode的状态,调用Zw API时会将previous mode改为内核态,因此在进行Kernel Mode Driver开发时可以使用Zw系列API可以避免额外的参数列表检查,提高效率。
游客
登录 | 注册 方可回帖
返回