-
-
[原创]CVE-2022-34718 TCP/IP 远程命令执行漏洞分析
-
发表于: 2022-10-11 17:57 16164
-
原文链接:https://mp.weixin.qq.com/s/5f8GqQ892ZwbWLdowXXVOg
如果发送的数据包大小超过了最大传输单元(MTU),IPv6 源节点会将数据包分割成多个分片,在前面添加 fragment header ,作为单独的数据包进行传送,然后由目的节点对数据包进行重组。
Fragment header 结构如下:
在分割时,数据包会被分为 不可分片部分 和 可分片部分:
假设原始数据包组成如下:
根据数据包的大小,它会被源节点分成多个分片:
当上面的数据包都到达目的节点后,会重组成为原始数据包:
除此之外需要修改两个位置的数值:
Internet Protocal Security(IPsec) 是一个安全网络协议组,可以对数据包进行验证和数据加密,从而为位于 IP 网络中的两台计算机提供安全的加密通信。IPsec 用于 virtual private networks(VPNs)。
IPsec 使用以下的协议实现不同的功能:
其中 ESP 结构如下:
漏洞发生时的函数调用栈如下:
根据以上信息可以确定,tcpip.sys 使用 IppReceiveHeaderBatch
函数处理接收到的数据包,对 next header 的数值进行判断并调用相应函数处理对应头部,漏洞就发生在处理 fragment header 的时候。
tcpip.sys 会调用 Ipv6pReceiveFragmentList
函数对 fragment header 进行处理,在对分片进行重组的时候:
缓冲区 data 的大小为 HeaderAndOptionsLength
,next header 的偏移值为 Reassembly->nh_offset
。发生越界写的原因就是 Reassembly->nh_offset
的数值大于 HeaderAndOptionsLength
。
接下来通过调试确定这两个数值的来源,测试用数据包组成如下:
由于 ESP header 在 Routing header 之后,系统会先处理 ESP header。tcpip.sys 会调用 IppReceiveEspList
函数处理该头部,具体功能位于 IppReceiveEspNbl
函数中,该函数会对 ESP 中的加密数据进行解密,解密结果为:
可以看到 next header 字段的数值为 0x2c,即 Fragment Header for IPv6,系统处理完 ESP 后会继续处理 fragment header。
整理调试过程中,Reassembly->nh_offset
和 HeaderAndOptionsLength
的数据来源变化情况:
由此可以看出,系统在处理 ESP header 时,因为 next header 位于数据包的尾部, 因此 nh_offset 的计算考虑了 payload 的长度;但是在处理 fragment header 的时候,系统认为 next_header 位于 ExtensionHeader 中。即:
实际上,根据 RFC8200 ,在进行分片的时候,ESP header 是不能放在 fragment header 的前面的:
其中的 Ext & Upper-Layer Headers 可能包括 TCP、UDP、IPv4、IPv6、ICMPv6、ESP 等。
Ipv6pReassembleDatagram
新增代码段
IppReceiveEsp
新增代码段
可以看到经过补丁修复之后,系统对 ESP header 的 next header 字段进行了判断,不再允许小于等于 0x2c 的头部,同时在进行分片重组时,对 Reassembly->nh_offset
和 HeaderAndOptionsLength
的数值进行了判断。
项目 | 详情 |
---|---|
名称 | Windows TCP/IP Remote Code Execution Vulnerability |
简介 | tcpip.sys在对ipv6数据包进行重组时,NextHeaderOffset可能超出缓冲区范围,导致越界写的发生,利用该漏洞可以实现远程命令执行 |
影响版本 | 该漏洞影响所有受支持的 Windows 操作系统 |
编号 | CVE-2022-34718 |
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
Next
Header | Reserved | Fragment Offset |Res|M|
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Identification |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
Next
Header | Reserved | Fragment Offset |Res|M|
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Identification |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | ICMPv6 header | ICMPv6 paylaod |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | ICMPv6 header | ICMPv6 paylaod |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | First fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | Second fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | Last fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | First fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | Second fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
| IPv6 header | Hop
-
by
-
Hop options | Fragment header | Last fragment |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Security Parameters Index (SPI) |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Sequence Number |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Payload data |
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| | Padding |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| | Pad Length |
Next
Header |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Integrity Check Value (ICV) |
+
......
+
| ...... |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
0
1
2
3
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Security Parameters Index (SPI) |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Sequence Number |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Payload data |
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| | Padding |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| | Pad Length |
Next
Header |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
| Integrity Check Value (ICV) |
+
......
+
| ...... |
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
0
: kd> kb
# RetAddr : Args to Child : Call Site
00
fffff80a`
1f1842ea
: ffffb00e`
0cbef000
ffffb00e`
0d333270
ffffb00e`
0f5b4890
ffffb00e`
00000050
: tcpip!Ipv6pReassembleDatagram
+
0x1e3
01
fffff80a`
1f184442
: ffffb00e`
00000000
fffff80a`
1f1c61e8
00000000
`
00000000
ffffb00e`
0d3138f0
: tcpip!Ipv6pReceiveFragment
+
0xae2
02
fffff80a`
1f03bfdf
: ffffb00e`
0cbef000
ffffb00e`
0cbef000
00000000
`
00000001
00000000
`
0000002b
: tcpip!Ipv6pReceiveFragmentList
+
0x42
03
fffff80a`
1f03de45
: fffff80a`
1f1c1240
ffffb00e`
0c8ec940
00000000
`
00000001
ffffb00e`
0cbef000
: tcpip!IppReceiveHeaderBatch
+
0x3ef
04
fffff80a`
1f044131
: ffffb00e`
0d31eb90
ffffb00e`
0d23e9c0
fffff803`
94d7b001
00000000
`
00000000
: tcpip!IppFlcReceivePacketsCore
+
0x315
05
fffff80a`
1f043e12
:
00000000
`
00000017
fffff803`
00000001
fffff80a`
1f001bf0
ffffb00e`
0d23e901
: tcpip!FlpReceiveNonPreValidatedNetBufferListChain
+
0x271
06
fffff803`
92ebce75
:
00000000
`
00000002
fffff803`
931d1980
fffff80a`
1f043d50
fffff803`
94d7b1f0
: tcpip!FlReceiveNetBufferListChainCalloutRoutine
+
0xc2
07
fffff80a`
1f0023a6
: ffffb00e`
0cc1b7b0
00000000
`
00000000
ffffb00e`
0c7ff870
ffffb00e`
0d23e900
: nt!KeExpandKernelStackAndCalloutInternal
+
0x85
08
fffff80a`
1e10392e
:
00000000
`
00000000
fffff803`
94d7b2c0
00000000
`
00000001
fffff80a`
1de5f20d
: tcpip!FlReceiveNetBufferListChain
+
0xb6
09
fffff80a`
1e1028cc
: fffff80a`
1f522801
fffff803`
94d7dd86
0000000e
`
00000000
fffff80a`
00000001
: NDIS!ndisMIndicateNetBufferListsToOpen
+
0x11e
0a
fffff80a`
1eca6156
:
00000000
`
00000000
00000000
`
00000000
ffffb00e`
0d0f4e40
ffffb00e`
0d23e930
: NDIS!NdisMIndicateReceiveNetBufferLists
+
0x31c
0b
fffff80a`
1eca73e3
: ffffb00e`
0d23e900
00000000
`
00000001
ffffb00e`
0d0f4e40
fffff803`
94d7b588
: e1i63x64!RECEIVE::RxIndicateNBLs
+
0x132
0c
fffff80a`
1ecae315
: ffffb00e`
0c483830
ffffb00e`
0d0f4000
ffffb00e`
0d0f4001
fffff803`
00000000
: e1i63x64!RECEIVE::RxProcessInterrupts
+
0x253
0d
fffff80a`
1ecae623
: ffffb00e`
0c4226b0
00000001
`
00000000
00000001
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MsgIntDpcTxRxProcessing
+
0x121
0e
fffff80a`
1ecaddb8
: ffffb00e`
0e66f7d8
00000000
`
00000000
40200342
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MsgIntMessageInterruptDPC
+
0x10f
0f
fffff80a`
1e104e69
: ffffda01`
9d7c9010
ffffda01`
9d7c9320
00000000
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MiniportMessageInterruptDPC
+
0x28
10
fffff803`
92e7f785
: ffffb00e`
0d200000
fffff803`
93155180
ffffb00e`
0cc8e5d0
ffffb00e`
0cc8e5d0
: NDIS!ndisInterruptDpc
+
0x1c9
11
fffff803`
92e7ed10
: fffff80a`
20dc79a8
00000000
`
002e593c
00000000
`
00140001
00000000
`
00000000
: nt!KiExecuteAllDpcs
+
0x335
12
fffff803`
92f7500a
:
00000000
`
00000000
fffff803`
93155180
fffff803`
931d1980
ffffb00e`
0f6cc080
: nt!KiRetireDpcList
+
0x910
13
00000000
`
00000000
: fffff803`
94d7c000
fffff803`
94d76000
00000000
`
00000000
00000000
`
00000000
: nt!KiIdleLoop
+
0x5a
0
: kd> kb
# RetAddr : Args to Child : Call Site
00
fffff80a`
1f1842ea
: ffffb00e`
0cbef000
ffffb00e`
0d333270
ffffb00e`
0f5b4890
ffffb00e`
00000050
: tcpip!Ipv6pReassembleDatagram
+
0x1e3
01
fffff80a`
1f184442
: ffffb00e`
00000000
fffff80a`
1f1c61e8
00000000
`
00000000
ffffb00e`
0d3138f0
: tcpip!Ipv6pReceiveFragment
+
0xae2
02
fffff80a`
1f03bfdf
: ffffb00e`
0cbef000
ffffb00e`
0cbef000
00000000
`
00000001
00000000
`
0000002b
: tcpip!Ipv6pReceiveFragmentList
+
0x42
03
fffff80a`
1f03de45
: fffff80a`
1f1c1240
ffffb00e`
0c8ec940
00000000
`
00000001
ffffb00e`
0cbef000
: tcpip!IppReceiveHeaderBatch
+
0x3ef
04
fffff80a`
1f044131
: ffffb00e`
0d31eb90
ffffb00e`
0d23e9c0
fffff803`
94d7b001
00000000
`
00000000
: tcpip!IppFlcReceivePacketsCore
+
0x315
05
fffff80a`
1f043e12
:
00000000
`
00000017
fffff803`
00000001
fffff80a`
1f001bf0
ffffb00e`
0d23e901
: tcpip!FlpReceiveNonPreValidatedNetBufferListChain
+
0x271
06
fffff803`
92ebce75
:
00000000
`
00000002
fffff803`
931d1980
fffff80a`
1f043d50
fffff803`
94d7b1f0
: tcpip!FlReceiveNetBufferListChainCalloutRoutine
+
0xc2
07
fffff80a`
1f0023a6
: ffffb00e`
0cc1b7b0
00000000
`
00000000
ffffb00e`
0c7ff870
ffffb00e`
0d23e900
: nt!KeExpandKernelStackAndCalloutInternal
+
0x85
08
fffff80a`
1e10392e
:
00000000
`
00000000
fffff803`
94d7b2c0
00000000
`
00000001
fffff80a`
1de5f20d
: tcpip!FlReceiveNetBufferListChain
+
0xb6
09
fffff80a`
1e1028cc
: fffff80a`
1f522801
fffff803`
94d7dd86
0000000e
`
00000000
fffff80a`
00000001
: NDIS!ndisMIndicateNetBufferListsToOpen
+
0x11e
0a
fffff80a`
1eca6156
:
00000000
`
00000000
00000000
`
00000000
ffffb00e`
0d0f4e40
ffffb00e`
0d23e930
: NDIS!NdisMIndicateReceiveNetBufferLists
+
0x31c
0b
fffff80a`
1eca73e3
: ffffb00e`
0d23e900
00000000
`
00000001
ffffb00e`
0d0f4e40
fffff803`
94d7b588
: e1i63x64!RECEIVE::RxIndicateNBLs
+
0x132
0c
fffff80a`
1ecae315
: ffffb00e`
0c483830
ffffb00e`
0d0f4000
ffffb00e`
0d0f4001
fffff803`
00000000
: e1i63x64!RECEIVE::RxProcessInterrupts
+
0x253
0d
fffff80a`
1ecae623
: ffffb00e`
0c4226b0
00000001
`
00000000
00000001
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MsgIntDpcTxRxProcessing
+
0x121
0e
fffff80a`
1ecaddb8
: ffffb00e`
0e66f7d8
00000000
`
00000000
40200342
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MsgIntMessageInterruptDPC
+
0x10f
0f
fffff80a`
1e104e69
: ffffda01`
9d7c9010
ffffda01`
9d7c9320
00000000
`
00000000
00000000
`
00000000
: e1i63x64!INTERRUPT::MiniportMessageInterruptDPC
+
0x28
10
fffff803`
92e7f785
: ffffb00e`
0d200000
fffff803`
93155180
ffffb00e`
0cc8e5d0
ffffb00e`
0cc8e5d0
: NDIS!ndisInterruptDpc
+
0x1c9
11
fffff803`
92e7ed10
: fffff80a`
20dc79a8
00000000
`
002e593c
00000000
`
00140001
00000000
`
00000000
: nt!KiExecuteAllDpcs
+
0x335
12
fffff803`
92f7500a
:
00000000
`
00000000
fffff803`
93155180
fffff803`
931d1980
ffffb00e`
0f6cc080
: nt!KiRetireDpcList
+
0x910
13
00000000
`
00000000
: fffff803`
94d7c000
fffff803`
94d76000
00000000
`
00000000
00000000
`
00000000
: nt!KiIdleLoop
+
0x5a
void Ipv6pReassembleDatagram(__int64 Packet, Reassembly_t
*
Reassembly, char OldIrql)
{
ExtensionHeaderLength
=
Reassembly
-
>ExtensionHeaderLength;
TotalLength
=
ExtensionHeaderLength
+
Reassembly
-
>DataLength;
HeaderAndOptionsLength
=
ExtensionHeaderLength
+
0x28
;
NetBufferList
=
NetioAllocateAndReferenceNetBufferAndNetBufferList(
IppReassemblyNetBufferListsComplete,
Reassembly,
0i64
,
0i64
,
0
,
0
);
NetBuffer
=
NetBufferList
-
>FirstNetBuffer;
data
=
NdisGetDataBuffer(NetBuffer, HeaderAndOptionsLength,
0i64
,
1u
,
0
)
/
/
请求访问 NET_BUFFER 中的一段连续空间,请求的大小为 HeaderAndOptionsLength
Reassembly
-
>IPv6.Payload_length
=
__ROR2__(TotalLength,
8
);
*
data
=
Reassembly
-
>IPv6;
/
/
复制 IPv6 header
memmove(data
+
0x28
, Reassembly
-
>ExtensionHeader, Reassembly
-
>ExtensionHeaderLength);
/
/
复制 ExtensionHeader
*
(data
+
Reassembly
-
>nh_offset)
=
Reassembly
-
>next_header;
/
/
复制
next
header
...
}
void Ipv6pReassembleDatagram(__int64 Packet, Reassembly_t
*
Reassembly, char OldIrql)
{
ExtensionHeaderLength
=
Reassembly
-
>ExtensionHeaderLength;
TotalLength
=
ExtensionHeaderLength
+
Reassembly
-
>DataLength;
HeaderAndOptionsLength
=
ExtensionHeaderLength
+
0x28
;
NetBufferList
=
NetioAllocateAndReferenceNetBufferAndNetBufferList(
IppReassemblyNetBufferListsComplete,
Reassembly,
0i64
,
0i64
,
0
,
0
);
NetBuffer
=
NetBufferList
-
>FirstNetBuffer;
data
=
NdisGetDataBuffer(NetBuffer, HeaderAndOptionsLength,
0i64
,
1u
,
0
)
/
/
请求访问 NET_BUFFER 中的一段连续空间,请求的大小为 HeaderAndOptionsLength
Reassembly
-
>IPv6.Payload_length
=
__ROR2__(TotalLength,
8
);
*
data
=
Reassembly
-
>IPv6;
/
/
复制 IPv6 header
memmove(data
+
0x28
, Reassembly
-
>ExtensionHeader, Reassembly
-
>ExtensionHeaderLength);
/
/
复制 ExtensionHeader
*
(data
+
Reassembly
-
>nh_offset)
=
Reassembly
-
>next_header;
/
/
复制
next
header
...
}
0
1
2
3
4
5
6
7
8
9
a b c d e f
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0000
| Ethernet II,
0x0e
B | |
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
+
0010
| |
+
IPv6 header,
0x28
B
+
0020
| |
+
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0030
| | Routing header,
8
B |
93
59
-
> ESP header,
8
B
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0040
99
40
00
00
00
00
|
55
55
55
55
55
55
55
55
55
55
-
> IV,
0x10
B
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0050
55
55
55
55
55
55
|eb
42
e4
0a
95
da
11
1d
21
a1|
-
> payload
+
padding
+
padding_length
+
next_header
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
+
0x30
B,已被加密
0060
|ea c7
31
c9 e1
24
48
8d
f9
98
d4
98
82
b7 eb
5d
|
+
+
0070
|b7
8f
bf c6
3a
00
eb
22
7d
26
55
b7
43
9f
60
62
|
+
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0080
|e3 ea fe
8c
23
87
|
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0
1
2
3
4
5
6
7
8
9
a b c d e f
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0000
| Ethernet II,
0x0e
B | |
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
+
0010
| |
+
IPv6 header,
0x28
B
+
0020
| |
+
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0030
| | Routing header,
8
B |
93
59
-
> ESP header,
8
B
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0040
99
40
00
00
00
00
|
55
55
55
55
55
55
55
55
55
55
-
> IV,
0x10
B
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0050
55
55
55
55
55
55
|eb
42
e4
0a
95
da
11
1d
21
a1|
-
> payload
+
padding
+
padding_length
+
next_header
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
+
0x30
B,已被加密
0060
|ea c7
31
c9 e1
24
48
8d
f9
98
d4
98
82
b7 eb
5d
|
+
+
0070
|b7
8f
bf c6
3a
00
eb
22
7d
26
55
b7
43
9f
60
62
|
+
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
0080
|e3 ea fe
8c
23
87
|