首页
社区
课程
招聘
[求助]通过修改PTE设置执行权限的奇怪问题
发表于: 2025-8-7 15:22 446

[求助]通过修改PTE设置执行权限的奇怪问题

2025-8-7 15:22
446

利用驱动在某个进程注入一个SHELLCODE,执行,弹出一个对话框.

为了隐蔽,首先设置读写权限,然后设置执行权限.设置执行权限的时候有2种方法.

1: ZwProtectVirtualMemory(NtCurrentProcess(), &BaseAddress, &size, PAGE_EXECUTE_READWRITE, &oldProtect);

2:

BOOLEAN SetExecutePage(ULONG64 VirtualAddress, ULONG size)

{

    ULONG64 startAddress = VirtualAddress & (~0xFFF); // 起始地址

    ULONG64 endAddress = (VirtualAddress + size - 1) & (~0xFFF); // 结束地址 


    for (ULONG64 curAddress = startAddress; curAddress <= endAddress; curAddress += PAGE_SIZE)

    {

        PHardwarePte pde = (PHardwarePte)getPde(curAddress);

        PHardwarePte pte = (PHardwarePte)getPte(curAddress);

        if (MmIsAddressValid(pde) && pde->valid == 1)

        {

            pde->no_execute = 0;

            pde->write = 1;

        }

        if (MmIsAddressValid(pte) && pte->valid == 1)

        {

            pte->no_execute = 0;

            pte->write = 1;

        }

        KeInvalidateRangeAllCaches((PVOID)curAddress, PAGE_SIZE);

    }

    return TRUE;

}

不知道为什么使用ZwProtectVirtualMemory就执行正常.使用SetExecutePage,注入的进程就崩溃.

最奇怪的来了,如果我先用ZwProtectVirtualMemory,编译成功,加载驱动,成功弹出对话框.

再改成利用SetExecutePage设置权限,重新编译,再加载,居然成功了.

不知道哪里有问题


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (330)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我测试了下,可能跟2次都刚巧分配同样的位置有关系.
2025-8-7 19:42
0
雪    币: 2790
活跃值: (5430)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
大哥你的代码问题太很多了。一点容错处理和异常情况都没考虑,很少看到内核操作还有无锁操作的情况,而且操作物理内存居然不需要考虑被中断的情况?想问下你在什么系统下测试的,这样的代码居然不蓝?同时代码没有考虑多核并发问题、虚拟内存对应的物理内存不存在情况下没有修改对应的页面属性、刷新TLB有问题等。  ZwProtectVirtualMemory的内部实现并不像你的代码那么简单。 
2025-8-8 09:35
0
雪    币: 2790
活跃值: (5430)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
要想查看为什么SetExecutePage后为什么不行,可以在内核修改完页保护属性后,R3开始运行前暂停,然后用VMMAP工具查看下对应SHELLCODE的地址范围的页保护属性是否和预期的一致。
2025-8-8 09:37
0
游客
登录 | 注册 方可回帖
返回