2012-02-07 1 views
0

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

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

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

ответ

1

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

+0

Aaah Я надеялся, что забыл только такой флаг. По какой-то причине Visual Studio по-прежнему не будет входить в вызов, но теперь нажимается точка останова «int 3», и я могу перейти оттуда. Это не идеально, но я должен работать таким образом. Благодаря! – Trillian

1

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

+0

HeapCreate предоставляет флаг HEAP_CREATE_ENABLE_EXECUTE («Использовать эту кучу флага в приложениях, которые запускают код из кучи»). Я не пробовал с VirtualAlloc, но он кажется более сложным в использовании. – Trillian