Переход по выделенной исполняемой памяти в приложении .NET - PullRequest
0 голосов
/ 07 февраля 2012

Я играю с генерацией собственного кода из C #. Я использую HeapCreate и HeapAlloc для выделения исполняемой памяти, в которую я пишу инструкции для x86-64. Затем я использую Marshal.GetDelegateForFunctionPointer, чтобы превратить его в делегат .NET и вызвать его. Я могу правильно создать и вызвать простую функцию, которая возвращает постоянное значение.

Проблема в том, что я не могу войти в эту функцию в VS2010. Когда я использую «шаг в» в окне дизассемблирования в коде вызова, он просто переходит, и я никогда не вижу разобранную функцию. Я попытался перейти по адресу исполняемой памяти в окне разборки или добавить точку останова по этому адресу, но Visual Studio жалуется, что память не является исполняемой. Я также попытался сгенерировать инструкцию «int 3», но она приводит к тому, что мое приложение завершает работу без предупреждения (как если бы вызывался Environment.Exit). Я сделал простую тестовую программу на C ++, которая использует ту же технику для генерации функции и ее вызова, и я могу войти в нее без проблем.

Как мне перейти к встроенной функции, сгенерированной в выделенном фрагменте исполняемой памяти в проекте .NET Visual Studio? Что-нибудь мешает этому быть возможным? (У меня отключена опция «просто мой код»)

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Если вы действительно используете HeapAlloc, я удивлен, что это сработало вообще. У меня сложилось впечатление, что память, выделенная HeapAlloc, не имеет разрешения на выполнение. Я обычно использую VirtualAlloc для выделения такой памяти и явно устанавливаю флаг выполнения с VirtualProtect.

1 голос
/ 08 февраля 2012

Вы установили «Включить отладку неуправляемого кода», как описано для MSDN ?

...