Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
Здравствуйте, <Аноним>, Вы писали:
А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
L>Штатных средств для этого нет.
Изменить уже написанный нет но можно использовать динамические фрагменты кода, см.:System.CodeDom.Compiler.ICodeCompiler
Здравствуйте, Roamer_KDN, Вы писали:
L>>Штатных средств для этого нет.
R_K>Изменить уже написанный нет но можно использовать динамические фрагменты кода, см.:System.CodeDom.Compiler.ICodeCompiler
Вроде бы аффтор спрашивал именно об изменении.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
31.05.07 08:45
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
L>Штатных средств для этого нет.
Здравствуйте, <Аноним>, Вы писали:
А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
Используя компиляцию, emit или CodeDom http://rsdn.ru/article/dotnet/codegen.xml
Здравствуйте, Lloyd, Вы писали:
L>>>Штатных средств для этого нет. А>>а если не штатными то это возможно ? L>Не знаю. Может быть и возможн.
А разве AspX не так работает? Запущен процесс, выполняется программа, вруг "бац!" некий файл (*.aspx, например) оказался изменён (он ведь может быть изменён и "изнутри" web-проекта). Аккуратненько перекомпилили и подцепили: разве не штатная самомодификация?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>А разве AspX не так работает? Запущен процесс, выполняется программа, вруг "бац!" некий файл (*.aspx, например) оказался изменён (он ведь может быть изменён и "изнутри" web-проекта). Аккуратненько перекомпилили и подцепили: разве не штатная самомодификация?
Нет, там создается новый класс, а не изменяется существующий.
Здравствуйте, Lloyd, Вы писали:
L>Ни первое ни второе не позволяют менять код.
"Менять код" — понятие растяжимое. Если необходимо менять байт-код, то да. А если есть некоторый шаблон, который при некоторых условиях меняется, то подходят все 3 варианта.
Здравствуйте, stasukas, Вы писали:
L>>Ни первое ни второе не позволяют менять код. S>"Менять код" — понятие растяжимое. Если необходимо менять байт-код, то да.
"Менять код" подразумевае что на входе код, и после тоже код.
S>А если есть некоторый шаблон, который при некоторых условиях меняется, то подходят все 3 варианта.
Здравствуйте, Аноним, Вы писали:
А>а если не штатными то это возможно ?
Если тело метода, то предположительно это можно сделать следующим образом:
получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос)
через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно
в рантайме не предусмотрена защита.
Re[4]: Изменение кода в runtime
От:
Аноним
Дата:
31.05.07 12:01
Оценка:
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>а если не штатными то это возможно ?
A>Если тело метода, то предположительно это можно сделать следующим образом: A>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос) A>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно A>в рантайме не предусмотрена защита.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, achmed, Вы писали:
A>>Здравствуйте, Аноним, Вы писали:
А>>>а если не штатными то это возможно ?
A>>Если тело метода, то предположительно это можно сделать следующим образом: A>>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос) A>>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно A>>в рантайме не предусмотрена защита.
А>а можно пример кода?
Здравствуйте, Аноним, Вы писали:
А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.
А что насчёт Edit and continue в студийном отладчике?
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
01.06.07 07:18
Оценка:
Здравствуйте, Осака Вестингауз, Вы писали:
ОВ>Здравствуйте, Аноним, Вы писали:
ОВ>А что насчёт Edit and continue в студийном отладчике?
к сожалению это не приемлимо
хотя может я не совем понял на что вы намекаете?
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
01.06.07 07:23
Оценка:
Здравствуйте, asofronov, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
A>Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.
я вот побрадил и накнулся на это: Modifying IL at runtime
думаю надо копать где то тут рядом.
Здравствуйте, Аноним, Вы писали:
А>я вот побрадил и накнулся на это: Modifying IL at runtime А>думаю надо копать где то тут рядом.
А>а вы как считаете?
Здравствуйте, asofronov, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
A>Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.
совершенно верно — на нативном, поскольку этот com должен создаваться до запуска виртуальной машины.
как пример можно посмотреть на исходики NCover и PartCover, которые это делают — меняют тело методов вставляя туда свои интсрукции
Здравствуйте, asofronov, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>я вот побрадил и накнулся на это: Modifying IL at runtime А>>думаю надо копать где то тут рядом.
А>>а вы как считаете?
A>Да, это оно.
скачал я от туда проект Modifying IL at runtime
собрал его, запустил bat файл который регистрирует собранную библиотеку, затем запускаю hello.exe а метод ICorProfilerCallback.JITCompilationStarted почему то не вызывается. как только не бился
кто что может сказать про библиотеки для профайлинга ?
Здравствуйте, <Аноним>, Вы писали:
А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
если менять код который уже откомпилирован JIT'ом то это приведет к непредсказуемым последствиям, во первых Windows не предполагает такого поведения программы и на какихнибудь ОС может вылезти исключение вроде "Access denied", т.к. сегменты памяти где располагается код могут быть защищены от записи.
Сам дотнет таких никаких средств для модификации машинного кода не предоставляет, т.к. машинный код создается только когда ты запускаешь программу. В самом EXE файле его еще нету.
Модифицировать память можно используя unsafe код, но проблема в том что на разных компах код наверняка будет совершенно разный и ты просто не сможешь угадать что где лежит и что на что нужно заменять. А даже если и угадаешь, то JIT может в любой момент перекомпилировать какойнить метод и это наверняка приведет к серьезным ошибкам.
С другой стороны дотнет предоставляет возможность генерировать или компилировать новый код в рантайме, старый при этом остается без изменений.
Здравствуйте, achmed, Вы писали:
А>>>>а если не штатными то это возможно ?
A>>>Если тело метода, то предположительно это можно сделать следующим образом: A>>>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос) A>>>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно A>>>в рантайме не предусмотрена защита.
А>>а можно пример кода?
A>Нет, слишком долго ...
Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Осака Вестингауз, Вы писали:
ОВ>>Здравствуйте, Аноним, Вы писали:
ОВ>>А что насчёт Edit and continue в студийном отладчике?
А>к сожалению это не приемлимо А>хотя может я не совем понял на что вы намекаете?
Так и есть. Он намекает, на то что студийный отладчик меняет код во время выполнения и отладки
_M_>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
Re[8]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:45
Оценка:
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, _Morpheus_, Вы писали:
_M_>>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
A>Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
совершенно верно
именно это я и хотел сделать для организации логирования.
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:52
Оценка:
Здравствуйте, _Morpheus_, Вы писали:
_M_>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
_M_>если менять код который уже откомпилирован JIT'ом то это приведет к непредсказуемым последствиям, во первых Windows не предполагает такого поведения программы и на какихнибудь ОС может вылезти исключение вроде "Access denied", т.к. сегменты памяти где располагается код могут быть защищены от записи. _M_>Сам дотнет таких никаких средств для модификации машинного кода не предоставляет, т.к. машинный код создается только когда ты запускаешь программу. В самом EXE файле его еще нету. _M_>Модифицировать память можно используя unsafe код, но проблема в том что на разных компах код наверняка будет совершенно разный и ты просто не сможешь угадать что где лежит и что на что нужно заменять. А даже если и угадаешь, то JIT может в любой момент перекомпилировать какойнить метод и это наверняка приведет к серьезным ошибкам.
_M_>С другой стороны дотнет предоставляет возможность генерировать или компилировать новый код в рантайме, старый при этом остается без изменений.
мне надо было уточнить что я имел ввиду модификацию байт-кода (IL). Я понимаю что после JIT компиляции средствами .NET уже почти невозможно что либо сделать.
Re[9]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 11:59
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, achmed, Вы писали:
A>>Здравствуйте, _Morpheus_, Вы писали:
_M_>>>Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
A>>Зависит от конечной цели ведь, в каких то случаях такой подход может быть даст результат (например в самое начало метода с пустым списком аргументов нужно вставить вызов своего метода) ....
А>совершенно верно А>именно это я и хотел сделать для организации логирования.
наконец то я это сделал, но появилась другая проблема:
трасировка отлично работает для консольных и winforms приложений, но для веб приложений в упор не хочет работать. В event лог добавляется следующая запись при старте веб приложения
Event Type: Error
Event Source: CLR
Event Category: None
Event ID: 0
Date: 05.06.2007
Time: 13:34:58
User: N/A
Computer: xxx
Description:
The description for Event ID ( 0 ) in Source ( CLR ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: Failed to CoCreate profiler..
Re[2]: Изменение кода в runtime
От:
Аноним
Дата:
05.06.07 13:02
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, <Аноним>, Вы писали:
А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?
L>Штатных средств для этого нет.