2009-10-12 14 views

Répondre

2

Si cela était facile, les pirates seraient démarrent des logiciels malveillants sur toutes les machines exposées à Internet. PSExec utilise le Gestionnaire de contrôle des services sur un réseau local pour démarrer un service EXE à partir d'ici, c'est-à-dire l'ordinateur sur lequel vous l'exécutez. Cela nécessite beaucoup de privilèges de sécurité - par ex. droits d'administrateur. Si vous ne voulez pas faire cela, vous pouvez regarder dans SSH (il existe des exemples de code source ouvert) ou l'invite de commande à distance (dans le Kit de ressources Windows).

+0

Si je sais correctement, en Java, il est possible, de créer un processus sur un ordinateur distant ordinateur beaucoup beaucoup plus facile. C'est la raison pour laquelle j'ai demandé, si c'est possible en C++. En passant, les machines cibles sont membres du domaine, et je suis administrateur de tous les ordinateurs, ou si je ne suis pas, je voudrais spécifier un utilisateur qui est. – kampi

+1

Si vous êtes administrateur, vous pouvez utiliser la technique suivante: 1) COPIER la chose que vous voulez exécuter dans \\ targetmachine \ C $ \ Someplace, en utilisant MoveFileEx() API 2) Utiliser OpenSCManager ("\\ targetmachine ", ...) API pour se connecter au gestionnaire de contrôle des services 3) Utiliser l'API ServiceControl() pour" exécuter "le fichier EXE en tant que service. Ce n'est pas un service, mais votre EXE sera lancé avant que le SCM s'en rende compte. – JBRWilkinson

+0

Pourriez-vous peut-être me donner un exemple comment utiliser ServiceControl()? Je ne peux pas trouver n'importe où un exemple, que je peux utiliser pour :( – kampi

1

Il est préférable que vous ayez déjà un service en cours d'exécution sur la machine distante que vous pouvez demander pour exécuter un programme. Windows lui-même ne fournit rien d'utile hors de la boîte; il est livré avec un service shell distant (qui est généralement désactivé ou même pas installé).

IIUC, ce psexec fait est ceci:

  1. copie un fichier binaire sur la machine distante, en utilisant une action administrative
  2. installer le binaire à distance en tant que service, en utilisant les opérations d'enregistrement à distance
  3. début le service à distance, en utilisant l'API du gestionnaire de contrôle de service.

Si vous ne souhaitez pas utiliser psexec, vous pouvez toujours faire de même. Notez que vous avez besoin de certains privilèges pour le faire.

+0

C'était un peu trop :) Alors, pourriez-vous peut-être me donner un exemple, comment faire cela? Je ne suis pas un programmeur professionnel, C++ est juste un de mes hobbys. Malheureusement, je ne sais pas, quelle API-s devrais-je utiliser. Pourriez-vous m'aider un peu plus? Merci d'avance! – kampi

-1

La réponse simple est que vous ne pouvez pas. Tout ce que vous pouvez faire est d'envoyer un message à la machine distante en lui demandant de démarrer le processus pour vous. PsExec s'exécute sur la machine distante en écoutant des messages spécifiques et en démarrant des processus en réponse à ces messages.

Vous pouvez utiliser un protocole existant, tel que PsExec, ou créer le vôtre. Créer le vôtre nécessite que vous puissiez installer un service sur la machine distante. Si la machine distante n'est pas sous votre contrôle, cela n'est pas possible. Si vous concevez votre propre système, vous devez faire attention lors de la conception du protocole car vous ne voulez pas ouvrir par inadvertance un trou de sécurité dans votre système.

+0

Ceci est incorrect - il n'est pas nécessaire que PSExec écoute déjà sur l'ordinateur esclave pour l'utiliser. – JBRWilkinson

+0

Mais sûrement quelque chose doit être à l'écoute, sinon PsExec puis autre chose. Si PsExec n'écoute pas lui-même, alors quelque chose d'autre doit réveiller PsExec quand la requête arrive, ce qui est en quelque sorte la même chose. Les données envoyées à un ordinateur seront jetées à moins que quelque chose sur l'ordinateur n'écoute et n'effectue des actions en réponse aux données. – Skizz

2

Vous pouvez utiliser WMI ... (C# exemple de sorte que vous devrez trouver l'équivalent C++)

ConnectionOptions connectOptions = new ConnectionOptions(); 
    connectOptions.Username = "Administrator"; 
    connectOptions.Password = "TopSecret"; 
    ManagementScope scope = new ManagementScope(
     @"\\" + machine + @"\root\cimv2", 
     connectOptions); 

    scope.Connect(); 
    ManagementPath path = new ManagementPath(@"Win32_Process"); 
    ManagementClass proc = new ManagementClass(scope, path, new ObjectGetOptions()); 
    ManagementBaseObject args = proc.GetMethodParameters("Create"); 
    args["CommandLine"] = "C:\\Windows\\notepad.exe"; 
    proc.InvokeMethod("Create", args, null); 
Questions connexes