Существует ли способ обмануть JIT-компилятор.NET в выполнение другого метода?

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

Например:

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

  1. Получите указатель на тупик Цели
  2. Заставьте его указать на мой испускаемый поток команд.

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

7
задан Peter Mortensen 2 October 2019 в 02:07
поделиться

5 ответов

Да, можно сделать это!

Сцепите getJit метод mscorjit. И Вас спросят каждый раз, если какой-либо метод потребует jitting. Можно передать то, что Вы хотите.

Некоторые средства защиты.NET работают как это.

6
ответ дан 6 December 2019 в 10:55
поделиться

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

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

2
ответ дан 6 December 2019 в 10:55
поделиться

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

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

0
ответ дан 6 December 2019 в 10:55
поделиться

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

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

Редактирование 2: Doh, сначала хит!

10
ответ дан 6 December 2019 в 10:55
поделиться

Я не попытался бы смешать непосредственно с памятью, и я не уверен, что это даже возможно вместо этого, что можно использовать профилировщика API - существует несколько примеров там, но никакая реальная документация. Взгляните на статью MSDN Magazine - Переписывают Код MSIL на лету с Платформой.NET Профильный API

0
ответ дан 6 December 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: