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

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

2020-5-10 02:17
10545

// 进程_修改内存属性(目标进程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;

}


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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
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
2020-5-10 09:43
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
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
请问我这样分析对不对
2020-5-10 09:43
0
雪    币: 181
活跃值: (636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
    SIZE_T regionSize;  
regionSize = sizeof(UCHAR);

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

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