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

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

2021-8-6 19:38
5781

代码如下,未导出函数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;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
2021-8-6 23:33
3
雪    币: 7705
活跃值: (5527)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
KeStackAttachProcess以后hProcess=NtCurrentProcess()就行了,没必要openprocess了.
声明调用,参考BlackBoneDrv就行了
2021-8-7 11:36
1
雪    币: 8855
活跃值: (5361)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
大牛能说说为什么呢?
2021-8-7 11:59
0
雪    币: 143
活跃值: (780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
我看了一下ntdll  两者调用index都是0x50 感觉俩是一样的
2021-8-7 16:25
0
雪    币: 3393
活跃值: (4043)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
月生沧海 我看了一下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可以避免额外的参数列表检查,提高效率。
2021-8-7 20:29
0
游客
登录 | 注册 方可回帖
返回
//