ZwSecureConnectPort к порту \\Windows\\ApiPort return C0000041

Тема в разделе "WASM.WIN32", создана пользователем yurza, 7 авг 2009.

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Народ не подскажите возможно ли вообше подключится к этому порту из Usermode
    делаю так
    Код (Text):
    1. int main(int argc, char* argv[])
    2. {
    3.     HANDLE PortSection,PortHandle;
    4.     NTSTATUS Status;
    5.     PORT_SECTION_WRITE ClientWr;
    6.     PORT_SECTION_READ  SerRead;
    7.     PSID SysSid;
    8.     SID_IDENTIFIER_AUTHORITY NtAuth = SECURITY_NT_AUTHORITY;
    9.     ULONG ConnectDataLength;
    10.     CSR_API_CONNECTINFO ConnectData;
    11.     ULONG MaxMessageSize;
    12.     UNICODE_STRING  PortName;
    13.  
    14.     SECURITY_QUALITY_OF_SERVICE Qos;
    15.     Qos.Length=sizeof(SECURITY_QUALITY_OF_SERVICE);
    16.     Qos.ImpersonationLevel=SecurityImpersonation;
    17.     Qos.ContextTrackingMode=SECURITY_DYNAMIC_TRACKING;
    18.     Qos.EffectiveOnly=TRUE;
    19.  
    20.     LARGE_INTEGER SectionSize;
    21.     SectionSize.HighPart=0;
    22.     SectionSize.LowPart=0x10000;
    23.  
    24.     Status = NtCreateSection( &PortSection,
    25.                               SECTION_ALL_ACCESS,
    26.                               NULL,
    27.                               &SectionSize,
    28.                               PAGE_READWRITE,
    29.                               SEC_RESERVE,
    30.                               NULL
    31.                             );
    32.     if(!NT_SUCCESS(Status)) {
    33.         return Status;}
    34.  
    35.     ClientWr.Length=sizeof(PORT_SECTION_WRITE);
    36.     ClientWr.SectionHandle=PortSection;
    37.     ClientWr.SectionOffset=0;
    38.     ClientWr.ViewSize= SectionSize.LowPart;
    39.     ClientWr.ViewBase=0;
    40.     ClientWr.TargetViewBase=0;
    41.  
    42.     SerRead.Length=sizeof(PORT_SECTION_READ);
    43.     SerRead.ViewSize=0;
    44.     SerRead.ViewBase=0;
    45.  
    46.     SysSid=NULL;
    47.     Status = RtlAllocateAndInitializeSid( &NtAuth,
    48.                                           1,
    49.                                           SECURITY_LOCAL_SYSTEM_RID,
    50.                                           0, 0, 0, 0, 0, 0, 0,
    51.                                           &SysSid
    52.                                         );
    53.     if(!NT_SUCCESS(Status)) {
    54.         return Status;}
    55.  
    56.     ConnectDataLength = sizeof(ConnectData);
    57.     ConnectData.ExpectedVersion=0x000001;
    58.  
    59.     RtlInitUnicodeString(&PortName,L"\\Windows\\ApiPort");
    60.                                    
    61.     Status=ZwSecureConnectPort( &PortHandle,
    62.                                 &PortName,
    63.                                 &Qos,
    64.                                 &ClientWr,
    65.                                 SysSid,
    66.                                 &SerRead,
    67.                                 &MaxMessageSize,
    68.                                 (PVOID)&ConnectData,
    69.                                 &ConnectDataLength
    70.                             );
    71.     if(!NT_SUCCESS(Status)) {
    72.         printf( "CSRDLL: Server - Status == %X\n",Status);
    73.         return Status;}
    74.  
    75.  
    76.     RtlFreeSid(SysSid);
    77.     NtClose(PortSection);
    78.  
    79.     return(STATUS_SUCCESS);
    printf( "CSRDLL: Server - Status == %X\n",Status); Возврашает C0000041 мож что не так делаю
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Он защищен секьюрити дескриптором, добавь в ACL нужные права доступа и потом уже открывай.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ошибка возвращается так как сервер отклоняет запрос, ибо процесс уже подключен к этому порту(на него подаются запросы из CsrClientCallServer(), коннект на стадии инициализации в CsrpConnectToServer(), хэндл в CsrPortHandle(деф. 0x18, ссылки в CsrNewThread() etc.), защищён от закрытия(чтобы разрешить закрытие закрыть установить ObjectHandleInformation.ProtectFromClose).
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    А точно, там же порт занят уже этим же процессом...
     
  5. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Значит я так понял что нельзя так просто подключится, а вот интересно из драйвера можно?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    yurza
    Процесс уже есть в списках сервера, драйвер ничего не даст.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстати вам это чтоб свою секцию при коннекте указать ?
    Если это так, то багу эту уже давно пофиксили. Для других целей достаточно использовать CsrClientCallServer().
     
  8. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    По совету Clerk (спасибо что выделил время) решил посмотреть в сторону CsrClientCallServer нашел исходник одно прожки которая выводит ConsoleTitle
    и возник такоя вапрос
    Код (Text):
    1. int main(int argc, char* argv[])
    2. {
    3.  NTSTATUS Status;
    4.     CSR_API_MSG m;
    5.     PCONSOLE_TITLE_MSG b=&m.u.ConsoleTitle;
    6.     PCSR_CAPTURE_HEADER CaptureBuffer;
    7.  
    8.     RtlZeroMemory(&m, sizeof(m));
    9.  
    10.     b->ConsoleHandle=GetConsoleHandle();
    11.     b->TitleLen=260;
    12.     b->Unicode=0;
    13.  
    14.     CaptureBuffer=(PCSR_CAPTURE_HEADER)CsrAllocateCaptureBuffer(1, b->TitleLen);
    15.    
    16.     CsrCaptureMessageBuffer(CaptureBuffer,
    17.                             NULL,
    18.                             b->TitleLen,
    19.                             (PVOID *)&b->Title);
    20.  
    21.     Status=CsrClientCallServer((PCSR_API_MSG)&m,
    22.                 CaptureBuffer,
    23.                 CSR_MAKE_API_NUMBER(CONSRV_SERVERDLL_INDEX, CONSRV_FIRST_API_NUMBER+38),
    24.                 sizeof(m));
    25.     printf("ConsoleTitle is : %X\n",m.ApiNumber);
    26.     if(!NT_SUCCESS(Status))
    27.     {
    28.         printf("Error with CsrClientCallServer : 0x%X\n", Status);
    29.         CsrFreeCaptureBuffer(CaptureBuffer);
    30.         return 0;
    31.     }
    32.  
    33.     printf("ConsoleTitle is : %s\n", m.u.ConsoleTitle.Title);
    34.  
    35.     CsrFreeCaptureBuffer(CaptureBuffer);
    36.     return 0;
    37. }
    Так вод не понятно откуда это CONSRV_FIRST_API_NUMBER+38 почему именно 38 и как это определить для других функции
    В m.ApiNumber у меня 20226h т.е. по IDA смотрю модуль kernel32.dll

    Код (Text):
    1. .text:79469B07                 push    10h
    2. .text:79469B09                 push    20226h
    3. .text:79469B0E                 push    ebx
    4. .text:79469B0F                 lea     eax, [ebp+var_C0]
    5. .text:79469B15                 push    eax
    6. .text:79469B16                 call    ds:CsrClientCallServer
    т.е. все нормально но вот почему именно надо прибавить 38 если# define CONSRV_FIRST_API_NUMBER 512
    это пока для меня загадка

    За ранее благодарен.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    CONSRV_FIRST_API_NUMBER = 0x200
    38 = 0x26
    0x200 + 0x26 = 0x226, что ты и видишь в IDA.
    В общем случае определяется реверсом.
     
  10. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    38 это индекс ф-ции в таблице функций процесса csrss (таблиц всего 4)