Привет! Есть программа (моя) на .NET 1.1. Она лазит в базу SQL Server (как обычно через ADO.NET), но код, который это делает, не целиком под моим контролем. Необходимо каким-то образом перехватывать SQL запрос перед самой отправкой на сервер и, например, записывать в лог. SQL Profiler не подходит, поскольку это вещь внешняя, а мне нужен программный доступ к текстам запросов внутри моей же программы. Profiling API не подходит по той же причине - самого себя профилировать нельзя через него, к тому же хост для него должен быть неуправляемым приложением. Написание обёрток вокруг всех ADO.NET классов тоже не поможет, поскольку чужой библиотечный код ничего о них не знает и всё равно будет лезть в базу напрямую. Так что надо как-то перехватывать вызов в самой программе. Возможно ли это? Спасибо.
2 mix_mix В том-то всё и дело, что нечего дизассемблировать. В наличии имеется только сборка, состоящая из одной DLL. В ней код на MSIL. Когда я впервые вызываю метод из этой сборки, среда выполнения её загружает (если, конечно, она уже не загружена), находит MSIL вызванного мной метода и компилирует его в знакомые нам всем инструкции x86. Адрес, по которому будет расположен откомпилированный таким образом код, не известен заранее. Никаких таблиц импорта тоже нет. Единственная зацепка - получить от JIT-компилятора уведомление о проделанной работе. Но насколько я знаю, с ним нет программного интерфейса. Хотя могу на этот счёт и ошибаться. Так что вопрос остаётся - как поcтавить хук на метод .NET?
Интересно что-нибудь подобное в .NET прокатит? Можно получить hModule процесса, узнать размер исполняемого файла, а затем сбосить дамп памяти этого процесса на диск. Ну а дальше уже дизасмить получившийся файл
В ней код на MSIL. Когда я впервые вызываю метод из этой сборки, среда выполнения её загружает (если, конечно, она уже не загружена), находит MSIL вызванного мной метода и компилирует его в знакомые нам всем инструкции x86. Адрес, по которому будет расположен откомпилированный таким образом код, не известен заранее. Никаких таблиц импорта тоже нет. ngen /install proga.exe скомпилирует в платформо-зависимый x86 (допустим) код и установит сборку, так что компиляции MSIL уже не будет вообще, адреса инструкций в пространстве одной машины меняться не должны.
Но насколько я знаю, с ним нет программного интерфейса. Хот могу на этот счёт и ошибаться. После JIT-компиляции он помещается в закрытую память и с ним нет никакой связи.
1) дизассемблируешь сборку 2) находишь в IL-е метод 3) дописываешь туда на том же IL-е все что тебе нужно 4) ассемблируешь (лучше с ключем /debug чтобы из студии дебажить IL а не x86/x64) 5) если она подписана - отключаешь проверку самое простое - написать нужный код построить дизассемблировать выдрать кусок из одного ИЛа и вставить в другой в этом смысле CLR просто рулез - не то что натив-код по ходу вопрос к знатокам студии - как поставить брейк в дебаггере на функцию из модуля с точкой в имени?
Товарищи знатоки такая проблема: ildasm-ом дизассемблил сборку длл собираю обратно ничего не меняя, вылазит такая трабла "Strong name validation failed" так вот сам вопрос: как эту проверку убрать в сборке? подскажите в каком направлении копать? заранее благодарен
хм... не дождался ответа, разобрался сам. может кому потребуется. в декомпилиной сборке удалить надо инфу о ключе AssemblyKeyFileAttribute и PublicKey. после чего компильнуть и подписать своим ключем. (тулза sn k - генерация ключа, i - подписывание сборки), у меня заработало... конечно может быть еще что то