mstscax!CMCS==MCSSendConnectInitial函数分析之mstsc.exe源代码分析第二次交互

mstscax!CMCS==MCSSendConnectInitial函数分析之mstsc.exe源代码分析第二次交互

EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CMCS, MCSSendConnectInitial);

1: kd> kc

00 WS2_32!send

01 WS2_32!DTHOOK_send

02 mstscax!CTD::TDFlushSendQueue

03 mstscax!CTD::TD_SendBuffer

04 mstscax!CXT::XTSendCR

05 mstscax!CXT::MACROGENERATED_Static_XTSendCR

06 mstscax!CCD::CDWndProc

07 mstscax!CCD::CDStaticWndProc

08 USER32!InternalCallWinProc

09 USER32!UserCallWinProcCheckWow

0a USER32!DispatchMessageWorker

0b USER32!DispatchMessageW

0c mstscax!CSND::SND_Main

0d mstscax!CSND::SND_StaticMain

0e mstscax!CUT::UTStaticThreadEntry

0f mstscax!_threadstartex

10 kernel32!BaseThreadStart

1: kd> x mstscax!CMCS::MCSSendConnectInitial

5d03a770 mstscax!CMCS::MCSSendConnectInitial (unsigned long)

1: kd> bp mstscax!CMCS::MCSSendConnectInitial

1: kd> g

Breakpoint 18 hit

mstscax!CMCS::MCSSendConnectInitial:

001b:5d03a770 55 push ebp

1: kd> kc

00 mstscax!CMCS::MCSSendConnectInitial

01 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial

02 mstscax!CCD::CDWndProc

03 mstscax!CCD::CDStaticWndProc

04 USER32!InternalCallWinProc

05 USER32!UserCallWinProcCheckWow

06 USER32!DispatchMessageWorker

07 USER32!DispatchMessageW

08 mstscax!CSND::SND_Main

09 mstscax!CSND::SND_StaticMain

0a mstscax!CUT::UTStaticThreadEntry

0b mstscax!_threadstartex

0c kernel32!BaseThreadStart

1: kd> kv

ChildEBP RetAddr Args to Child

00 00d3fd60 5cfe1480 00a49e80 00000000 00d3fdd8 mstscax!CMCS::MCSSendConnectInitial (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\mcsint.cpp @ 31]

01 00d3fd70 5cfe4c64 00a49e80 00000000 77e67495 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial+0x10 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\mcs.h @

884]

02 00d3fdd8 5cfe47f6 00a474a8 000300de 0000800b mstscax!CCD::CDWndProc+0x234 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\cdint.cpp @ 267]

03 00d3fdfc 77ce7ee3 000300de 0000800b 00000000 mstscax!CCD::CDStaticWndProc+0x56 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\cdint.cpp @ 181]

04 00d3fe28 77cf2bff 5cfe47a0 000300de 0000800b USER32!InternalCallWinProc+0x1b [d:\srv03rtm\windows\core\ntuser\client\i386\callproc.asm @ 102]

05 00d3fea0 77cbe3db 00000000 5cfe47a0 000300de USER32!UserCallWinProcCheckWow+0x151 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\clmsg.c @ 165]

06 00d3ff08 77cc4014 00d3ff40 00000000 00d3ff5c USER32!DispatchMessageWorker+0x3e3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\clmsg.c @ 2497]

07 00d3ff18 5cfceda0 00d3ff40 00000000 804edc60 USER32!DispatchMessageW+0xd (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\cltxt.h @ 1046]

08 00d3ff5c 5cf7ad3c 00a49558 00d3ff84 5d04ca97 mstscax!CSND::SND_Main+0x1d0 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\sndapi.cpp @ 83]

09 00d3ff68 5d04ca97 00a49558 5cf31068 5cf30ff0 mstscax!CSND::SND_StaticMain+0xc (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\snd.h @ 40]

0a 00d3ff84 5d0d43ea 00000000 00000000 00000000 mstscax!CUT::UTStaticThreadEntry+0x77 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\util\nutint.cpp @ 209]

0b 00d3ffb8 77e41be7 00ab1ba0 00000000 00000000 mstscax!_threadstartex+0x6f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\crts\crtw32\startup\threadex.c @ 268]

0c 00d3ffec 00000000 5d0d437b 00ab1ba0 00000000 kernel32!BaseThreadStart+0x34 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\win32\client\support.c @ 533]

windbg> .open -a 5cfe1480

/****************************************************************************/

/* Name: MCSSendConnectInitial */

/* */

/* Purpose: This function generates and sends a MCS connect-initial PDU. */

/****************************************************************************/

DCVOID DCINTERNAL CMCS::MCSSendConnectInitial(ULONG_PTR unused)

{

XT_BUFHND bufHandle;

PDCUINT8 pData = NULL;

DCUINT pduLength;

DCUINT dataLength;

DCBOOL intRC;

MCS_PDU_CONNECTINITIAL ciPDU = MCS_DATA_CONNECTINITIAL;

DC_BEGIN_FN("MCSSendConnectInitial");

DC_IGNORE_PARAMETER(unused);

/************************************************************************/

/* Calculate the size of the data to send. The pdu length is the size */

/* of the Connect-Initial header plus the user data. The data length */

/* is the length transmitted in the length field of the PDU, which */

/* doesn't include the PDU type (2 bytes) or the length field (3 */

/* bytes). Thus we need to subtract 5 bytes. */

/************************************************************************/

计算要发送的数据大小。PDU长度即为该大小

连接初始报头加上用户数据。数据长度是PDU长度字段中传输的长度,即

不包含PDU类型(2个字节)或长度字段(3个字节)(以字节为单位)。

因此,我们需要减去5个字节。

pduLength = sizeof(ciPDU) + _MCS.userDataLength;

dataLength = pduLength - 5;

TRC_NRM((TB, _T("CI total length:%u (data:%u) (hc:%u user-data:%u)"),

pduLength,

dataLength,

sizeof(ciPDU),

_MCS.userDataLength));

/************************************************************************/

/* Assume that the total CI length is less than the maximum MCS send */

/* packet size. */

/************************************************************************/

TRC_ASSERT((dataLength <= MCS_MAX_SNDPKT_LENGTH),

(TB, _T("Datalength out of range: %u"), dataLength));

TRC_ASSERT((_MCS.pReceivedPacket != NULL), (TB, _T("Null rcv packet buffer")));

/************************************************************************/

/* Update the MCS CI header with the data size. */

/************************************************************************/

ciPDU.length = MCSLocalToWire16((DCUINT16)dataLength);

/************************************************************************/

/* Update the MCS user-data octet string length. */

/************************************************************************/

ciPDU.udLength = MCSLocalToWire16((DCUINT16)_MCS.userDataLength);

/************************************************************************/

/* Get a private buffer from XT. */

/************************************************************************/

intRC = _pXt->XT_GetPrivateBuffer(pduLength, &pData, &bufHandle);

if (!intRC)

{

/********************************************************************/

/* We've failed to get a private buffer. This ONLY happens when TD */

/* has disconnected while the layers above are still trying to */

/* connect. Since TD has now disconnected and is refusing to give */

/* us a buffer we might as well just give up trying to get a */

/* buffer. */

/********************************************************************/

TRC_NRM((TB, _T("Failed to get a private buffer - just quit")));

DC_QUIT;

}

/************************************************************************/

/* Now fill in the buffer that we've just got. */

/************************************************************************/

DC_MEMCPY(pData, &ciPDU, sizeof(ciPDU));

DC_MEMCPY((pData + sizeof(ciPDU)),

_MCS.pReceivedPacket,

_MCS.userDataLength);

/************************************************************************/

/* Trace out the PDU. */

/************************************************************************/

TRC_DATA_NRM("Connect-Initial PDU", pData, pduLength);

/************************************************************************/

/* Send the buffer. If everything has worked OK, we should receive a */

/* Connect-Response PDU shortly. */

/************************************************************************/

_pXt->XT_SendBuffer(pData, pduLength, bufHandle);

DC_EXIT_POINT:

DC_END_FN();

} /* MCSSendConnectInitial */

1: kd> p

mstscax!CMCS::MCSSendConnectInitial+0x1b6:

001b:5d03a926 c74580e801f35c mov dword ptr [ebp-80h],offset mstscax!__filename (5cf301e8)

1: kd> p

mstscax!CMCS::MCSSendConnectInitial+0x1bd:

001b:5d03a92d e84e5e0900 call mstscax!TRC_ProfileTraceEnabled (5d0d0780)

1: kd> t

mstscax!TRC_ProfileTraceEnabled:

001b:5d0d0780 55 push ebp

1: kd> x mstscax!trcpConfig

5d0f4070 mstscax!trcpConfig = 0x00a50000

1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)

((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]

+0x000\] traceLevel : 0x3 \[Type: unsigned long

+0x004\] dataTruncSize : 0x40 \[Type: unsigned long

+0x008\] funcNameLength : 0xc \[Type: unsigned long

+0x00c\] components : 0xfffffc1f \[Type: unsigned long

+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long

+0x014\] flags : 0x388 \[Type: unsigned long

+0x018\] prefixList \[Type: unsigned short \[100\]

+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]

1: kd> x mstscax!trcpConfig

5d0f4070 mstscax!trcpConfig = 0x00a50000

1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)

((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]

+0x000\] traceLevel : 0x3 \[Type: unsigned long

+0x004\] dataTruncSize : 0x40 \[Type: unsigned long

+0x008\] funcNameLength : 0xc \[Type: unsigned long

+0x00c\] components : 0xfffffc1f \[Type: unsigned long

+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long

+0x014\] flags : 0x388 \[Type: unsigned long

+0x018\] prefixList \[Type: unsigned short \[100\]

+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]

1: kd> ed 0xa50000 1

1: kd> ed 0xa50000+14 3a8

1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)

((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]

+0x000\] traceLevel : 0x1 \[Type: unsigned long

+0x004\] dataTruncSize : 0x40 \[Type: unsigned long

+0x008\] funcNameLength : 0xc \[Type: unsigned long

+0x00c\] components : 0xfffffc1f \[Type: unsigned long

+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long

+0x014\] flags : 0x3a8 \[Type: unsigned long

+0x018\] prefixList \[Type: unsigned short \[100\]

+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]

0: kd> g
18:41:29.35 079c:01e4 MCSSendConne 0039 Enter {
18:41:29.37 079c:01e4 MCSSendConne 0057 CI total length:405 (data:400) (hc:102 user-data:303)
18:41:29.37 079c:01e4 TD_GetPrivat 0454 Enter {
18:41:29.37 079c:01e4 TD_GetPrivat 0514 Exit }
18:41:29.37 079c:01e4 MCSSendConne 0106 Connect-Initial PDU
18:41:29.37 079c:01e4 XT_SendBuffe 0087 Enter {
18:41:29.37 079c:01e4 TD_SendBuffe 0537 Enter {
18:41:29.37 079c:01e4 TDFlushSendQ 1181 Enter {

Breakpoint 16 hit

WS2_32!send:

001b:7056b0f0 55 push ebp

1: kd> kc

00 WS2_32!send

01 WS2_32!DTHOOK_send

02 mstscax!CTD::TDFlushSendQueue

03 mstscax!CTD::TD_SendBuffer
04 mstscax!CXT::XT_SendBuffer
05 mstscax!CMCS::MCSSendConnectInitial

06 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial

07 mstscax!CCD::CDWndProc

08 mstscax!CCD::CDStaticWndProc

09 USER32!InternalCallWinProc

0a USER32!UserCallWinProcCheckWow

0b USER32!DispatchMessageWorker

0c USER32!DispatchMessageW

0d mstscax!CSND::SND_Main

0e mstscax!CSND::SND_StaticMain

0f mstscax!CUT::UTStaticThreadEntry

10 mstscax!_threadstartex

11 kernel32!BaseThreadStart

1: kd> !handle 0000030c

PROCESS 8969a8e8 SessionId: 0 Cid: 079c Peb: 7ffdf000 ParentCid: 07e4

DirBase: 77609000 ObjectTable: e1260120 HandleCount: 115.

Image: mstsc.exe

Handle table at e1260120 with 115 entries in use

030c: Object: 89271140 GrantedAccess: 0016019f (Inherit) Entry: e1130618

Object: 89271140 Type: (89df9710) File

ObjectHeader: 89271128 (old version)

HandleCount: 1 PointerCount: 2

Directory Object: 00000000 Name: \Endpoint {Afd}

1: kd> db 000a5400

000a5400 03 00 01 9c 02 f0 80 7f-65 82 01 90 04 01 01 04 ........e.......

000a5410 01 01 01 01 ff 30 19 02-01 22 02 01 02 02 01 00 .....0..."......

000a5420 02 01 01 02 01 00 02 01-01 02 02 ff ff 02 01 02 ................

000a5430 30 19 02 01 01 02 01 01-02 01 01 02 01 01 02 01 0...............

000a5440 00 02 01 01 02 02 04 20-02 01 02 30 1c 02 02 ff ....... ...0....

000a5450 ff 02 02 fc 17 02 02 ff-ff 02 01 01 02 01 00 02 ................

000a5460 01 01 02 02 ff ff 02 01-02 04 82 01 2f 00 05 00 ............/...

000a5470 14 7c 00 01 81 26 00 08-00 10 00 01 c0 00 44 75 .|...&........Du