首页
社区
课程
招聘
[原创]庖丁解牛之----Windows DTrace实现原理【重加了图片】
发表于: 2025-12-20 13:01 20934

[原创]庖丁解牛之----Windows DTrace实现原理【重加了图片】

2025-12-20 13:01
20934

DTrace 是一个命令行实用工具,允许用户实时监视和调试其系统性能,windows的Dtrace是移植其他操作系统的开放源代码的事件追踪平台,从win10的1900内核版本开始集成的,可以借助 dtrace,用户可以动态检测内核和用户空间代码,而无需修改代码本身。

47cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3q4J5L8W2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8Y4A6Z5i4K6u0V1j5$3&6Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0V1M7$3g2J5N6X3g2J5i4K6u0r3j5h3c8E0K9h3&6A6M7%4c8J5j5i4c8A6L8$3&6Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0V1j5$3!0E0L8h3q4F1k6s2y4Q4x3V1k6V1N6s2u0S2j5$3f1`.

下载安装DTrace

注意: 启用后重启机器

cmd里输入  dtrac -l 会列举一些使用的探查项目         


输入:dtrace -Fn "tick-5sec {exit(0);} syscall:::entry{ @num[pid,execname] = count();} "

tick-5sec 指定五秒内事件,exit(0) 完成后就结束,显示记录的进程pid 、进程名以及记录的次数

在命令行cmd里输入bcdedit /set dtrace ON

会设置注册表  

HKEY_LOCAL_MACHINE\BCD00000000\Objects\{5ea502ac-8b8f-11f0-9f0f-70d823d98bbc}\Elements\26000145,就会设置Key键Element的value值为 1


如果  /set dtrace OFF   key键Element的value就设置为0了


接下来,我们就通过逆向bcdedit.exe分析下这块功能如何实现的

在BcdEditMain的函数里,有个判断参数,其中BcdEditIsSwitchPresent("Set")函数是取当前参数是否是参数“Set”,如果是Set参数则进入BcdEditSetSwitch(),接下来看BcdEditSetSwitch函数。

(1) 首先会根据传入的进程参数返回对应的注册表对象GUID

这行代码 ParameterSet = BcdEditGetParameterSet(L"set");

BcdEditGetParameterSet函数会根据设置的参数"Set" 从全局BcdEditParameterList中找到进程传入的参数,其结构如下

如下


BcdElements里面总共定义了284个元素

接下里就是通过BcdStringToGuid函数找到set参数对应Store的GUID

Set参数返回的GUID是  {0FA926493h, 6F1Ch, 4193h, <0A4h, 14h, 58h, 0F0h, 0B2h, 45h, 6Dh,1Eh>}

(2) BcdEditOpenStore打开Store,然后通过BcdOpenObject函数打开GUID的对象

下面就是使用BcdEditOpenStore 打开的一些参数详解

    再往下就是通过BcdOpenObject打开GUID的对象Object

(3) 通过BcdiStringToDataType找到对应的Set里的dtrace的Element的对象Value, BcdiStringToDataType会根据全局结构数组的BcdElements去查找相应的对象ID Value

BcdElements结构定义大致如下


BcdElements里面总共定义了284个元素

BcdElements里面总共定义了284个元素,可以寻找到dtrace对应的Elment定义结构


这里就看到了dtrace对应的Element的Id注册表项的Value: 26000145h

(3) 通过BcdSetElementDataWithFlags函数设置BCD注册表的Object的Element的开关 ON(1)  / OFF(0)

BcdSetElementDataWithFlags 最终会调用BiSetRegistryValue去设置Element的key对应的value: 0/1


至此bcedit的部分分析完毕,接下来是重启后系统去开启dtrace


在前面我们讲解了bcdedit.exe设置bcd的注册表打开的dtrace的对象的开关,因为需要重启windows才能生效,所以我们接下来分析efi引导程序winload.efi

winload.efi中有一块结构体定义了Dtrace扩展




可以看到第三个结构体是一个函数OslpDtraceExtensionEnabled

OslpDtraceExtensionEnabled函数中可以看到一个逻辑是获取bcd对象26000145的boolean值

BootOptionBoolean = BlGetBootOptionBoolean(*(_QWORD *)(ApplicationEntry + 24), 0x26000145, v12);

26000145对象的boolean值就是前面提到的dtrace的set值,v10的默认值是0,如果BootOptionBoolean获取的set值是1,那么v10的值就是1,如果v10的值是1就调用OslpIsApiSetHosted加载dtrace.sys

什么时候会调用OslpDtraceExtensionEnabled这个函数呢?

这个函数会在 OslpApplyDynamicSchemaExtensions的函数里调用,其调用栈如下:

下面就看下windbg双机调试下看到的运行逻辑,windbg输入:sxe ld winload.efi,重启debug模式后会自动进入winload的debugservice服务入口

同时看kb命令看堆栈如下:


接下里就是设置断点: bp winload!OslpDtraceExtensionEnabled  ,然后g,windbg就会断点在了winload!OslpDtraceExtensionEnabled的函数入口点,

目前看只有一个winload.efi加载了

我们一步步单独到

这块代码看看返回值是多少?目前我们看到r8对应的内存值里的boolean值为0

运行完BlGetBootOptionBoolean 函数后可以看到r8 对应的内存的里的boolean变成了1


那么就表示要开启dtrace的功能,这里只是设置了apischem驱动是否加载的点,并且后续会通过加载BlLdrLoadImage函数来加载dtarce.sys

从上整个过程可以看到从winload.efi的入口函数OslpMain一直调到该函数的,引导启动dtrace.sys驱动后就进入nto内核启动了。

操作系统初始化Windows启动初始化分为‌Phase0(阶段0)‌和‌Phase1(阶段1)‌两个阶段,而Dtrace是在Phase1的阶段KeInitSystem


在KeInitSystem的过程当中,其中有一个步骤是KiInitDynamicTraceSupport()



该函数的大致逻辑是给KiDynamicTraceEnnable 默认值是0,当调用TraceInitSystem成功后,KiDynamicTraceEnnable 的值就被赋予了  1 | 2 , KiDynamicTraceEnnable = 3, 当判断KdDebuggerNotPresent值不为0时,就是存在内核调试状态,KiDynamicTraceEnnable = 2 | 5,KiDynamicTraceEnnable = 7,主要的功能就在TraceInitSystem是外部驱动的一个到处函数,如果开启了Dtrace功能,这个函数就会被调用成功。


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2025-12-22 21:56 被basketwill编辑 ,原因:
收藏
点赞 ・62
打赏
分享
最新回复 (31)
雪    币: 3539
活跃值: (7834)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2 楼
牛逼牛逼牛逼
2025-12-20 18:30
0
雪    币: 144
活跃值: (2733)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3 楼
666
2025-12-21 23:31
0
雪    币: 232
活跃值: (179)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4 楼
感謝分享 666
2025-12-22 01:27
0
雪    币: 3110
活跃值: (2919)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5 楼
学习到了
2025-12-22 09:28
0
雪    币: 1108
活跃值: (2877)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6 楼
感謝分享
2025-12-22 11:15
0
雪    币: 944
活跃值: (2382)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7 楼
666666666
2025-12-22 12:45
0
雪    币: 4869
活跃值: (4606)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
8 楼
mark
2025-12-22 12:56
0
雪    币: 602
活跃值: (3748)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
9 楼
谢谢分享
2025-12-23 23:59
0
雪    币: 158
活跃值: (645)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10 楼
inside dtrace in windows
2025-12-24 10:38
0
雪    币: 612
活跃值: (2532)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11 楼
谢谢分享!
2025-12-24 11:29
0
雪    币: 2790
活跃值: (7011)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12 楼
66666
2025-12-24 16:19
0
雪    币: 0
活跃值: (586)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13 楼
mark
2025-12-24 17:29
0
雪    币: 206
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14 楼
好厉害
2025-12-24 18:21
0
雪    币: 5
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15 楼
谢谢分享!
2025-12-25 06:03
0
雪    币: 8772
活跃值: (6836)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
16 楼
要学的东西太多了
2025-12-25 10:48
0
雪    币: 20
活跃值: (486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17 楼
感謝分享
2025-12-25 16:54
0
雪    币: 4366
活跃值: (6442)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
18 楼
感谢分享
2025-12-29 14:42
0
雪    币: 364
活跃值: (3092)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19 楼
999
2025-12-29 16:10
0
雪    币: 82
活跃值: (766)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20 楼
学习
2025-12-30 13:12
0
雪    币: 232
活跃值: (1245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21 楼
1
2025-12-30 14:47
0
雪    币: 13006
活跃值: (10062)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
22 楼
mark
2026-1-5 17:16
0
雪    币: 56
活跃值: (1720)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23 楼
666
2026-1-5 20:35
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24 楼
66666666
2026-1-14 09:45
0
雪    币: 1
活跃值: (468)
能力值: ( LV2,RANK:11 )
在线值:
发帖
回帖
粉丝
25 楼
mark
2026-2-27 17:04
0
游客
登录 | 注册 方可回帖
返回