Перехват вызова в .NET

Тема в разделе "WASM.BEGINNERS", создана пользователем IvanIvanov, 12 апр 2006.

  1. IvanIvanov

    IvanIvanov New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2006
    Сообщения:
    2
    Привет!



    Есть программа (моя) на .NET 1.1. Она лазит в базу SQL Server (как обычно через ADO.NET), но код, который это делает, не целиком под моим контролем.



    Необходимо каким-то образом перехватывать SQL запрос перед самой отправкой на сервер и, например, записывать в лог.



    SQL Profiler не подходит, поскольку это вещь внешняя, а мне нужен программный доступ к текстам запросов внутри моей же программы.



    Profiling API не подходит по той же причине - самого себя профилировать нельзя через него, к тому же хост для него должен быть неуправляемым приложением.



    Написание обёрток вокруг всех ADO.NET классов тоже не поможет, поскольку чужой библиотечный код ничего о них не знает и всё равно будет лезть в базу напрямую.



    Так что надо как-то перехватывать вызов в самой программе.



    Возможно ли это?



    Спасибо.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Дизассемлишь, ищешь функцию, которая отправляет sql запрос, ну и ставишь хук на эту функцию.
     
  3. IvanIvanov

    IvanIvanov New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2006
    Сообщения:
    2
    2 mix_mix



    В том-то всё и дело, что нечего дизассемблировать. В наличии имеется только сборка, состоящая из одной DLL. В ней код на MSIL. Когда я впервые вызываю метод из этой сборки, среда выполнения её загружает (если, конечно, она уже не загружена), находит MSIL вызванного мной метода и компилирует его в знакомые нам всем инструкции x86. Адрес, по которому будет расположен откомпилированный таким образом код, не известен заранее. Никаких таблиц импорта тоже нет.



    Единственная зацепка - получить от JIT-компилятора уведомление о проделанной работе. Но насколько я знаю, с ним нет программного интерфейса. Хотя могу на этот счёт и ошибаться.



    Так что вопрос остаётся - как поcтавить хук на метод .NET?
     
  4. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Интересно что-нибудь подобное в .NET прокатит? Можно получить hModule процесса, узнать размер исполняемого файла, а затем сбосить дамп памяти этого процесса на диск.

    Ну а дальше уже дизасмить получившийся файл :)
     
  5. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    В ней код на MSIL. Когда я впервые вызываю метод из этой сборки, среда выполнения её загружает (если, конечно, она уже не загружена), находит MSIL вызванного мной метода и компилирует его в знакомые нам всем инструкции x86. Адрес, по которому будет расположен откомпилированный таким образом код, не известен заранее. Никаких таблиц импорта тоже нет.



    ngen /install proga.exe



    скомпилирует в платформо-зависимый x86 (допустим) код и установит сборку, так что компиляции MSIL уже не будет вообще, адреса инструкций в пространстве одной машины меняться не должны.
     
  6. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Но насколько я знаю, с ним нет программного интерфейса. Хот могу на этот счёт и ошибаться.

    После JIT-компиляции он помещается в закрытую память и с ним нет никакой связи.
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ




    1) дизассемблируешь сборку

    2) находишь в IL-е метод

    3) дописываешь туда на том же IL-е все что тебе нужно

    4) ассемблируешь (лучше с ключем /debug чтобы из студии дебажить IL а не x86/x64)

    5) если она подписана - отключаешь проверку



    самое простое - написать нужный код построить дизассемблировать выдрать кусок из одного ИЛа и вставить в другой



    в этом смысле CLR просто рулез - не то что натив-код



    по ходу вопрос к знатокам студии - как поставить брейк в дебаггере на функцию из модуля с точкой в имени?
     
  8. Jecha

    Jecha New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    21
    Товарищи знатоки :) такая проблема: ildasm-ом дизассемблил сборку длл собираю обратно ничего не меняя, вылазит такая трабла "Strong name validation failed" так вот сам вопрос: как эту проверку убрать в сборке? подскажите в каком направлении копать? заранее благодарен
     
  9. Jecha

    Jecha New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    21
    хм... не дождался ответа, разобрался сам. может кому потребуется. в декомпилиной сборке удалить надо инфу о ключе AssemblyKeyFileAttribute и PublicKey. после чего компильнуть и подписать своим ключем. (тулза sn k - генерация ключа, i - подписывание сборки),
    у меня заработало... конечно может быть еще что то :)