Уведомление csrss о новом потоке

Тема в разделе "WASM.NT.KERNEL", создана пользователем slesh, 3 дек 2010.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Подскажите, существует ли нормальный способ уведомить csrss о потоке из этого потока.
    т.е. мы имеет в UserMode Native поток и из него системе надо сообщить о его существовании.
    Желательно чтобы метод работал вплоть до win 7.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вот тут я писал уже, может быть, что-то из этого подойдёт.
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Читал это, но больше хочется что-то по ближе к CsrClientCallServer
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну так напиши, в чём непосредственно проблема с этой API?
     
  5. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Как я понял там используется спец запрос. И там передается номер функции полученный через CSR_MAKE_API_NUMBER
    но вот что-то самих номеров не нашел. Они же вроде как на разных версиях винды разные номера имеют (или я ошибаюсь?).
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    разные и недокументированные
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    slesh
    Универсальный поиск переменных, констант и пр., тоесть выделение из кода необходимой части решается нормально только посредством графов. GPE вам поможет сделать это, либо будет являться хорошим примером.
    Кстате исправте ошибки в дизасме длин, на вашем блоге на ачате я отписал. LDE не может использоваться при не выравненном стеке.
     
  8. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Clerk
    Спасибо что подсказал насчет дизасма длин. Хотя если его будут использовать в Си программах, то очень маловероятно что стек будет не выравнен.

    Кстати, прогнал через IDA kernelbase от Win 7. А также kernel32 от Win XP и Win 2k3 везде при создании потока
    CsrClientCallServer вызывается с одним и тем же кодом команды 0x10001 так что теоретически можно считать что это прокатит везде.
    Если учесть что #define CSR_MAKE_API_NUMBER( DllIndex, ApiIndex ) \
    (CSR_API_NUMBER)(((DllIndex) << 16) | (ApiIndex))

    То выходит что DllIndex = BASESRV_SERVERDLL_INDEX = 1 и
    ApiIndex = BasepCreateThread = 1

    Так что вполне вероятно что будет работать нормаль.

    Только сейчас нашел список: http://j00ru.vexillium.org/csrss_list/api_list.html
    И там видно что BasepCreateThread всегда имеет индекс 1
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    slesh
    То что первые два сервиса постоянны можно догадаться логически. Но это не универсальный способ, для других сервисов, например консольных номера их будут различными. Для определения парсится код содержащий в себе вызов необходимого сервиса, причём NL задаётся на основе допустимого максимального уровня вложенности, так как это очень сильно сказывается на производительности(если например для 3 будет несколько сот инструкций, то для 5 их может быть уже десятки тысяч и соответственно время анализа и память очень сильно увеличивается. Подобная проблема возникала при разборе многих нтюзер функций, где изза сех-пролога(_SEH_Prolog()) в анализ вовлекалась большая часть модуля и пришлось это присечь проверкой адреса). Инструкция загружающая номер сервиса в стек сцеплена в графе: [push ArgN(R/M)] - [Line] - [push ArgN +1] - [Line] - [push Id] - ... - [Call CsrClientCallServer]. Причём в универсальном способе необходимо определять не загрузку аргумента, а баланс стека, тоесть загрузка аргумента определяется по изменению стека.

    Баланс стека нарушается LDE. Тоесть гдето ранее(при его инициализации) формируется стековый фрейм и удаляется он при возврате из движка. На всё время работы стек смещён на два байта и любое исключение в нём завершится крахом, например если возникнет #PF/#DB при чтении инструкции. Например в следующей модели:
    [Push ax]
    [SEH_PROLOG]
    [#XCPT]
    [SEH_EPILOG]
    [Pop ax]
    Возникнет багчек, сех цепочка не будет раскручена. Это ошибка в реализации менеджера.
     
  10. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Clerk
    спс на счет LDE, нашел уже место где стек смешается, уже исправил.

    Тут в принципе надо было только именно для потоков найти номера команд, так что поиск особо не нужен будет.
     
  11. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    в 7й винде ввели - RtlRegisterThreadWithCsrss

    со списком аргументов я не разбирался - там толи 3 толи 4 дворда) в гугле нашел только свой пост на мсдне)

    ап - 3, есть кроссрефы в адвапи32 (на нем и тормознул), начинаются как локи, но под хотпатчи
    mov edi,edi
    push reg32
    push reg32
    push reg32
    call RtlRegister...
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Смотрим в сторону csrsrv.dll