RPC communication hook

Тема в разделе "LANGS.C", создана пользователем tagNevRA, 31 янв 2010.

  1. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    Приветствую, уважаемые читатели wasm'a!

    Такой вопросик, а точнее два:
    В моей программе, которая устанавливает хуки в стороннем приложении работающем через RPC для Windows (C++), необходимо связать начало вызова метода в клиенте, и непосредственно сам вызов на сервере без изменения данных которые передаются, как это сделать?
    Поясню в чем проблема: есть допустим некий метод IMethod интерфейса IMy, ну и пусть например этот метод ничего не делает и ничего не возвращает (для общности примера), его (метод) вызывает клиент A, в дебрях RPC происходит маршилинг, вызов NdrClientCall2, а на серевере B, вызов NdrServerCall2 и демаршалинг (если я конечно ничего не путаю). Если этот метод могут вызывать одновременно разные клиенты A1, A2, и т.д. то как сопоставить на сервере, что сейчас идет непосредственно вызов из, например A2, а не A3?
    Я захучил и NdrClientCall2 на клиенте и NdrServerCall2 на сервере, и пытался разные другие методы, и все только для того, чтобы сопоставить этот вызов, увидеть так какой-нибудь уникальный признак или т.п., что-нибудь вроде - вот на клиенте кука(описатель, ID и т.п....) вызова, вот на сервере точно такая же - можно сопоставить,... но пока что-то пусто. Нужно мне все это для сугубо экспериментальных задач.
    В общем, если есть те кто может наставить на путь истинный, был бы признателен.

    И второй вопрос:
    Если функция имеет сигнатуру например DWORD MyFunc(...) - т.е. переменное число аргументов, и не известно сколько их там, то как если захучить эту функцию правильно вызвать в теле хука оригинальную?
    Т.е. как правильно должен выглядеть код ниже:

    Код (Text):
    1. DWORD HookMyFunc(...)
    2. {
    3.     return OrigMyFunc( [b]???[/b] );
    4. }
    Спасибо за любую помощь.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    tagNevRA
    Слишком много текста и мало смысла. Заменить калбэк в таблице или использовать технику на подобие IDP. Вобще не вижу связи хуков с захватом кода, NDR не шадова механизм.
     
  3. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    Clerk
    У меня узкоспециализированная задача. Проще объяснить на примере.
    Клиент (поток вызова):
    Метод1 -> Метод2 -> Метод3 -> Rpc вызов (по результатам этих трех вызовов собралась информация которую бы хотелось передать на сервер )

    Сервер
    Rpc прием ->...Метод -> Метод в котором нужно воспользоваться данными полученными на клиенте, именно в этом потоке и в этом месте...Данные я передал, но как понять в какой поток их пропихнуть не понимаю, т.к. вызовы идут параллельно!

    Заменить калбэк в таблице или использовать технику на подобие IDP.
    Не очень понял, что и где заменить, что имелось ввиду и что такое IDP?
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    tagNevRA
    В перехватчике ф-ции интерфейса на сервере вызываете
    Код (Text):
    1. RPC_BINDING_HANDLE WINAPI I_RpcGetCurrentCallHandle();
    полученный binding handle скармливаете
    Код (Text):
    1. RPC_STATUS WINAPI I_RpcBindingInqLocalClientPID(RPC_BINDING_HANDLE ClientBinding, DWORD* ClientPID);
    и получаете PID процесса клиента.

    Ф-ции недокументированные.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    tagNevRA
    Я достаточно хорошо понимаю этот механизм, проще былобы вам привети нужные функи. Это юзермодный функционал, легко отлаживаемый и имеющийся в сурцах.
    Мы можем использовать обычно замену ссылки на калбэки(процедуры обратных вызовов по русски) или использовать какиелибо грязные хаки. IDP один из них. Если палевность и стабильность не имеет значения, то просто патчить код в образах.
     
  6. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    green
    Большое спасибо за ответ, я не знал про такие функции. )
    Но у меня ситуация хуже :dntknw:, т.к. запрос на стороне клиента выполняется внутри одного приложения (некий северный диспетчер запросов) в разных потоках т.е. PID клиента всегда один. Надо было это сразу написать, не подумал.
    В таком случае ничего не посоветуете?
     
  7. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    Clerk
    Функции находятся в Exchange 2010 сервере. Документации нет, сорцев конечно же тоже, как и символов( Поэтому и спрашиваю в общем виде, в надежде что есть какое-нибудь обще решение.

    Про callback'e я конечно же знаю, просто не понимаю куда их тут в случае Rpc вызовов прикрутить.
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    tagNevRA
    Боюсь, что простого и общего способа в этом случае нет. По какому протоколу идёт RPC-взаимодействие?
     
  9. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    green
    :dntknw: NCACN_IP_TCP
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    tagNevRA
    Тогда не знаю...
     
  11. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    green
    Все равно спасибо.

    Все же сам RPC эту информацию откуда-то имеет.
    Я провел такой эксперимент: написал маленькое клиент-сервер RPC приложение. На клиенте создаю несколько потоков и в каждом потоке вызываю RPC функцию в цикле. На сервере в реализации вызываемой функции смотрю описатель запроса (через I_RpcGetCurrentCallHandle) и вот он (описатель) для одних и тех же клиентских потоков (потоков в которых производится запрос) всегда одинаковый! на все вызовы этой функции т.е. запросы группируются на сервере. Нужно понять где.
     
  12. tagNevRA

    tagNevRA New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2008
    Сообщения:
    7
    Насчет последнего эксперимента я был не совсем прав, описатель разный только если запрос идет одновременно, если же подряд то одинаковый.