CsrClientCallServer в Windows 7

Тема в разделе "WASM.WIN32", создана пользователем amdf, 1 сен 2011.

  1. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    При создании процесса вручную нужно уведомлять csrss. В старых примерах это делается так:

    CsrClientCallServer(&csrmsg, 0, 0x10000, 0x24);

    Последний параметр это размер структуры, он разный в разных версиях Windows.
    Во всех найденных примерах в csrmsg устанавливают всего четыре-пять полей, а остальное инициализируют нулями, и это работает.
    В Windows 7 x86 размер структуры 272 байта и если инициализировать их нулями, то процесс не регистрируется.

    Как наиболее легко разобраться в формате структуры и в том, чем её инициализировать для правильной регистрации процесса?
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    посмотреть в отладчике как правильно вызывается функция
     
  3. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    прототип
    Код (Text):
    1. typedef struct _PORT_MESSAGE
    2. {
    3.     USHORT      DataSize;
    4.     USHORT      MessageSize;
    5.     USHORT      MessageType;
    6.     USHORT      VirtualRangesOffset;
    7.     CLIENT_ID   ClientId;
    8.     ULONG       MessageId;
    9.     ULONG       SectionSize;
    10. //  UCHAR       Data[];
    11. } PORT_MESSAGE, *PPORT_MESSAGE;
    12.  
    13. typedef struct _CSR_CAPTURE_HEADER {
    14.     ULONG Length;
    15.     struct _CSR_CAPTURE_HEADER *RelatedCaptureBuffer;
    16.     ULONG CountMessagePointers;
    17.     PCHAR FreeSpace;
    18.     ULONG_PTR MessagePointerOffsets[1]; // Offsets within CSR_API_MSG of pointers
    19. } CSR_CAPTURE_HEADER, *PCSR_CAPTURE_HEADER;
    20.  
    21. typedef ULONG CSR_API_NUMBER;
    22.  
    23. typedef struct  _BASE_CREATETHREAD_MSG
    24. {
    25.     HANDLE hThread;
    26.     CLIENT_ID ClientId;
    27. }BASE_CREATETHREAD_MSG, *PBASE_CREATETHREAD_MSG;
    28.  
    29.  
    30. typedef struct _PBASE_CREATEPROCESS_MSG
    31. {
    32.     HANDLE hProcess;
    33.     HANDLE hThread;
    34.     DWORD dwProcessId;
    35.     DWORD dwThreadId;
    36.     DWORD CreationFlags;
    37.     CLIENT_ID DebuggerClientId;
    38.     DWORD VdmBinaryType;
    39. }BASE_CREATEPROCESS_MSG ,*PBASE_CREATEPROCESS_MSG;
    40.  
    41. typedef struct _BASE_API_MSG
    42. {
    43.     PORT_MESSAGE          PortMessage;
    44.     PCSR_CAPTURE_HEADER   CaptureBuffer;
    45.     CSR_API_NUMBER        ApiNumber;
    46.     ULONG                 Status;
    47.     ULONG                 Reserved;
    48.     union
    49.     {
    50.        BASE_CREATETHREAD_MSG  BaseCreateThread;
    51.        BASE_CREATEPROCESS_MSG BaseCreateProcess;
    52.     }u;
    53. }BASE_API_MSG,*PBASE_API_MSG;
    54.  
    55. typedef struct _CSR_API_CONNECTINFO
    56. {
    57.     OUT HANDLE ObjectDirectory;
    58.     OUT PVOID SharedSectionBase;
    59.     OUT PVOID SharedStaticServerData;
    60.     OUT PVOID SharedSectionHeap;
    61.     OUT ULONG DebugFlags;
    62.     OUT ULONG SizeOfPebData;
    63.     OUT ULONG SizeOfTebData;
    64.     OUT ULONG NumberOfServerDllNames;
    65.     OUT HANDLE ServerProcessId;
    66. } CSR_API_CONNECTINFO, *PCSR_API_CONNECTINFO;
    67.  
    68. typedef struct _CSR_CLIENTCONNECT_MSG
    69. {
    70.     IN ULONG ServerDllIndex;
    71.     IN OUT PVOID ConnectionInformation;
    72.     IN OUT ULONG ConnectionInformationLength;
    73. } CSR_CLIENTCONNECT_MSG, *PCSR_CLIENTCONNECT_MSG;
    74.  
    75. typedef struct _CSR_API_MSG
    76. {
    77.     PORT_MESSAGE h;
    78.     union
    79.     {
    80.             CSR_API_CONNECTINFO ConnectionRequest;
    81.             struct
    82.             {
    83.                 PCSR_CAPTURE_HEADER CaptureBuffer;
    84.                 CSR_API_NUMBER ApiNumber;
    85.                 ULONG ReturnValue;
    86.                 ULONG Reserved;
    87.                 union
    88.                 {
    89.                     CSR_CLIENTCONNECT_MSG ClientConnect;
    90.                     ULONG_PTR ApiMessageData[39];
    91.                 } u;
    92.             };
    93.     };
    94. } CSR_API_MSG, *PCSR_API_MSG;
    95.  
    96.  
    97. NTSYSAPI
    98. NTSTATUS
    99. NTAPI
    100. CsrClientCallServer(
    101.         IN OUT PCSR_API_MSG m,
    102.         IN OUT PCSR_CAPTURE_HEADER CaptureBuffer OPTIONAL,
    103.         IN CSR_API_NUMBER ApiNumber,
    104.         IN ULONG ArgLength
    105. );
    уведомления потока делал так (работало xp\vista\seven)
    Код (Text):
    1. HANDLE hRemoteThread;
    2.                            CLIENT_ID ThreadClientId;
    3.                            NtStatus = NtCreateThread(&hRemoteThread,THREAD_ALL_ACCESS,&ObjectAttributes,hProcess,&ThreadClientId,&ThreadContext,&InitialTeb,TRUE);
    4.                            if (NT_SUCCESS(NtStatus))
    5.                            {
    6.                                BASE_API_MSG BaseApiMsg;
    7.                                PBASE_CREATETHREAD_MSG pBaseCreateThread;
    8.                                MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0);
    9.                                pBaseCreateThread = (PBASE_CREATETHREAD_MSG)&BaseApiMsg.u.BaseCreateThread;
    10.                                pBaseCreateThread->hThread = hRemoteThread;
    11.                                pBaseCreateThread->ClientId = ThreadClientId;
    12.                                // inform client server subsystem of new thread in process
    13.                                NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10001,0x0C);
    14.                                if (NT_SUCCESS(NtStatus))
    15.                                {
    16.                                   NtStatus = NtResumeThread(hRemoteThread,NULL);
    17.                                }
    18.                                NtClose(hRemoteThread);
    19.                            }
    уведомление для процесса
    Код (Text):
    1.  BASE_API_MSG BaseApiMsg;
    2.  PBASE_CREATEPROCESS_MSG pBaseCreateProcess=(PBASE_CREATEPROCESS_MSG)&BaseApiMsg.u.BaseCreateProcess;
    3.  MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0);
    4.  pBaseCreateProcess->hProcess = hProcess;
    5.  pBaseCreateProcess->hThread =hThread;
    6.  pBaseCreateProcess->dwProcessId = pid;
    7.  pBaseCreateProcess->dwThreadId = tid;
    8.  NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10000,0x20);
    9.  if(NT_SUCCESS(NtStatus))
    10.  {
    11.    
    12.     // ... ... ...
    13.  }
     
  4. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    Спасибо, попробую так.