2013-08-16 2 views
0

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

  1. Разрешить пользователю вставлять (с помощью инструмента) нативный код в моем приложении, прежде чем начать его.
  2. Запустите этот введенный пользователем код прямо из памяти во время выполнения.

В идеале, для этого должен быть легко указать этот код.

У меня есть две идеи, как это сделать, что я рассматриваю сейчас:

  1. Пользователь будет встраивать родной DLL в ресурсы приложения. Приложение будет загружать эту dll прямо из памяти с использованием методов из статьи this.

  2. Как-то скопируйте код сборки .dll, указанный пользователем в мои ресурсы приложения, и выполните этот код из кучи, как описано в статье this.

Есть ли лучшие варианты для этого? Если нет, какие-либо мысли о том, что может вызвать проблемы в этих решениях?

EDIT

Я специально не хочу использовать LoadLibrary* звонки, поскольку они требуют DLL файл, чтобы быть уже на жестком диске, который я пытаюсь избежать. Я также пытаюсь усложнить работу.

EDIT

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

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

+1

Обычным и прямым способом было бы динамически загружать dll с помощью LoadLibrary() из файловой системы и вызывать хорошо известную функцию в этой DLL. Это не выполнимо – nos

+0

Я хотел бы избежать вызова 'LoadLibrary', поскольку он требует .dll-файла уже на hdd, чего я пытаюсь избежать. – ghord

+1

Что случилось с ['LoadLibraryEx'] (http://msdn.microsoft.com/en-US/library/ms684179.aspx) и [' GetProcAddress'] (http://msdn.microsoft.com/en-us /library/windows/apps/ms683212.aspx)? Кроме того, что вы подразумеваете под * «run [...] прямо из памяти» *? В отличие от бега? Проблемы с предлагаемыми вами решениями: программное обеспечение для защиты от вредоносных программ и вирусов будет работать с haywire. – IInspectable

ответ

1

Цель состоит в том, чтобы позволить третьим лицам статически связывать код с родным приложением.

Очевидным способом сделать это является предоставление сторонним объектам объекта и компоновщику. Это может быть завернуто в инструмент, чтобы упростить его использование.

Как всегда, дьявол находится в деталях. В дополнение к объектным файлам приложения содержат манифесты, ресурсы и т. Д. Вам нужно найти компоновщик, который вы имеете право распространять. Вам нужно использовать компилятор, совместимый с указанным компоновщиком. И так далее. Но это, безусловно, возможно и, вероятно, будет более надежным, чем попытка опрокинуть собственное решение.

1

Ваш вариант 2 довольно труднопреодолимый на мой взгляд. Для небольших количеств самодостаточного кода он жизнеспособен. Для любого серьезного количества кода вы не можете реально надеяться на успех, не изобретая колесо, которое является вашим вариантом 1. Например, реальный код будет ссылаться на функции Win32 и как вы собираетесь их устранять? Вам придется изобретать что-то точно так же, как таблица импорта PE. Итак, почему это происходит, когда библиотеки DLL уже существуют. Если вы создали свой собственный PE-подобный формат файла для этого кода, как бы его сгенерировать? Все стандартные инструменты предназначены для создания DL-файлов формата PE.

Что касается опции 1, загрузка DLL из памяти не поддерживается. Таким образом, вы должны выполнить всю работу, которую загрузчик сделает для вас, если бы она загружалась из файла. Итак, если вы хотите загрузить DLL, которая отсутствует на диске, то вариант 1 - ваш единственный выбор.

Любая половина компетентного хакера будет легко вытаскивать DLL из процесса выполнения, хотя не забывайте, что запуск DLL из памяти каким-то образом защитит ваш код от проверки.

0

Это что-то называется «виртуализация приложений», для этого есть сторонние инструменты, check them on google.

В простом случае вы можете просто загрузить «DLL» в память, применить релокс, настроить импорт и вызвать точку входа.

Смежные вопросы