Изменение кода в runtime
От: Аноним  
Дата: 31.05.07 08:39
Оценка:
Здраствуйте.

Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?

Спасибо.
Re: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 08:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?


Штатных средств для этого нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Изменение кода в runtime
От: Roamer_KDN Россия  
Дата: 31.05.07 08:43
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, <Аноним>, Вы писали:


А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?


L>Штатных средств для этого нет.


Изменить уже написанный нет но можно использовать динамические фрагменты кода, см.:System.CodeDom.Compiler.ICodeCompiler
Re[3]: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 08:44
Оценка:
Здравствуйте, 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>Штатных средств для этого нет.


а если не штатными то это возможно ?
Re: Изменение кода в runtime
От: stasukas  
Дата: 31.05.07 08:46
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?

Используя компиляцию, emit или CodeDom
http://rsdn.ru/article/dotnet/codegen.xml
Автор(ы): Андрей Корявченко
Дата: 19.03.2004
Данная статья рассказывает об одном из способов решения проблемы недостаточной гибкости и производительности средств, предоставляемых платформой Microsoft .NET — предварительной генерации кода. Рассматриваются различные подходы: использовании функции string.Format; использование XSLT-преобразований; использование ASP.NET; использование технологии CodeDOM для генерации кода на нескольких языках; компиляция кода во время выполнения программы; генерация IL-кода без компиляции.
... << RSDN@Home 1.2.0 alpha rev. 669>>
C:\>DUMP StateOf(My.Brain) >> http://www.usecase.ru/
Re[2]: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 08:55
Оценка:
Здравствуйте, stasukas, Вы писали:

S>Используя компиляцию, emit или CodeDom

S>http://rsdn.ru/article/dotnet/codegen.xml
Автор(ы): Андрей Корявченко
Дата: 19.03.2004
Данная статья рассказывает об одном из способов решения проблемы недостаточной гибкости и производительности средств, предоставляемых платформой Microsoft .NET — предварительной генерации кода. Рассматриваются различные подходы: использовании функции string.Format; использование XSLT-преобразований; использование ASP.NET; использование технологии CodeDOM для генерации кода на нескольких языках; компиляция кода во время выполнения программы; генерация IL-кода без компиляции.


Ни первое ни второе не позволяют менять код.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 08:55
Оценка:
Здравствуйте, <Аноним>, Вы писали:

L>>Штатных средств для этого нет.


А>а если не штатными то это возможно ?


Не знаю. Может быть и возможн.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Изменение кода в runtime
От: _FRED_ Черногория
Дата: 31.05.07 09:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>>>Штатных средств для этого нет.

А>>а если не штатными то это возможно ?
L>Не знаю. Может быть и возможн.

А разве AspX не так работает? Запущен процесс, выполняется программа, вруг "бац!" некий файл (*.aspx, например) оказался изменён (он ведь может быть изменён и "изнутри" web-проекта). Аккуратненько перекомпилили и подцепили: разве не штатная самомодификация?
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 09:10
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А разве AspX не так работает? Запущен процесс, выполняется программа, вруг "бац!" некий файл (*.aspx, например) оказался изменён (он ведь может быть изменён и "изнутри" web-проекта). Аккуратненько перекомпилили и подцепили: разве не штатная самомодификация?


Нет, там создается новый класс, а не изменяется существующий.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Изменение кода в runtime
От: stasukas  
Дата: 31.05.07 09:10
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ни первое ни второе не позволяют менять код.

"Менять код" — понятие растяжимое. Если необходимо менять байт-код, то да. А если есть некоторый шаблон, который при некоторых условиях меняется, то подходят все 3 варианта.
... << RSDN@Home 1.2.0 alpha rev. 669>>
C:\>DUMP StateOf(My.Brain) >> http://www.usecase.ru/
Re[4]: Изменение кода в runtime
От: Lloyd Россия  
Дата: 31.05.07 09:12
Оценка:
Здравствуйте, stasukas, Вы писали:

L>>Ни первое ни второе не позволяют менять код.

S>"Менять код" — понятие растяжимое. Если необходимо менять байт-код, то да.

"Менять код" подразумевае что на входе код, и после тоже код.

S>А если есть некоторый шаблон, который при некоторых условиях меняется, то подходят все 3 варианта.


Шаблон — это не код, а шаблон.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Изменение кода в runtime
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 31.05.07 09:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а если не штатными то это возможно ?


Если тело метода, то предположительно это можно сделать следующим образом:
получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос)
через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно
в рантайме не предусмотрена защита.
Re[4]: Изменение кода в runtime
От: Аноним  
Дата: 31.05.07 12:01
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>а если не штатными то это возможно ?


A>Если тело метода, то предположительно это можно сделать следующим образом:

A>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос)
A>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно
A>в рантайме не предусмотрена защита.

а можно пример кода?
Re[5]: Изменение кода в runtime
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 31.05.07 12:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, achmed, Вы писали:


A>>Здравствуйте, Аноним, Вы писали:


А>>>а если не штатными то это возможно ?


A>>Если тело метода, то предположительно это можно сделать следующим образом:

A>>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос)
A>>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно
A>>в рантайме не предусмотрена защита.

А>а можно пример кода?


Нет, слишком долго ...
Re: Изменение кода в runtime
От: asofronov  
Дата: 31.05.07 13:18
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?


Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.
Re: Изменение кода в runtime
От: Осака Вестингауз  
Дата: 31.05.07 13:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А что насчёт 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
думаю надо копать где то тут рядом.

а вы как считаете?
Re[3]: Изменение кода в runtime
От: asofronov  
Дата: 01.06.07 07:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>я вот побрадил и накнулся на это: Modifying IL at runtime

А>думаю надо копать где то тут рядом.

А>а вы как считаете?


Да, это оно.
Re[2]: Изменение кода в runtime
От: Ovl Россия  
Дата: 01.06.07 07:57
Оценка:
Здравствуйте, asofronov, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?


A>Это можно сделать при помощи Profiling API. В частности, есть метод ICorProfilerInfo::SetILFunctionBody который позволяет подменить тело метода во время выполнения. Также Unmanaged Metadata API понадобится скорее всего. Ну и писать по-видимому придется не на .NET, а на каком-нибудь нативном языке.


совершенно верно — на нативном, поскольку этот com должен создаваться до запуска виртуальной машины.
как пример можно посмотреть на исходики NCover и PartCover, которые это делают — меняют тело методов вставляя туда свои интсрукции
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[4]: Изменение кода в runtime
От: Аноним  
Дата: 01.06.07 13:16
Оценка:
Здравствуйте, asofronov, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>я вот побрадил и накнулся на это: Modifying IL at runtime

А>>думаю надо копать где то тут рядом.

А>>а вы как считаете?


A>Да, это оно.


скачал я от туда проект Modifying IL at runtime
собрал его, запустил bat файл который регистрирует собранную библиотеку, затем запускаю hello.exe а метод ICorProfilerCallback.JITCompilationStarted почему то не вызывается. как только не бился

кто что может сказать про библиотеки для профайлинга ?

спасибо.
Re: Изменение кода в runtime
От: _Morpheus_  
Дата: 01.06.07 18:10
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот задался недавно вопросом, можно ли каким либо способом во время выполнения программы написанной под .NET (неважно какой версии) модифицировать код программы ?


если менять код который уже откомпилирован JIT'ом то это приведет к непредсказуемым последствиям, во первых Windows не предполагает такого поведения программы и на какихнибудь ОС может вылезти исключение вроде "Access denied", т.к. сегменты памяти где располагается код могут быть защищены от записи.
Сам дотнет таких никаких средств для модификации машинного кода не предоставляет, т.к. машинный код создается только когда ты запускаешь программу. В самом EXE файле его еще нету.
Модифицировать память можно используя unsafe код, но проблема в том что на разных компах код наверняка будет совершенно разный и ты просто не сможешь угадать что где лежит и что на что нужно заменять. А даже если и угадаешь, то JIT может в любой момент перекомпилировать какойнить метод и это наверняка приведет к серьезным ошибкам.

С другой стороны дотнет предоставляет возможность генерировать или компилировать новый код в рантайме, старый при этом остается без изменений.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[6]: Изменение кода в runtime
От: _Morpheus_  
Дата: 01.06.07 18:15
Оценка:
Здравствуйте, achmed, Вы писали:

А>>>>а если не штатными то это возможно ?


A>>>Если тело метода, то предположительно это можно сделать следующим образом:

A>>>получить указатель на метод который сгенерировал JIT (как сделать его сегенерированным это отдельный вопрос)
A>>>через RuntimeMethodHandle.GetFunctionPointer,и записать в памяти нужные машинные инструкции ... если конечно
A>>>в рантайме не предусмотрена защита.

А>>а можно пример кода?


A>Нет, слишком долго ...


Код на разных машинах будет разный, да и на одном компе может быть разный при запуске в различные моменты времени. Поэтому модифицировать-то можно, только толку от этого мало, т.к. код метода будет разный и угадать куда что записать чтобы нужным образом изменить его проблематично. Разве что если написать анализатор машинных кодов, который будет распознавать разные алгоритмы и уметь их модифицировать.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[3]: Изменение кода в runtime
От: _d_m_  
Дата: 04.06.07 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Осака Вестингауз, Вы писали:


ОВ>>Здравствуйте, Аноним, Вы писали:


ОВ>>А что насчёт Edit and continue в студийном отладчике?


А>к сожалению это не приемлимо

А>хотя может я не совем понял на что вы намекаете?

Так и есть. Он намекает, на то что студийный отладчик меняет код во время выполнения и отладки
Re[7]: Изменение кода в runtime
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 04.06.07 13:42
Оценка:
Здравствуйте, _Morpheus_, Вы писали:


_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>Штатных средств для этого нет.


кто нибудь это пробовал использовать? profiling API
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.