Как определить кто вызвал RPC запрос?

Тема в разделе "WASM.SOFTWARE", создана пользователем mitek, 13 янв 2012.

  1. mitek

    mitek New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2012
    Сообщения:
    4
    Есть такая проблема - какой-то процесс через RPC дергает функцию SetPrinterData в spoolsv.exe. Как определить что это за процесс?

    Пробовал поймать в WinDbg вызов этой функции в spoolsv.exe и воспользоваться командой !rpcexts.getcallinfo как написано в help-е для WinDbg (тема Identifying the Caller From the Server Thread), но почему-то ни одного активного вызова эта команда мне не выдает.

    Вот стек вызова:
    Код (Text):
    1. 0:016> k
    2. k
    3. Child-SP          RetAddr           Call Site
    4. 00000000`0484e908 00000000`ff593c7c spoolsv!SetPrinterDataExW
    5. 00000000`0484e910 00000000`ff58e7c3 spoolsv!YSetPrinterDataEx+0x58
    6. 00000000`0484e950 000007fe`fee1c7f5 spoolsv!RpcSetPrinterDataEx+0x7b
    7. 00000000`0484e9b0 000007fe`feecb62e RPCRT4!Invoke+0x65
    8. 00000000`0484ea20 000007fe`fee14070 RPCRT4!Ndr64StubWorker+0x61b
    9. 00000000`0484efe0 000007fe`fee19c24 RPCRT4!NdrServerCallAll+0x40
    10. 00000000`0484f030 000007fe`fee19d86 RPCRT4!DispatchToStubInCNoAvrf+0x14
    11. 00000000`0484f060 000007fe`fee1a479 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146
    12. 00000000`0484f180 000007fe`fee1a11d RPCRT4!LRPC_SCALL::DispatchRequest+0x149
    13. 00000000`0484f260 000007fe`fee27ddf RPCRT4!LRPC_SCALL::HandleRequest+0x20d
    14. 00000000`0484f390 000007fe`fee27995 RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf
    15. 00000000`0484f4d0 00000000`772bb43b RPCRT4!LrpcIoComplete+0xa5
    16. 00000000`0484f560 00000000`772b923f ntdll!TppAlpcpExecuteCallback+0x26b
    17. 00000000`0484f5f0 00000000`7709f56d ntdll!TppWorkerThread+0x3f8
    18. 00000000`0484f8f0 00000000`772d3281 kernel32!BaseThreadInitThunk+0xd
    19. 00000000`0484f920 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
    А это результат команды !rpcexts.getcallinfo:
    Код (Text):
    1. 0:016> !rpcexts.getcallinfo 0 0 FFFF 638
    2. !rpcexts.getcallinfo 0 0 FFFF 638
    3. Searching for call info ...
    4. PID  CELL ID   ST PNO IFSTART  THRDCELL  CALLFLAG CALLID   LASTTIME CONN/CLN
    5. ----------------------------------------------------------------------------
    6. 0638 0000.0003 00 000 00000000 0000.0000 0000000a 00000000 0000ae7f 0000.0000
    7. 0638 0000.0004 00 000 00000000 0000.0000 0000000a 00000000 0000ae7f 0000.0000
    8. 0638 0000.0005 00 000 00000000 0000.0000 00000008 00000000 00016656 0000.0000
    9. 0638 0000.0006 00 000 00000000 0000.0000 0000000a 00000000 0005a252 0000.0000
    10. 0638 0000.0007 00 000 00000000 0000.0000 0000000a 00000000 0005a31d 0000.0000
    11. 0638 0000.0008 00 000 00000000 0000.0000 0000000a 00000000 0005a9c4 0000.0000
    12. 0638 0000.000a 00 000 00000000 0000.0000 0000000a 00000000 0005bf6f 0000.0000
    13. 0:016>
    Как видно ни одного активного call-а почему-то нет (ST должен быть 02 или 01) и соответственно !rpcexts.getdbgcell для соединения 0.0 выдает ошибку:
    Код (Text):
    1. 0:016> !rpcexts.getdbgcell 638 0.0
    2. !rpcexts.getdbgcell 638 0.0
    3. Getting cell info ...
    4. Getting cell info failed with error 2
    5. 0:016>
    Пробовал !rpcexts.getdbgcell для вызовов, но для всех выдает нулевые Caller PID/TID:
    Код (Text):
    1. 0:016> !rpcexts.getdbgcell 638 0.a
    2. !rpcexts.getdbgcell 638 0.a
    3. Getting cell info ...
    4. Call
    5. Status: Allocated
    6. Procedure Number: 0
    7. Interface UUID start (first DWORD only): 0
    8. Call ID: 0x0 (0)
    9. Servicing thread identifier: 0x0.0
    10. Call Flags:async, LRPC
    11. Last update time (in seconds since boot):376.687 (0x178.2AF)
    12. Caller (PID/TID) is: 0.0 (0.0)
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa373831%28v=vs.85%29.aspx
    Думаю как действовать очевидно ...
     
  3. mitek

    mitek New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2012
    Сообщения:
    4
    Мне что-то не очень очевидно... По этой ссылке описаны макросы, которые используются в RPC для обработки исключений. Каким образом это может помочь в определении PID процесса сделавшего RPC вызов?
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    RPC реальзован через LPC, при последнем передаётся CID. Я бы оттуда взял.
     
  5. mitek

    mitek New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2012
    Сообщения:
    4
    Спасибо за толчок в правильном направлении. Но как этот CID найти?
    Нашел я один способ через поиск глазами пары 16-битных значений в стеке - http://www.dumpanalysis.org/blog/index.php/2011/02/19/crash-dump-analysis-patterns-part-130a/ - даже стек там на мой похож, но к сожалению в моем случае ничего похожего на реальный CID таким способом найти не могу :dntknw:
    Код (Text):
    1. 0: kd> !thread fffffa8002b54510 ff
    2. THREAD fffffa8002b54510  Cid 063c.057c  Teb: 000007fffff9e000 Win32Thread: fffff900c1c2fc30 WAIT: (Executive) KernelMode Non-Alertable
    3. SuspendCount 1
    4.     fffff8800cd3a090  SynchronizationEvent
    5. Impersonation token:  fffff8a006deb060 (Level Impersonation)
    6. DeviceMap                 fffff8a006dcd8d0
    7. Owning Process            fffffa8002170b30       Image:         spoolsv.exe
    8. Attached Process          N/A            Image:         N/A
    9. Wait Start TickCount      87171          Ticks: 26 (0:00:00:00.406)
    10. Context Switch Count      3417                 LargeStack
    11. UserTime                  00:00:00.156
    12. KernelTime                00:00:00.375
    13. Win32 Start Address ntdll!TppWorkerThread (0x0000000076e98f00)
    14. Stack Init fffff8800cd3adb0 Current fffff8800cd39da0
    15. Base fffff8800cd3b000 Limit fffff8800cd32000 Call 0
    16. Priority 10 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
    17. Child-SP          RetAddr           Call Site
    18. fffff880`0cd39de0 fffff800`016d6052 nt!KiSwapContext+0x7a
    19. fffff880`0cd39f20 fffff800`016d81af nt!KiCommitThreadWait+0x1d2
    20. fffff880`0cd39fb0 fffff800`01a71c38 nt!KeWaitForSingleObject+0x19f
    21. fffff880`0cd3a050 fffff800`01a71fbc nt!DbgkpQueueMessage+0x2a8
    22. fffff880`0cd3a220 fffff800`01a153b6 nt!DbgkpSendApiMessage+0x5c
    23. fffff880`0cd3a260 fffff800`017092f3 nt! ?? ::NNGAKEGL::`string'+0x3547d
    24. fffff880`0cd3a3a0 fffff800`016ce542 nt!KiDispatchException+0x273
    25. fffff880`0cd3aa40 fffff800`016cc374 nt!KiExceptionDispatch+0xc2
    26. fffff880`0cd3ac20 00000000`ff47ab7d nt!KiBreakpointTrap+0xf4 (TrapFrame @ fffff880`0cd3ac20)
    27. 00000000`04a7ede8 00000000`ff463c7c spoolsv!SetPrinterDataExW+0x1
    28. 00000000`04a7edf0 00000000`ff45e7c3 spoolsv!YSetPrinterDataEx+0x58
    29. 00000000`04a7ee30 000007fe`fee2c7f5 spoolsv!RpcSetPrinterDataEx+0x7b
    30. 00000000`04a7ee90 000007fe`feedb62e RPCRT4!Invoke+0x65
    31. 00000000`04a7ef00 000007fe`fee24070 RPCRT4!Ndr64StubWorker+0x61b
    32. 00000000`04a7f4c0 000007fe`fee29c24 RPCRT4!NdrServerCallAll+0x40
    33. 00000000`04a7f510 000007fe`fee29d86 RPCRT4!DispatchToStubInCNoAvrf+0x14
    34. 00000000`04a7f540 000007fe`fee2a479 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146
    35. 00000000`04a7f660 000007fe`fee2a11d RPCRT4!LRPC_SCALL::DispatchRequest+0x149
    36. 00000000`04a7f740 000007fe`fee37ddf RPCRT4!LRPC_SCALL::HandleRequest+0x20d
    37. 00000000`04a7f870 000007fe`fee37995 RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf
    38. 00000000`04a7f9b0 00000000`76e9b43b RPCRT4!LrpcIoComplete+0xa5
    39. 00000000`04a7fa40 00000000`76e9923f ntdll!TppAlpcpExecuteCallback+0x26b
    40. 00000000`04a7fad0 00000000`76c7f56d ntdll!TppWorkerThread+0x3f8
    41. 00000000`04a7fdd0 00000000`76eb3281 kernel32!BaseThreadInitThunk+0xd
    42. 00000000`04a7fe00 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
    Код (Text):
    1. 0: kd> dpp /p 00000000`04a7f740 l40
    2. 00000000`04a7f740  00230031`0076002f
    3. 00000000`04a7f748  00760067`00650052
    4. 00000000`04a7f750  00710045`006c0061
    5. 00000000`04a7f758  0073006c`00610075
    6. 00000000`04a7f760  00000000`00000000
    7. 00000000`04a7f768  006c0070`00700061
    8. 00000000`04a7f770  00740061`00630069
    9. 00000000`04a7f778  0073006e`006f0069
    10. 00000000`04a7f780  00000000`00000000
    11. 00000000`04a7f788  006c0070`00700061
    12. 00000000`04a7f790  00740061`00630069
    13. 00000000`04a7f798  0000006e`006f0069
    14. 00000000`04a7f7a0  006b0073`00610074
    15. 00000000`04a7f7a8  00000000`00000000
    16. 00000000`04a7f7b0  00650074`00610063
    17. 00000000`04a7f7b8  00790072`006f0067
    18. 00000000`04a7f7c0  00000000`00000000
    19. 00000000`04a7f7c8  00650072`00640069
    20. 00000000`04a7f7d0  00000000`00000066
    21. 00000000`04a7f7d8  000007fe`fe0297f8
    22. 00000000`04a7f7e0  00000000`00000000
    23. 00000000`04a7f7e8  00000000`00000000
    24. 00000000`04a7f7f0  00000000`00000000
    25. 00000000`04a7f7f8  404b45f6`e998ed4d
    26. 00000000`04a7f800  c8ed4639`9a7f708c
    27. 00000000`04a7f808  000007fe`fe029828
    28. 00000000`04a7f810  00000000`00000010
    29. 00000000`04a7f818  00000000`00000000
    30. 00000000`04a7f820  00000000`00000000
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    mitek
    Если клиент сделал вызов на сервер(RPC), сервер в данной процедуре генерит исключения кто его будет обрабатвать? (если сервер хендлер не поставил)...