Как запустить некоторый код в памяти?
У меня есть компилятор, который компилирует язык ассемблера в машинный язык (в памяти). Мой проект на 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.
Возможно выполнить байты как код:
Это требует использования unsafe
код.
Я думал, что это просто забавный факт, но бесполезный на практике, но, возможно, ваше приложение действительно использует это:)
Вы можете внести в белый список свое приложение из панели управления http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html
Я сомневаюсь, что вы можете внести его в белый список программно, но, безусловно, не без доступа администратора - это противоречило бы цели этой функции безопасности.