Comment démarrer un processus sur pc distant de manière cachée et transparente

Description

Salut,

cette source montre comment démarrer sur un PC distant un processus, sans RIEN AVOIR A FAIRE sur le PC distant (aucune manipulation à faire dessus, pas de server à lancer manuellement, pas de WMI à activer...), de manière cachée.

Il suffit de démarrer le programme sur le PC principal et de cliquer sur "Go" pour créer un process sur la machine distante.

Comment çà marche ?

En gros :
- on créé une connection avec la machine distante (WNetAddConnection2)
- on copie le fichier "server.exe" sur la machine distante (CopyFile)
- on démarre le fichier "server.exe", qui est en fait un service, par OpenScmanager, CreateService et StartService (c'est là toute la subtilité !)
- le service démarré, il peut faite n'importe quoi.

Bref, ensuite si vous voulez vous transformez le service .Net en service codé en C complètement autonome, et vous avez un programme capable de faire n'importe quoi à distance (un malware pour les plus pessimistes).

Créez ensuite un tube nommé pour communiquer avec une archi client-server, et tout est possible, prochainement dans YAPM :-p

Ne pas oublier de détruire le service à la sortie du programme ! (j'ai pas viré le fichier *.exe dans l'exemple).

Pour info, c'est le fonctionnement de psexec de Sysinternals (en gros).

@+

Source / Exemple :


Option Strict On

Public Class Form1

    Private hScm As IntPtr
    Private hServ As IntPtr
    Private path As String = Replace(Application.StartupPath & "\server.exe", "\", "\\")

    Private remoteHost As String
    Private pass As String
    Private user As String
    Private Net As New API.NETRESOURCE

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        remoteHost = Me.TextBox1.Text
        pass = Me.TextBox3.Text
        user = Me.TextBox2.Text

        ' Create connection to remote computer
        Net.dwType = API.NETRESOURCE.Type.RESOURCETYPE_ANY
        Net.lpProvider = Nothing
        Net.lpLocalName = Nothing
        Net.lpRemoteName = "\\" & remoteHost & "\IPC$"

        Dim ret As Integer
        ret = API.WNetAddConnection2(Net, pass, user, API.CONNECT_COMMANDLINE)
        
        If (ret <> 0) AndAlso (user <> Nothing) Then
            If ret = 1219 Then
                ' Connection already created. Disconnecting..
                ret = CancelConnection()
            Else
                If ret = 1326 Then
                    If InStr(user, "\"c) = 0 Then
                        Dim CurrentUserName As String = "localhost\" & user
                        ret = API.WNetAddConnection2(Net, pass, CurrentUserName, API.CONNECT_UPDATE_PROFILE)
                    End If
                End If
            End If
            If ret <> 0 Then
                ' Error
                RaiseError(API.GetError)
            End If
        End If

        ' Share executable service
        Dim remote As String = "\\" & remoteHost & "\ADMIN$\System32"
        Dim ret3 As Boolean = API.CopyFile(path, remote & "\yapmserver.exe", Nothing)

        ' Create and install service
        hScm = API.OpenSCManager(remoteHost, vbNullString, CInt(API.SC_MANAGER_ALL_ACCESS))
        hServ = API.CreateService(hScm, "yapm_server", "YAPM server", _
                                  CInt(API.SERVICE_RIGHTS.SERVICE_ALL_ACCESS), _
                                  API.SERVICE_WIN32_OWN_PROCESS, _
                                  API.SERVICE_START_TYPE.DemandStart, _
                                  API.SERVICE_ERROR_CONTROL.Ignore, _
                                  remote & "\yapmserver.exe", Nothing, _
                                  Nothing, Nothing, Nothing, Nothing)

        If hServ = IntPtr.Zero Then
            If Err.LastDllError = 1073 Then
                ' Service already exists
                hServ = API.OpenService(hScm, "yapm_server", API.SERVICE_RIGHTS.SERVICE_ALL_ACCESS)
            End If
        End If

        Call API.CloseServiceHandle(hScm)

        ' Start service !
        API.apiStartService(hServ, Nothing, Nothing)

    End Sub

    ' Stop and delete service
    Private Sub DeleteService()

        ' Stop and delete service
        Dim lpss As API.SERVICE_STATUS
        API.ControlService(hServ, API.SERVICE_CONTROL._STOP, lpss)

        Call API.DeleteService(hServ)
        Call API.CloseServiceHandle(hServ)

    End Sub

    ' Cancel connection
    Private Function CancelConnection() As Integer

        Call API.WNetCancelConnection2(remoteHost, Nothing, True)
        Return API.WNetAddConnection2(Net, pass, user, API.CONNECT_UPDATE_PROFILE)

    End Function

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Call DeleteService()
        Call CancelConnection()
    End Sub

    Private Sub RaiseError(ByVal _error As String)
        Me.rtb.Text = _error
    End Sub

End Class

Conclusion :


Evidemment avec çà on peut faire un malware/virus sans problèmes, mais c'est pas le but...

Il peut y avoir des problèmes, j'ai fait çà à l'arrache !

@+

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.