首页
社区
课程
招聘
未解决 [求助]NtProtectVirtualMemory 失败的很奇怪
发表于: 2020-9-13 22:50 4966

未解决 [求助]NtProtectVirtualMemory 失败的很奇怪

2020-9-13 22:50
4966

KernelMode模式下

    ULONG ProtectSize = 4;
    NTSTATUS xx = NtProtectVirtualMemory(
        ProcessHandle,
        &BaseAddress,
        &ProtectSize,
        PAGE_EXECUTE_READWRITE,
        &OldProtect);


    DbgPrint("NtProtectVirtualMemory  %x  %x\n", NT_SUCCESS(xx), xx);

调用成功。xx的值是0。没问题

 

但是如果

    ULONG ProtectSize = 4;
    NTSTATUS xx = NtProtectVirtualMemory(
        ProcessHandle,
        &BaseAddress,
        &ProtectSize,
        PAGE_EXECUTE_READWRITE,
        &OldProtect);

    DbgPrint("NtProtectVirtualMemory BaseAddress  %llx  ProtectSize %x\n", BaseAddress, ProtectSize);
    DbgPrint("NtProtectVirtualMemory  %x  %x\n", NT_SUCCESS(xx), xx);

仅仅是多加了一行DbgPrint 。函数就会调用失败。返回值0xC00000F1。查询代码 是说参数3无效。。。我反复检查了参数3,都没问题。。。

 

这是为什么呢? 想不通为啥 多一行DbgPrint 就调用失败了。。

 

Zw函数有个重要工作是把PreviousMode设置成KernelMode 。因为Zw还要定位,所以我调用的Nt函数,,并且调用前,将PreviousMode设置成KernelMode 。所以调用成功了。。。但是增加一行 输出函数就会失败。。实在不解。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-14 19:31 被简单选择编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
内核用Zw
2020-9-14 07:53
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hzqst 内核用Zw

我是切换KernelMode调用的Nt

最后于 2020-9-14 11:37 被简单选择编辑 ,原因:
2020-9-14 11:35
0
雪    币: 2404
活跃值: (3184)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
BaseAddress几个字节?
2020-9-14 13:34
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
boursonjane BaseAddress几个字节?
64位系统。BaseAddress是指针。占用8字节
2020-9-14 13:59
0
雪    币: 368
活跃值: (441)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
6
简单选择 hzqst 内核用Zw 我是切换KernelMode调用的Nt
你了解下先前模式,内核中有个api你了解下原理就明白了。
KeGetPreviousMode
2020-9-14 15:38
0
雪    币: 15045
活跃值: (6258)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

2楼已经告诉你了,内核模式下最好用Zw开头的api。你了解一下Zw和Nt在内核模式下的区别,如果KernelMode下调用Nt开头的api必须手工进行一些处理的。与其这样不如直接用Zw。

最后于 2020-9-14 17:08 被tDasm编辑 ,原因:
2020-9-14 17:00
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
tDasm 2楼已经告诉你了,内核模式下最好用Zw开头的api。你了解一下Zw和Nt在内核模式下的区别,如果KernelMode下调用Nt开头的api必须手工进行一些处理的。与其这样不如直接用Zw。
Zw未导出的 还要定位。。麻烦哎。。Nt的查SSDT就行了。。。可是,为什么    一个输出函数会影响成功与失败呢?
2020-9-14 19:19
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
又出bug了 你了解下先前模式,内核中有个api你了解下原理就明白了。 KeGetPreviousMode
可是你说的这个。。我已经手动把PreviousMode切换成KernelMode了呀。。
2020-9-14 19:23
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
tDasm 2楼已经告诉你了,内核模式下最好用Zw开头的api。你了解一下Zw和Nt在内核模式下的区别,如果KernelMode下调用Nt开头的api必须手工进行一些处理的。与其这样不如直接用Zw。
Zw函数有个重要工作是把PreviousMode设置成KernelMode  。因为Zw还要定位,所以我调用的Nt函数,,并且调用前,将PreviousMode设置成KernelMode 。所以调用成功了。。。但是增加一行 输出函数就会失败。。实在不解。
2020-9-14 19:31
0
游客
登录 | 注册 方可回帖
返回
//