首页
论坛
课程
招聘
开源内核中调用ZwQueryVirtualMemory查询目标内存地址保护属性源码
2021-7-10 14:23 3548

开源内核中调用ZwQueryVirtualMemory查询目标内存地址保护属性源码

2021-7-10 14:23
3548

看到大手子们都在分享自己的学习成果,我也分享一个叭,是在内核中调用ZwQueryVirtualMemory查询目标内存地址的保护属性或者Type,你想查什么直接改即可,欢迎大家多多交流,已测试没有毛病,废话不多说直接上代码。

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// 此为主要操作代码且全部在内核,应用层直接调用DevIoc函数通讯即可//
ULONG MyQueryVirtualMemoryBasicInfo(IN HANDLE ProcessHandle, IN PVOID DesiredAddress) //传入目标进程PID,和内存地址
{
    MEMORY_BASIC_INFORMATION mbi; //内存属性结构
    ULONG Protect; //初始化保护类型
    if ((ULONG_PTR)DesiredAddress >= 0x70000000 && (ULONG_PTR)DesiredAddress < 0x80000000)
        DesiredAddress = (PVOID)0x70000000;
 
    HANDLE hProcess = NULL;
    CLIENT_ID stClientId = { 0 };
    OBJECT_ATTRIBUTES objectAttributs = { 0 };
    stClientId.UniqueProcess = ProcessHandle;
    stClientId.UniqueThread = 0;
    InitializeObjectAttributes(&objectAttributs, 0, 0, 0, 0);
    // 打开进程,获取进程句柄
    NTSTATUS status = ZwOpenProcess(&hProcess, 1, &objectAttributs, &stClientId);
    if (!NT_SUCCESS(status))
    {
        return -32767;//自己看的,没打开成功
    }
    if (NULL != hProcess)
    {
 
        if (!NT_SUCCESS(ZwQueryVirtualMemory(hProcess, DesiredAddress, MemoryBasicInformation, &mbi, sizeof(mbi), NULL)))
            return -32768// 查询操作失败自定义返回
 
        Protect = mbi.Protect; //需要返回的信息可以是保护也可以是状态也可以是类型 Protect/State/type
    }
    ZwClose(hProcess);  //关闭打开的句柄
    return Protect;   //返回需要的信息
 
}
 
 
 
//然后下面是驱动IO通讯中的代码//
 
    case IOCTL_IO_QueryVirtualMemory: //自定义
    {
        ULONG PtExw;
 
        PtExw = QueryVirtualMemoryBasicInfo(((PDataStruct)InputData)->Pid, ((PDataStruct)InputData)->VMAddress);//传入的结构体 PID和地址
 
        RtlCopyMemory(OutputData, &PtExw, OutputDataLength);//复制到返回信息,应用层就可以接收到了
 
        Status = STATUS_SUCCESS;
        break;
    }
 
 
//下面是需要用到的结构体等信息//
//可以直接引入这三个常用的就有
//#inculd "ntifs.h"
//#inculd "ntdef.h"
//#inculd "wdm.h"
typedef struct _MEMORY_BASIC_INFORMATION {
    PVOID BaseAddress;
    PVOID AllocationBase;
    ULONG AllocationProtect;
#if defined (_WIN64)
    USHORT PartitionId;
#endif
    SIZE_T RegionSize;
    ULONG State;
    ULONG Protect;
    ULONG Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
 
typedef struct _OBJECT_ATTRIBUTES {
    ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
    PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
} OBJECT_ATTRIBUTES;

========================================================
附上内存属性具体信息:
PAGE_NOACCESS =1 任何访问该区域的操作将被拒绝(无权限)
PAGE_READONLY =2 试图写入或执行页面中的代码将引发访问违规(只读)
PAGE_READWRITE =4 试图执行页面中的代码将引发访问违规(可读可写)
PAGE_WRITECOPY =8 写时复制
PAGE_EXECUTE=16 试图读取或写入页面将引发访问违规
PAGE_EXECUTE_READ =32 试图写入页面将引发访问违规
PAGE_EXECUTE_READWRITE =64 对页面执行任何操作都不会引发访问违规
PAGE_EXECUTE_WRITECOPY =128试图执行页面中的代码将引发访问违规。试图写入页面将使系统为进程单独创建一份该页面的私有副本(以页交换文件为后备存储器)

 

========================================================

 

下面随意取了一个受某AC保护的程序,可以看到取出属性是32,对照表看是PAGE_EXECUTE_READ,禁止写入。


[注意] 欢迎加入看雪团队!base上海,招聘CTF安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

最后于 2021-7-10 20:10 被月生沧海编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 21
活跃值: 活跃值 (491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
月生沧海 活跃值 2021-7-10 14:28
2
0
雪    币: 5426
活跃值: 活跃值 (886)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TopC 活跃值 2021-7-10 15:12
3
1
感谢分享
雪    币: 152
活跃值: 活跃值 (1542)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ookkaa 活跃值 2021-7-10 20:16
4
0
能不能分享一下这个百万读写的源码
雪    币: 2287
活跃值: 活跃值 (1776)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mr.hack 活跃值 2021-7-10 21:01
5
0
啊这,还以为你是自己实现了这个函数,原来只是ZwQueryVirtualMemory包装一下
雪    币: 21
活跃值: 活跃值 (491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
月生沧海 活跃值 2021-7-11 08:43
6
0
Mr.hack 啊这,还以为你是自己实现了这个函数,原来只是ZwQueryVirtualMemory包装一下
标题不是写了嘛就说调用实现呀。。
雪    币: 1055
活跃值: 活跃值 (593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
鸭子咯咯哒 活跃值 2021-7-26 22:43
7
0
可以推荐下Windows驱动入门教程吗想学学这方面的
游客
登录 | 注册 方可回帖
返回