首页
社区
课程
招聘
[求助]内核的ZwProtectVirtualMemory怎么使用, 总是失败
2020-5-10 02:17 9394

[求助]内核的ZwProtectVirtualMemory怎么使用, 总是失败

2020-5-10 02:17
9394

// 进程_修改内存属性(目标进程ID, 目标进程的地址, 内存大小, 内存
ULONG process_MemProtect(ULONG64 pid, PVOID addr, ULONG size, ULONG protect) {

typedef NTSTATUS(*pZwProtectVirtualMemory)(HANDLE ProcessHandle, PVOID* BaseAddress, PULONG ProtectSize, ULONG NewProtect, PULONG OldProtect);
pZwProtectVirtualMemory ZwProtectVirtualMemory = (pZwProtectVirtualMemory)((UINT64)ZwWaitForSingleObject + 0x20 * (0x4d - 1));


//    根据pid获取PEPROCESS
PEPROCESS process = NULL;
PsLookupProcessByProcessId((HANDLE)pid, &process);

ULONG OldProtect = 0;
KAPC_STATE apc_state;
memset(&apc_state, 0, sizeof(apc_state));
//    附加来切换到目标进程()
KeStackAttachProcess(process, &apc_state);
//    判断目标地址的数据是否有效()
if (MmIsAddressValid(addr) == TRUE) {
    NTSTATUS status = ZwProtectVirtualMemory((HANDLE)-1, &addr, &size, protect, &OldProtect);
    if (!NT_SUCCESS(status)) {
        KdPrint(("status = %08X\n", status));
        return 0;
    }
}
//    切换到原进程()
KeUnstackDetachProcess(&apc_state);
//    引用计数-1
ObDereferenceObject(process);
return OldProtect;

}


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

收藏
点赞0
打赏
分享
最新回复 (12)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_tiqapxsm 2020-5-10 09:43
2
0
push    ebp
mov     ebp, esp                ebp=esp
push    0FFFFFFFFh              ebp-4
push    offset sub_401C80       ebp-8
mov     eax, large fs:0
push    eax                     ebp-c
sub     esp, 0Ch                ebp-18
push    ebx                     ebp-1c
push    esi                     ebp-20
push    edi                     ebp-24
mov     eax, ___security_cookie
xor     eax, ebp
push    eax                     ebp-28
lea     eax, [var_C]            eax=add:fs:0 
mov     large fs:0, eax         fs:0=add:fs:0                                     
mov     [var_10], esp           ebp-10=esp         
push    offset unk_402630       ebp-2c
lea     eax, [var_14]                   
mov     [var_4], 0
push    eax
mov     [var_14], offset aError ; "error"
call    _CxxThrowException
mov     eax, offset loc_40104D    
retn
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_tiqapxsm 2020-5-10 09:43
3
0
push    ebp
mov     ebp, esp                ebp=esp
push    0FFFFFFFFh              ebp-4
push    offset sub_401C80       ebp-8
mov     eax, large fs:0
push    eax                     ebp-c
sub     esp, 0Ch                ebp-18
push    ebx                     ebp-1c
push    esi                     ebp-20
push    edi                     ebp-24
mov     eax, ___security_cookie
xor     eax, ebp
push    eax                     ebp-28
lea     eax, [var_C]            eax=add:fs:0 
mov     large fs:0, eax         fs:0=add:fs:0                                     
mov     [var_10], esp           ebp-10=esp         
push    offset unk_402630       ebp-2c
lea     eax, [var_14]                   
mov     [var_4], 0
push    eax
mov     [var_14], offset aError ; "error"
call    _CxxThrowException
mov     eax, offset loc_40104D    
retn
请问我这样分析对不对
雪    币: 182
活跃值: (576)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
柒雪天尚 2020-5-10 10:11
4
0
    SIZE_T regionSize;  
regionSize = sizeof(UCHAR);

        status = ZwProtectVirtualMemory(NtCurrentProcess(),
                                        &baseAddress,
                                        &regionSize,
                                        PAGE_EXECUTE_READWRITE,
                                        &oldProtection);
雪    币: 173
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AngelBeats丶 2020-5-10 12:20
5
0
柒雪天尚 SIZE_T regionSize; regionSize = sizeof(UCHAR); status = ZwProtectVirtualMemory(NtC ...
不行啊  虽然成功了, 但是并没有修改属性
process_MemProtect(pid, 0x40000, 4, PAGE_NOACCESS);
0x40000这个数据我用CE看, 还是能看到数据
雪    币: 173
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AngelBeats丶 2020-5-10 12:21
6
0
mb_tiqapxsm push ebp mov ebp, esp ebp=esp push 0FFFFFFFFh ebp-4 push ...
???  没看懂,  我是想成功调用ZwProtectVirtualMemory(),   我用R3层的ProtectVirtualMemory()函数就没问题, 但是用内核的就不成功
雪    币: 248
活跃值: (3774)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2020-5-10 17:44
7
0
因为是KeStackAttachProcess附加
所以要OpenProcess用PROCESS_ALL_ACCESS,传给ZwProtectVirtualMemory,而不是-1
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2020-5-10 18:05
8
0
AngelBeats丶 不行啊 虽然成功了, 但是并没有修改属性 process_MemProtect(pid, 0x40000, 4, PAGE_NOACCESS); 0x40000这个数据我用CE看, 还是能看到数 ...
CE可能在读取数据之前修改过内存的保护属性...建议过滤NtProtectVirtualMemory和NtReadVirtualMemory,让CE无法读取内存和修改内存保护
雪    币: 173
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AngelBeats丶 2020-5-10 19:40
9
0
Boring勇哥 CE可能在读取数据之前修改过内存的保护属性...建议过滤NtProtectVirtualMemory和NtReadVirtualMemory,让CE无法读取内存和修改内存保护
我用R3层的ProtectVirtualMemory()函数, 修改PAGE_NOACCESS调用完后, 用CE看内存, 看到的是??     也说明了R3层调用成功了

但是我用R0的NtReadVirtualMemory()函数, 修改PAGE_NOACCESS调用完后, 用CE看内存, 还是能看到数值, 而且返回值是C00000F1、C0000005等等
雪    币: 173
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AngelBeats丶 2020-5-10 19:41
10
0
yy虫子yy 因为是KeStackAttachProcess附加 所以要OpenProcess用PROCESS_ALL_ACCESS,传给ZwProtectVirtualMemory,而不是-1
我用了NtOpenProcess()函数打开进程的, 虽然不会蓝屏,  但是还是没有修改属性, 我用CE还是能看到数值, 正常来说修改PAGE_NOACCESS属性后, CE看到是??
雪    币: 173
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AngelBeats丶 2020-5-11 22:23
11
1
看返回值查到原因了, 应该是系统页面方式问题, 用其他虚拟机测试可以用
雪    币: 907
活跃值: (3454)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
逆向爱好者 2023-3-30 00:04
12
0
AngelBeats丶 看返回值查到原因了, 应该是系统页面方式问题, 用其他虚拟机测试可以用
r3都能修改了,ce看不到,r0还比r3权限低么,肯定是代码写错了
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_nking 4天前
13
0
不能改内核地址
游客
登录 | 注册 方可回帖
返回