динамически запускать DLL в удаленном окне Windows?

Есть ли способ динамического запуска DLL на удаленном компьютере с Windows?

Скажем, пользователь хочет отправить свой собственный файл DLL на удаленный сервер и запустить функцию в этой DLL на удаленном сайте. Пользователь может указать точки входа в функцию, а также необходимые параметры, но не более того. (например, без заголовочного файла)

Я думаю о настройке исполняемого файла агента на удаленном сайте, который может (1) динамически загружать и связывать неизвестную DLL и (2) запускать функцию с параметрами. Это хороший подход или такой исполняемый файл возможен?


person tkang    schedule 03.09.2010    source источник


Ответы (3)


Вы можете использовать метод динамической загрузки вашей DLL.

Обычно вы используете DLL, статически связывая .LIB с вашим проектом и компилируя его. Для динамической загрузки DLL во время выполнения вы используете следующие функции WIN32 API и несколько других приемов.

ЗагрузитьБиблиотеку(); ЗагрузитьБиблиотекуEx(); ПолучитьАдресПроцедуры(); Бесплатная библиотека();

Есть и другие хитрости

  • Вам нужно объявить функции dll как экспортированные.
  • В С++ вам нужно использовать extern "C", чтобы предотвратить искажение имен ваших функций.
  • ФАРПРОК... с GetProcAddress

Все это объясняется в следующей вики-статье — http://en.wikipedia.org/wiki/Dynamic-link_library

Ваша идея установить исполняемый файл на удаленной машине хороша. При условии, что вы согласуете имена функций и параметры с пользователем. Если dll соответствует этому, то dll можно изменить в любое время, не требуя изменения EXE. После настройки и работы легко добавить дополнительные функции.

person Andrew Cash    schedule 03.09.2010

Да, вы можете написать небольшую программу, которая запускает функцию DLL, используя эту информацию, и вызывать ее удаленно, используя что-то вроде PSEXEC от sysinternals.

PsExec — это облегченная замена telnet, позволяющая выполнять процессы в других системах с полной интерактивностью для консольных приложений без необходимости вручную устанавливать клиентское программное обеспечение, чтобы вручную установить клиентское программное обеспечение.

person Preet Sangha    schedule 03.09.2010

Ответ Эндрю Кэша подходит для неуправляемого кода. Техника, которую он описывает для GetProcAddress, по сути, является тем, что RunDll32.exe делает. RunDll32.exe является частью Windows и специализируется на загрузке произвольных библиотек DLL и выполнении их кода. Вы можете запустить его следующим образом:

RUNDLL32.EXE [dllfile],[точка входа] [необязательные аргументы]

Когда вы сделаете это, RunDll32 вызовет LoadLibrary для DLL, а затем GetProcAddress для заданного вами имени точки входа. Если все идет хорошо, вызывается функция точки входа.

Чтобы это действительно работало, необходимо экспортировать функцию точки входа. Он также должен быть объявлен следующим образом:

void CALLBACK MyEntryPoint(
  HWND hwnd,
  HINSTANCE hinst,
  LPSTR lpszCmdLine,
  int nCmdShow);
person Justin R    schedule 03.09.2010