Как запустить некоторый код в памяти? - PullRequest
2 голосов
/ 11 октября 2009

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

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

Ответы [ 4 ]

7 голосов
/ 12 октября 2009

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

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

(затем используйте VirtualFree для очистки после себя).

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

3 голосов
/ 11 октября 2009

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

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

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

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

2 голосов
/ 11 октября 2009

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

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

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

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

1 голос
/ 11 октября 2009

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

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

...