2008-10-23 7 views
7

Хорошо, скажите, что мое приложение испускает (x86) инструкции в память, делает исполняемую страницу и т. Д. Есть ли способ изменить метод заглушки метода un-JITted, чтобы указать на мой испущенный поток команд?Есть ли способ обмануть компилятор .net JIT для запуска другого метода?

т.д .:

Предположим, что я создал поток команд x86 в памяти, что делает что-то произвольное. Теперь предположим, что у меня есть метод 'int Target()'. Я еще не назвал это, поэтому он не был составлен. Есть ли способ:

  1. Получить указатель на заглушке цели на
  2. Сделать это указывает на мой излучаемого потока команд.

Я понимаю, что практически каждый отдельный признак безопасности .Net предназначен для предотвращения угона, как это. Но возможно ли это, например, через API-интерфейс хостинга?

ответ

6

да, вы можете сделать!

Крючок getJit метод mscorjit. И вас спросят каждый раз, когда любой метод требует Джинтинга. вы можете передать все, что захотите. Некоторые защитники .net работают так.

10

Это возможно через API профилирования. Я никогда не использовал его, но он используется для аналогичной цели в TypeMock.

Редактировать: Я думаю, что была хорошая публикация в блогах MSDN, будет охотиться за ней.

Редактировать 2: Doh, first hit!

+0

Я напомнил, что где-то он «переписывал ИЛ». – leppie 2008-10-23 16:08:12

1

Как вы говорите, это непросто, и это может быть даже невозможно. Если я правильно помню, код будет содержать адрес компилятора JIT для метода, который не был скомпилирован. Поэтому, когда вы пытаетесь вызвать этот метод, компилятор JIT выполнит свою работу и вставляет адрес в новый скомпилированный метод. Если вы можете изменить этот адрес, вы можете вставить звонок в свой собственный код. Как бы вы это делали, это было не по себе. Я, конечно, надеюсь, что CLR обнаружит такой тип подделки.

Я не думаю, что API профилирования вам поможет в этом случае (как предложено Leppie), поскольку вы не пытаетесь изменить MSIL. Если вы считаете, что иначе this article может быть полезным, поскольку он описывает, что вы должны сделать, чтобы реализовать то, что делает TypeMock.

0

В дополнение к возможности использования ICorProfiler и переписывания вашего метода до его смещения вы можете использовать ICorDebug (управляемый интерфейс MDBG). Установите точку останова, когда удары точки останова устанавливают следующий оператор в ваш код перехвата. Весь этот процесс можно сделать из кода, но на самом деле навязчив, и вам понадобится процесс «наблюдателя» для его координации.

Еще одна вещь, которую стоит посмотреть - это проект PostSharp, который дает вам способы ввода и выхода, если вы применяете атрибуты.

0

Я бы не пытался и не путался с памятью, и я не уверен, что это возможно, но вы можете использовать API-интерфейс профилировщика - есть несколько примеров, но нет реальной документации. Взгляните на статью журнала MSDN - Rewrite MSIL Code on the Fly with the .NET Framework Profiling API