根据MS-RDPBCGR文档,正常解密的BITMAPCACHE PERSISTENT LIST PDU如下所示:
f2?00?->?TS_SHARECONTROLHEADER::totalLength?=?0x00f2?=?242?bytes 17?00?->?TS_SHARECONTROLHEADER::pduType?=?0x0017
0x0017
=?0x0010?|?0x0007
=?TS_PROTOCOL_VERSION?|?PDUTYPE_DATAPDU
ef?03?->?TS_SHARECONTROLHEADER::pduSource?=?0x03ef?=?1007
ea?03?01?00?->?TS_SHAREDATAHEADER::shareID?=?0x000103ea
00?->?TS_SHAREDATAHEADER::pad1
01?->?TS_SHAREDATAHEADER::streamId?=?STREAM_LOW?(1)
00?00?->?TS_SHAREDATAHEADER::uncompressedLength?=?0
2b?->?TS_SHAREDATAHEADER::pduType2?=
PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST?(43)
00?->?TS_SHAREDATAHEADER::generalCompressedType?=?0
00?00?->?TS_SHAREDATAHEADER::generalCompressedLength?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::numEntries[0]?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::numEntries[1]?=?0
19?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::numEntries[2]?=?0x19?=?25
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::numEntries[3]?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::numEntries[4]?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::totalEntries[0]?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::totalEntries[1]?=?0
19?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::totalEntries[2]?=?0x19?=?25
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::totalEntries[3]?=?0
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::totalEntries[4]?=?0
03?->?TS_BITMAPCACHE_PERSISTENT_LIST::bBitMask?=?0x03
0x03
=?0x01?|?0x02
=?PERSIST_FIRST_PDU?|?PERSIST_LAST_PDU
00?->?TS_BITMAPCACHE_PERSISTENT_LIST::Pad2
00?00?->?TS_BITMAPCACHE_PERSISTENT_LIST::Pad3
TS_BITMAPCACHE_PERSISTENT_LIST::entries:
a3?1e?51?16?->?Cache?2,?Key?0,?Low?32-bits?(TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY::Key1)
48?29?22?78?->?Cache?2,?High?32-bits?(TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY::Key2)
61?f7?89?9c?->?Cache?2,?Key?1,?Low?32-bits?(TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY::Key1)
cd?a9?66?a8?->?Cache?2,?High?32-bits?(TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY::Key2)
在内核模块RDPWD.sys中,函数例程ShareClass :: SBC_HandlePersistentCacheList负责解析BITMAPCACHE PERSISTENT LIST PDU。当结构中的bBitMask字段被设置为位值0x01时,它指出当前PDU是PERSIST FIRST PDU。然后,SBC_HandlePersistentCacheList将调用WDLIBRT_MemAlloc来分配内核池(分配内核内存)以存储持久位图缓存键,如图4所示。值0x00表示当前PDU是PERSIST MIDDLE PDU。值0x02表示当前PDU是PERSIST LAST PDU。解析PERSIST MIDDLE PDU和PERSIST LAST PDU时,SBC_HandlePersistentCacheList会将位图缓存键复制到之前分配的内存中,如图5所示。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图4. SBC_HandlePersistentCacheList池分配和totalEntriesCacheLimit检查
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图5. SBC_HandlePersistentCacheList复制位图缓存键
Windows 7 x86上的堆栈跟踪和SBC_HandlePersistentCacheList的TS_BITMAPCACHE_PERSISTENT_LIST结构的第二个参数如图6和图7所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图6. SBC_HandlePersistentCacheList堆栈跟踪
(编辑:ASP站长网)
|