How to identify the process and thread being called in a COM call from a thread stack
I’ve just published a post on how to manually identify which classic ASP page is being processed by a specific thread. Following the same idea you can also identify COM calls being made by a thread. As always, first identify the thread doing the COM call you want investigate and then look at the thread stack as below:
<0:032>
0:032> kb100
ChildEBP RetAddr Args to Child
0235e93c 7c822114 77e6711b 00000002 0235e98c ntdll!KiFastSystemCallRet
0235e940 77e6711b 00000002 0235e98c 00000001 ntdll!NtWaitForMultipleObjects+0xc
0235e9e8 7739cd08 00000002 0235ea10 00000000 kernel32!WaitForMultipleObjectsEx+0x11a
0235ea44 77697483 00000001 0235ea8c 000003e8 USER32!RealMsgWaitForMultipleObjectsEx+0x141
0235ea6c 776974f2 0235ea8c 000003e8 0235ea9c ole32!CCliModalLoop::BlockFn+0x8
0235ea94 7778866b ffffffff 0235eb94 000e513c ole32!ModalLoop+0x5b
0235eab0 77788011 00000000 00000000 00000000 ole32!ThreadSendReceive+0xa0
0235eacc 77787ed7 0235eb94 0011825c 0235ebf0 le32!CRpcChannelBuffer::SwitchAptAndDispatchCall+0x112
0235ebac 776975b8 0011825c 0235ecc0 0235ecb0 ole32!CRpcChannelBuffer::SendReceive2+0xc1
0235ebc8 7769756a 0235ecc0 0235ecb0 0011825c ole32!CCliModalLoop::SendReceive+0x1e
0235ec34 776c4eee 0011825c 0235ecc0 0235ecb0 ole32!CAptRpcChnl::SendReceive+0x6f
0235ec88 77ce127e 00000001 0235ecc0 0235ecb0 ole32!CCtxComChnl::SendReceive+0x91
0235eca4 77ce13ca 0011750c 0235ecec 00000000 RPCRT4!NdrProxySendReceive+0x43
0235f08c 77d0c947 77d12028 77d150c2 0235f0ac RPCRT4!NdrClientCall2+0x206
0235f0a4 77d0c911 0011750c 60030001 73464c18 OLEAUT32!IDispatch_RemoteInvoke_Proxy+0x1c
0235f364 73469f71 0011750c 60030001 73464c18 OLEAUT32!IDispatch_Invoke_Proxy+0xb6
0235f3b8 73468f37 01ef0100 0011750c 60030001 vbscript!CatchIDispatchInvoke+0x46
0235f3f8 73468ea6 01ef0288 0011750c 60030001 vbscript!IDispatchInvoke2+0xaf
0235f434 73469000 01ef0288 0011750c 60030001 vbscript!IDispatchInvoke+0x59
0235f548 73467bb6 01ef0288 00000000 60030001 vbscript!InvokeDispatch+0x13a
0235f56c 73467cad 01ef0288 0011750c 60030001 vbscript!InvokeByName+0x42
0235f848 73464940 00000000 00000000 01ef0288 vbscript!CScriptRuntime::Run+0x1331
0235f940 73464cd2 00000000 00000000 00000000 vbscript!CScriptEntryPoint::Call+0x5c
0235f998 73465522 01ef0768 00000000 00000000 vbscript!CSession::Execute+0xb4
0235f9e8 7346189b 00000000 00000000 709e19b4 vbscript!COleScript::ExecutePendingScripts+0x13e
0235fa04 709e2f5a 01612040 01612040 01112700 vbscript!COleScript::SetScriptState+0x150
0235fa30 709e2f1a 00000000 709e19b4 0235fb38 asp!CActiveScriptEngine::TryCall+0x19
0235fa6c 709e2e50 00000000 647246fe 014123e8 asp!CActiveScriptEngine::Call+0x31
0235fa88 709e2d54 0235fb0c 00000000 00000000 asp!CallScriptFunctionOfEngine+0x5b
0235fadc 709e2c7f 01911e90 00000000 0235fb68 asp!ExecuteRequest+0x17e
0235fb44 709e2a4d 01911e90 014123e8 0235fb68 asp!Execute+0x249
0235fb98 709e271a 00000000 00000000 00114c28 asp!CHitObj::ViperAsyncCallback+0x3e8
0235fbb4 75bd748e 01493048 00097be8 0235fd74 asp!CViperAsyncRequest::OnCall+0x92
0235fbd0 7770f153 00114c28 000a4178 00000000 COMSVCS!CSTAActivityWork::STAActivityWorkHelper+0x32
0235fc1c 7770fba0 00000000 000a4178 75bd745c ole32!EnterForCallback+0xc4
0235fd7c 777100aa 0235fc54 75bd745c 00114c28 ole32!SwitchForCallback+0x1a3
0235fda8 7769408c 000a4178 75bd745c 00114c28 ole32!PerformCallback+0x54
0235fe40 77712865 00097be8 75bd745c 00114c28 ole32!CObjectContext::InternalContextCallback+0x159
0235fe60 75bd7831 00097be8 75bd745c 00114c28 ole32!CObjectContext::DoCallback+0x1c
0235fecc 75bd7b95 00114e18 00114df8 001147c4 COMSVCS!CSTAActivityWork::DoWork+0x12d
0235fee4 75bd852e 00114c28 00000001 00114df8 COMSVCS!CSTAThread::DoWork+0x18
0235ff04 75bd897a 00000000 01eefcb0 00039608 COMSVCS!CSTAThread::ProcessQueueWork+0x37
0235ff84 77bcb530 00114df8 00000000 00000000 COMSVCS!CSTAThread::WorkerLoop+0x17c
0235ffb8 77e66063 00039608 00000000 00000000 msvcrt!_endthreadex+0xa3
0235ffec 00000000 77bcb4bc 00039608 00000000 kernel32!BaseThreadStart+0x34
Now identify the function call ole32!CRpcChannelBuffer::SendReceive2 above. Grab the first parameter and run the following command:
0:032> dd poi(0011825c +18)+8 l2
000de8d0 00000d8c 00000ddc
The output above represents the process ID (in this case the hex number 0xd8c) of the server process for this COM call and the thread ID (in this case the hex number 0xddc).
Notice that the output values are in hex format and your PID (the one you identify by using task manager, tlist, tasklist etc) info will probably be in decimal format so you still need to make the convertion:
In this case the PID of the server process being called in this thread would be 3462 = 00000d86.
Comments
Anonymous
January 01, 2003
PingBack from http://www.keyongtech.com/2648315-how-to-find-destination-pidAnonymous
June 30, 2014
Halfway there.