CsrClientCallServer

Тема в разделе "WASM.WIN32", создана пользователем soveren, 2 апр 2008.

  1. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Добрый день.

    Не поделитесь значениями четвертого параметра CsrClientCallServer при создании процесса под Windows 2003/Vista, может кто пробовал и знает?

    Для 2000 SP4, Windows XP это значения 0x28 и 0х2C соответственно.

    CsrClientCallServer(&csrmsg, NULL, 0x10000, Flag);

    Спасибо.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Как вариант - загони вызов функции в цикл, и вызывай до посинения.. тьфу, до необходимого результата
     
  3. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    0xC0000142 на Windows 2003 при подобном переборе. Вроде бы там должно быть значение 0x90, но что-то не получается все равно :dntknw:
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    да 0x90 для SP1. Для SP0 может быть другим.
    Есть такая вероятность что формат сообщений может быть различен в разных версиях.
     
  5. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Если кому интересно, вот 0x20 для Windows XP SP3, только что проверил.

    n0name
    Я как раз смотрел kernel32.dll от оригинального 2003, там 0х90.
    И я так понимаю, посмотреть этот формат никак нельзя :dntknw: Хотя в принципе же ядро 2003, основано на XP, вот может быть в Viste крупные изменения...

    Между прочим, если попробовать перебор, то эта функция иногда будет возвращать STATUS_SUCCESS и при этом ничего происходить не будет.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    последний параметр это размер сообщения


    NTSTATUS CsrClientCallServer ( IN OUT PCSR_API_MSG m,
    IN OUT PCSR_CAPTURE_HEADER CaptureBuffer OPTIONAL,
    IN CSR_API_NUMBER ApiNumber,
    IN ULONG ArgLength
    )



    Definition at line 25 of file csrutil.c.

    References CsrPortHandle, CsrPortMemoryRemoteDelta, CsrServerApiRoutine, CsrServerProcess, DbgPrint, FALSE, IF_DEBUG, NT_SUCCESS, NtRequestWaitReplyPort(), NTSTATUS(), NULL, and Status.
     
  7. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Размер какой структуры? PORT_MESSAGE + CSRSS_MESSAGE? Или?
     
  8. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Под всеми 2003, SP0, SP1, SP2 значение одно и то же x90, но толку от этого 0 :dntknw:
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это размер данных, для каждого сервиса свой.
    Например для GetConsoleScreenBufferInfo это размер структуры
    {
    ConsoleHandle HANDLE ?
    ConsoleScreenBuffer HANDLE ?
    }
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PCSR_API_MSG содержит структуру сервиса, уникальную для него и эта структура включает размер ArgLength
     
  11. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Clerk

    Это и так ясно. Неясно почему не работает выше XP. Может кто пробовал создавать процесс под Windows 2003, Vista через native api? У кого-нибудь получилось?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Так в чём проблема ?
    Влом отладчиком ntdll открыть или это за тебя сделать ?
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    потому что используются разные структуры передаваемые этой функции.
     
  14. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Clerk
    При чем тут ntdll? Вызов этой функции с подготовкой параметров проходит в kernel32.dll, ну если хочешь - валяй.
    n0name
    Оно то понятно, неужто механизм взаимодействия с клиентсерверным приложением притерпел такие изменения... А структур то этих не найти.
     
  15. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Нашел вот это http://code.google.com/p/native-nt-toolkit
    выглядит многообещающе.
     
  16. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Ах ты елки, нужных структур все равно нет.
     
  17. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Ок, оказывается это совершенно неисследованная часть API.
    А ведь на самом деле здесь очень много интересного, эта функция поддерживает отсылку различных сообщений csrss, которые могут делать довольно интересные вещи, мониторить, запрещать создание процессов, инжектить длл и т.п. Похоже что CSR_API_MSG это основанный на обычном LPC протокол, который очень разнится для различных действий. И эти структуры совершенно недокументированны и меняются от билда к билду, причем даже отпаченный XP SP2 отличается от оригинального SP2 (вот где действительно opaque принцип). Кроме того при правильно составленном запросе можно вытащить внутренние данные csrss касающиеся процессов и потоков, чем не метод поиска скрытых процессов, тем более, что ни один руткит не чистит данные csrss.

    Общение ведется через Port объект, называемый Windows\ApiPort, в следующей последовательности kernel32.dll -> CreateProcessInternalW -> ntdll.dll -> CsrClientCallServer->NtReplyWaitReceivePort.

    Пока не понятно, что там дальше делается к сожалению нет такой утилитки как CSRMon, а она была бы здесь кстати. Небольшие эксперименты показали, что процесс и поток может спокойно существовать без дескрипторов в csrss (на vista правда возникли небольшие проблемы, но там все работает через одно место).

    Соотвественно возникает вопрос, а так ли нужно это уведомление и нельзя ли сделать, то что делает клиент-сервер самостоятельно?
     
  18. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Общение ведётся через \Windows\ApiPort, а вот данные туда-сюда передаются через разделяемую область памяти CsrSrvSharedSection. На базе которой создаётся специальная куча функциями из ntdll. Кстати, узнать её расположение можно многими разными способами:
    a) Конкретные значения: base=0x7F6F0000, size=0x100000 - других вариантов я ещё не видел, хотя особо на разных системах не присматривался
    b) Из реестра: базовый ключ HKLM\System\CurrentControlSet\Control\Session Manager\SubSystems
    базовый адрес в процессе инициализации записывается в CSRSS\CsrSrvSharedSectionBase, размер в процессе инициализации берётся из значения Windows (первый параметр из SharedSection, в Kb)
    c) Nt[Secure]ConnectPort на \Windows\ApiPort, на выходе дополнительные данные: dword+C = dword+14 = базовый адрес,
    размер определяется по VirtualQuery
    d) Из результатов вызова NtSecureConnectPort из kernel32 на стадии загрузки приложения:
    PEB.ReadOnlySharedMemoryBase(+4C) = PEB.ReadOnlySharedMemoryHeap(+50) = базовый адрес

    По поводу того, что происходит внутри процесса csrss:
    приёмник к NtReplyWaitReceivePort - csrsrv.dll!CsrApiRequestThread
    коннект обрабатывает csrsrv.dll!CsrApiHandleConnectionRequest
    в сообщениях указывается номер сообщения, состоящий из двух word'ов: младшее - номер функции, старшее - номер dll. Обрабатывающие всё это DLL берутся из значения уже упомянутого параметра HKLM\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
    ServerDll=basesrv,1
    ServerDll=winsrv:UserServerDllInitialization,3
    ServerDll=winsrv:ConServerDllInitialization,2
    (dll под номером 0 - это сама csrsrv.dll)
    Кстати, интересный вопрос, что произойдёт, если грохнуть этот параметр или убрать оттуда какие-нибудь параметры. Лично я склонен считать, что после перезагрузки полетит вся Win32-подсистема, так что эксперимент не проводил и никому не советую :)

    Что дальше копать, понятно?
     
  19. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Да, и ещё: на обмене сообщениями держится как минимум вся работа с консолью и, полагаю, ещё много чего. Так что просто убирать вряд ли стоит.
     
  20. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    diamond
    Да спасибо, сэкономили кучу времени.
    Буду копать эти дллки.