Как запустить некоторый код в памяти?

У меня есть компилятор, который компилирует язык ассемблера в машинный язык (в памяти). Мой проект на C# .net. Есть ли способ запустить память в потоке? Как DEP может предотвратить это?

byte[] a:  
01010101 10111010 00111010 10101011 ...

4 ответа

Решение

Я сомневаюсь, что есть поддерживаемый способ. Я не знаю и не исследовал это, но вот некоторые предположения:

Самый простой способ - запустить его как процесс: записать его в файл *.com, а затем указать O/S запустить этот исполняемый файл.

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

Другая возможность - записать коды операций в память, которая, как известно, уже будет выполнена (например, перезаписать существующий код в недавно загруженной DLL).

Ключ заключается в том, чтобы поместить исполняемый код в блок памяти, выделенный с помощью VirtualAlloc, чтобы буфер был помечен как исполняемый.

IntPtr pExecutableBuffer = VirtualAlloc(
  IntPtr.Zero,
  new IntPtr(byteCount),
  AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
  MemoryProtection.PAGE_EXECUTE_READWRITE);

(затем используйте VirtualFree, чтобы убрать за собой).

Это говорит Windows, что память должна быть помечена как исполняемый код, чтобы не вызывать проверку DEP.

Возможно выполнить байты как код:

Встроенный x86 ASM в C#

Это требует использования unsafe код.

Я думал, что это просто забавный факт, но бесполезный на практике, но, возможно, ваше приложение действительно использует это:)

Вы можете внести в белый список свое приложение из панели управления http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html

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

Другие вопросы по тегам