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

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

2021-8-6 19:38
2516

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

[公告] 欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 10555
活跃值: 活跃值 (4319)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2021-8-6 23:33
2
3
内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
雪    币: 5266
活跃值: 活跃值 (971)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lononan 活跃值 2021-8-7 11:36
3
1
KeStackAttachProcess以后hProcess=NtCurrentProcess()就行了,没必要openprocess了.
声明调用,参考BlackBoneDrv就行了
雪    币: 3834
活跃值: 活跃值 (1130)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 活跃值 1 2021-8-7 11:59
4
0
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
大牛能说说为什么呢?
雪    币: 21
活跃值: 活跃值 (491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
月生沧海 活跃值 2021-8-7 16:25
5
0
hzqst 内核别用NtProtectVirtualMemory,用ZwProtectVirtualMemory
我看了一下ntdll  两者调用index都是0x50 感觉俩是一样的
雪    币: 2272
活跃值: 活跃值 (1768)
能力值: ( 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可以避免额外的参数列表检查,提高效率。
游客
登录 | 注册 方可回帖
返回