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 !
@+
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.