2010-09-03 19 views
1

Existe-t-il un moyen d'exécuter dynamiquement une DLL sur une machine Windows distante?exécuter dynamiquement une DLL dans une zone Windows distante?

Supposons qu'un utilisateur souhaite envoyer son propre fichier DLL à un serveur distant et exécuter une fonction dans ce DLL sur le site distant. L'utilisateur peut être en mesure de fournir des points d'entrée de fonction ainsi que les paramètres requis, mais pas plus. (Par exemple, pas de fichier d'en-tête)

Je pense à configurer un agent exécutable sur le site distant qui peut (1 Est-ce une bonne approche, ou un tel exécutable est-il possible?

Répondre

1

Oui, vous pouvez écrire un petit programme qui exécute la fonction DLL en utilisant cette information et l'appeler à distance en utilisant quelque chose comme PSEXEC de sysinternals.

PsExec est un léger -remplacement telnet qui vous permet d'exécuter des processus sur d'autres systèmes, avec interactivité pour applications de la console, sans avoir pour installer softwareto installer manuellement le client manuellement le logiciel client

2

Vous pouvez utiliser une technique de chargement dynamique de vos DLL.

Normalement, vous utilisez une DLL en liant statiquement un fichier .LIB dans votre projet et en le compilant. Pour charger dynamiquement une DLL au moment de l'exécution, utilisez les fonctions API WIN32 suivantes et quelques autres astuces.

LoadLibaray(); LoadLibarayEx(); GetProcAddress(); FreeLibrary();

Il y a quelques autres trucs impliqués

  • Vous devez déclarer les fonctions de dll export'ed.
  • En C++, vous devez utiliser extern "C" pour empêcher le changement de nom de vos fonctions.
  • FARPROC ... avec GetProcAddress

Il est expliqué dans l'article wiki suivant - http://en.wikipedia.org/wiki/Dynamic-link_library

Votre idée d'installer un exécutable sur la machine distante est un bon. Tant que vous êtes d'accord sur les noms et les paramètres de la fonction avec l'utilisateur. Si la DLL est conforme à cela, la DLL peut être modifiée à tout moment sans que vous ayez besoin de changer EXE. Une fois mis en place et fonctionnant, il est simple d'ajouter des fonctions supplémentaires.

0

La réponse d'Andrew Cash est bonne pour le code non managé. La technique qu'il décrit autour de GetProcAddress est essentiellement ce que fait RunDll32.exe. RunDll32.exe fait partie de Windows et est spécialisé dans le chargement de DLL arbitraires et l'exécution de leur code. Vous pouvez l'exécuter comme ceci:

RUNDLL32.EXE [dllfile], [entrypoint] [arguments optionnels]

Lorsque vous faites cela, RunDll32 appellera LoadLibrary sur la DLL puis GetProcAddress sur le nom du point d'entrée que vous lui donnez. Si tout cela se passe bien alors il appelle la fonction du point d'entrée.

Pour que cela fonctionne réellement, la fonction entrypoint doit être exportée. Il doit également être déclaré comme ceci:

void CALLBACK MyEntryPoint(
    HWND hwnd, 
    HINSTANCE hinst, 
    LPSTR lpszCmdLine, 
    int nCmdShow);