Browse Source
Модуль Services переименован в Svc. Жобавлена функция инициализации, функция запуска winvnc.exe (пока только в качестве приложения).master
cyrax
6 years ago
5 changed files with 306 additions and 189 deletions
@ -0,0 +1,255 @@ |
|||||
|
Module Svc |
||||
|
' Каталог исполняемых файлов UltraVNC |
||||
|
Private sRunTimeDir As String = String.Empty |
||||
|
|
||||
|
' Исполняемые и конфигурационные файлы UltraVNC |
||||
|
' В процессе инициализации распаковываются из ресурсов приложения в <sRunTimeDir> |
||||
|
Private aExecResources(,) As String = { |
||||
|
{"lvnc_rs_ini", "\lvnc_rs.ini"}, |
||||
|
{"ultravnc_ini", "\UltraVNC\ultravnc.ini"}, |
||||
|
{"setpasswd_exe", "\UltraVNC\setpasswd.exe"}, |
||||
|
{"winvnc_exe", "\UltraVNC\winvnc.exe"}, |
||||
|
{"authadmin_dll", "\UltraVNC\authadmin.dll"}, |
||||
|
{"ddengine_dll", "\UltraVNC\ddengine.dll"}, |
||||
|
{"SCHook_dll", "\UltraVNC\SCHook.dll"}, |
||||
|
{"vnchooks_dll", "\UltraVNC\vnchooks.dll"}, |
||||
|
{"SecureVNCPlugin_dsm", "\UltraVNC\SecureVNCPlugin.dsm"} |
||||
|
} |
||||
|
|
||||
|
' Адрес хоста и порт VNC-прокси |
||||
|
Private sProxyHost As String = String.Empty |
||||
|
Private sProxyPort As String = String.Empty |
||||
|
|
||||
|
' ID сеанса для подключения |
||||
|
Public sSupportID As String = String.Empty |
||||
|
' Пароль для подключения |
||||
|
Public sSupportPasswd As String = String.Empty |
||||
|
|
||||
|
' Флаг доступности VNC-прокси |
||||
|
' Может принимать следующие значения: |
||||
|
' 0 = Неопределённое состояние (при старте приложения); |
||||
|
' 1 = Прокси доступен для подключения; |
||||
|
' 2 = Покси недоступен. |
||||
|
Public bProxyStatus As Byte = 0 |
||||
|
|
||||
|
' Настройки приложения |
||||
|
Private oConfigFile As New IniFile |
||||
|
|
||||
|
' Процесс winvnc.exe |
||||
|
Private VNCProc As Process = Nothing |
||||
|
|
||||
|
''' <summary> |
||||
|
''' Инициализация приложения |
||||
|
''' </summary> |
||||
|
''' <returns> |
||||
|
''' True - в случае успешной инициализации |
||||
|
''' False - что-то пошло не так |
||||
|
''' </returns> |
||||
|
Public Function Init() As Boolean |
||||
|
sRunTimeDir = GetAllUsersDir() & "\LVNC-RS" |
||||
|
|
||||
|
If sRunTimeDir.Length > 0 Then |
||||
|
' Если расположение каталога исполняемых файлов получено, |
||||
|
' проверяем его наличие на диске и, при необходимости, создаем. |
||||
|
' Так же проверяем наличие всех файлов UltraVNC. При необходимости |
||||
|
' распаковываем из ресурсов. |
||||
|
If Not CheckExecResources() Then |
||||
|
Return False |
||||
|
End If |
||||
|
|
||||
|
' Читаем настройки |
||||
|
oConfigFile.Load(sRunTimeDir & "\lvnc_rs.ini") |
||||
|
sProxyHost = oConfigFile.GetKeyValue("repeater", "host") |
||||
|
sProxyPort = oConfigFile.GetKeyValue("repeater", "serverport") |
||||
|
|
||||
|
If sProxyHost.Length = 0 Or sProxyPort.Length = 0 Then Return False |
||||
|
|
||||
|
' Генерируем ID и пароль |
||||
|
sSupportID = GetSupportID() |
||||
|
sSupportPasswd = GetSupportPasswd() |
||||
|
|
||||
|
Return True |
||||
|
Else |
||||
|
Return False |
||||
|
End If |
||||
|
End Function |
||||
|
|
||||
|
Public Sub CheckProxy() |
||||
|
Dim hostEntry As Net.IPHostEntry |
||||
|
Dim ipAddress As Net.IPAddress |
||||
|
Dim epHost As Net.IPEndPoint |
||||
|
Dim socket As Net.Sockets.Socket |
||||
|
|
||||
|
Try |
||||
|
hostEntry = Net.Dns.GetHostEntry(sProxyHost) |
||||
|
Catch ex As Exception |
||||
|
bProxyStatus = 2 |
||||
|
Exit Sub |
||||
|
End Try |
||||
|
|
||||
|
If hostEntry.AddressList.Count > 0 Then |
||||
|
ipAddress = hostEntry.AddressList.FirstOrDefault |
||||
|
epHost = New Net.IPEndPoint(ipAddress, Convert.ToInt32(sProxyPort)) |
||||
|
socket = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) |
||||
|
|
||||
|
Try |
||||
|
socket.Connect(epHost) |
||||
|
Catch ex As Exception |
||||
|
|
||||
|
End Try |
||||
|
End If |
||||
|
|
||||
|
If socket.Connected Then |
||||
|
bProxyStatus = 1 |
||||
|
Else |
||||
|
bProxyStatus = 2 |
||||
|
End If |
||||
|
|
||||
|
Try |
||||
|
socket.Disconnect(False) |
||||
|
Catch ex As Exception |
||||
|
|
||||
|
End Try |
||||
|
End Sub |
||||
|
|
||||
|
Public Function StartVNC() As Boolean |
||||
|
Dim sVNCDir As String = sRunTimeDir & "\UltraVNC" |
||||
|
Dim sVNCExec As String = sVNCDir & "\winvnc.exe" |
||||
|
Dim sVNCExecParam As String = "-autoreconnect ID:" & sSupportID & " -connect " & sProxyHost & ":" & sProxyPort & " -run" |
||||
|
|
||||
|
Dim VNCStartInfo As New ProcessStartInfo |
||||
|
With VNCStartInfo |
||||
|
.Arguments = sVNCExecParam |
||||
|
.FileName = sVNCExec |
||||
|
.UseShellExecute = True |
||||
|
.WorkingDirectory = sVNCDir |
||||
|
End With |
||||
|
|
||||
|
Try |
||||
|
VNCProc = Process.Start(VNCStartInfo) |
||||
|
Catch ex As System.ComponentModel.Win32Exception |
||||
|
Return False |
||||
|
End Try |
||||
|
|
||||
|
Return True |
||||
|
End Function |
||||
|
|
||||
|
Public Function StopVNC() As Boolean |
||||
|
If VNCProc IsNot Nothing And VNCProc.Id <> 0 Then |
||||
|
VNCProc. |
||||
|
End If |
||||
|
End Function |
||||
|
|
||||
|
Private Function GetAllUsersDir() As String |
||||
|
Dim sRegShellPath As String = "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" |
||||
|
Dim sAllUsersDir As String = String.Empty |
||||
|
Dim sCommonDesktop As String = String.Empty |
||||
|
|
||||
|
Dim regKey As Global.Microsoft.Win32.RegistryKey |
||||
|
|
||||
|
Try |
||||
|
regKey = Global.Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sRegShellPath, False) |
||||
|
sCommonDesktop = regKey.GetValue("Common Desktop") |
||||
|
Catch ex As Exception |
||||
|
sCommonDesktop = "" |
||||
|
End Try |
||||
|
|
||||
|
If sCommonDesktop.Length > 0 Then |
||||
|
Dim a() = sCommonDesktop.Split("\") |
||||
|
Dim l As Integer = a.Length - 2 |
||||
|
ReDim Preserve a(l) |
||||
|
|
||||
|
sAllUsersDir = String.Join("\", a) |
||||
|
Else |
||||
|
sAllUsersDir = "" |
||||
|
End If |
||||
|
|
||||
|
Return sAllUsersDir |
||||
|
End Function |
||||
|
|
||||
|
Private Function CheckExecResources() As Boolean |
||||
|
Dim resItem As Object |
||||
|
Dim resContent As Byte() |
||||
|
|
||||
|
If Not IO.Directory.Exists(sRunTimeDir) Then |
||||
|
IO.Directory.CreateDirectory(sRunTimeDir) |
||||
|
End If |
||||
|
|
||||
|
If Not IO.Directory.Exists(sRunTimeDir & "\UltraVNC") Then |
||||
|
IO.Directory.CreateDirectory(sRunTimeDir & "\UltraVNC") |
||||
|
End If |
||||
|
|
||||
|
For i As Integer = 0 To UBound(aExecResources) |
||||
|
If Not IO.File.Exists(sRunTimeDir & aExecResources(i, 1)) Then |
||||
|
resItem = My.Resources.ResourceManager.GetObject(aExecResources(i, 0)) |
||||
|
If TypeOf (resItem) Is String Then |
||||
|
resContent = Text.Encoding.Default.GetBytes(resItem.ToString) |
||||
|
Else |
||||
|
resContent = resItem |
||||
|
End If |
||||
|
|
||||
|
Using file As New IO.FileStream(sRunTimeDir & aExecResources(i, 1), IO.FileMode.Create) |
||||
|
file.Write(resContent, 0, resContent.Length) |
||||
|
End Using |
||||
|
End If |
||||
|
Next |
||||
|
|
||||
|
Return True |
||||
|
End Function |
||||
|
|
||||
|
Private Function GetSupportID() As String |
||||
|
' Если ID сохранён в файле настроек, возвращаем его |
||||
|
Dim sID As String = oConfigFile.GetKeyValue("lvnc", "ID") |
||||
|
If sID IsNot Nothing And sID <> String.Empty Then Return sID |
||||
|
|
||||
|
' Генерация ID на основе MAC-адреса первого доступного и активного сетевого интерфейса (Ethernet или Wi-Fi) |
||||
|
Dim aNics() As Net.NetworkInformation.NetworkInterface = Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() |
||||
|
Dim sMAC As String = String.Empty |
||||
|
Dim iID As Integer = 0 |
||||
|
|
||||
|
For Each nic As Net.NetworkInformation.NetworkInterface In aNics |
||||
|
If (nic.NetworkInterfaceType = Net.NetworkInformation.NetworkInterfaceType.Ethernet Or |
||||
|
nic.NetworkInterfaceType = Net.NetworkInformation.NetworkInterfaceType.Wireless80211) And |
||||
|
nic.OperationalStatus = Net.NetworkInformation.OperationalStatus.Up Then |
||||
|
sMAC = nic.GetPhysicalAddress.ToString |
||||
|
Exit For |
||||
|
End If |
||||
|
Next |
||||
|
|
||||
|
Dim strBuilder As New Text.StringBuilder(sMAC) |
||||
|
Dim startIndex As Integer = strBuilder.Length - (strBuilder.Length Mod 2) - 2 |
||||
|
|
||||
|
For i As Integer = startIndex To 2 Step -2 |
||||
|
strBuilder.Insert(i, ":"c) |
||||
|
Next i |
||||
|
|
||||
|
Dim aMAC() = strBuilder.ToString.Split(":") |
||||
|
Dim n As Integer = 0 |
||||
|
For i As Integer = 0 To UBound(aMAC) |
||||
|
n = Convert.ToInt32(aMAC(i), 16) |
||||
|
Debug.Print(n) |
||||
|
|
||||
|
iID = ((iID * 16) + n) Mod 99999999 |
||||
|
|
||||
|
If iID < 99999999 Then |
||||
|
iID = iID + 10000000 |
||||
|
End If |
||||
|
Next |
||||
|
|
||||
|
' Сохраняем ID в конфиг |
||||
|
oConfigFile.SetKeyValue("lvnc", "ID", iID.ToString) |
||||
|
oConfigFile.Save(sRunTimeDir & "\lvnc_rs.ini") |
||||
|
|
||||
|
Return iID.ToString |
||||
|
End Function |
||||
|
|
||||
|
Private Function GetSupportPasswd() As String |
||||
|
' Проверяем наличие сохранённого пароля на случай перезапуска от имени администратора |
||||
|
Dim pwd As String = oConfigFile.GetKeyValue("lvnc", "passwd") |
||||
|
If pwd IsNot Nothing And pwd <> String.Empty Then Return pwd |
||||
|
|
||||
|
Dim rndGen As New System.Random |
||||
|
|
||||
|
Return (rndGen.Next(1000, 10000).ToString) |
||||
|
End Function |
||||
|
End Module |
@ -1,158 +0,0 @@ |
|||||
Module Services |
|
||||
Private sRunTimeDir As String = getRunTimeDir() & "\LVNC-RS" |
|
||||
Private oConfigFile As New IniFile |
|
||||
|
|
||||
Public sSupportID As String = String.Empty |
|
||||
Public sSupportPasswd As String = String.Empty |
|
||||
Public byProxyStatus As Byte = 0 |
|
||||
|
|
||||
Public sProxyHost As String = String.Empty |
|
||||
Public sProxyPort As String = String.Empty |
|
||||
|
|
||||
Private aExecResources(,) As String = { |
|
||||
{"lvnc_rs_ini", "\lvnc_rs.ini"}, |
|
||||
{"ultravnc_ini", "\UltraVNC\ultravnc.ini"}, |
|
||||
{"setpasswd_exe", "\UltraVNC\setpasswd.exe"}, |
|
||||
{"winvnc_exe", "\UltraVNC\winvnc.exe"}, |
|
||||
{"authadmin_dll", "\UltraVNC\authadmin.dll"}, |
|
||||
{"ddengine_dll", "\UltraVNC\ddengine.dll"}, |
|
||||
{"SCHook_dll", "\UltraVNC\SCHook.dll"}, |
|
||||
{"vnchooks_dll", "\UltraVNC\vnchooks.dll"}, |
|
||||
{"SecureVNCPlugin_dsm", "\UltraVNC\SecureVNCPlugin.dsm"} |
|
||||
} |
|
||||
|
|
||||
Private Function getRunTimeDir() As String |
|
||||
Dim sRegShellPath As String = "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" |
|
||||
Dim sAllUsersDir As String |
|
||||
|
|
||||
Dim regKey As Global.Microsoft.Win32.RegistryKey |
|
||||
Dim sCommonDesktop As String |
|
||||
|
|
||||
Try |
|
||||
regKey = Global.Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sRegShellPath, False) |
|
||||
sCommonDesktop = regKey.GetValue("Common Desktop") |
|
||||
Catch ex As Exception |
|
||||
sCommonDesktop = "" |
|
||||
End Try |
|
||||
|
|
||||
If sCommonDesktop.Length > 0 Then |
|
||||
Dim a() = sCommonDesktop.Split("\") |
|
||||
Dim l As Integer = a.Length - 2 |
|
||||
ReDim Preserve a(l) |
|
||||
|
|
||||
sAllUsersDir = String.Join("\", a) |
|
||||
Else |
|
||||
sAllUsersDir = "" |
|
||||
End If |
|
||||
|
|
||||
Return sAllUsersDir |
|
||||
End Function |
|
||||
|
|
||||
Public Sub checkRunTimeComponents() |
|
||||
Dim resItem As Object |
|
||||
Dim resContent As Byte() |
|
||||
|
|
||||
With My.Computer.FileSystem |
|
||||
If Not .DirectoryExists(sRunTimeDir) Then |
|
||||
.CreateDirectory(sRunTimeDir) |
|
||||
End If |
|
||||
If Not .DirectoryExists(sRunTimeDir & "\UltraVNC") Then |
|
||||
.CreateDirectory(sRunTimeDir & "\UltraVNC") |
|
||||
End If |
|
||||
|
|
||||
For i As Integer = 0 To UBound(aExecResources) |
|
||||
resItem = My.Resources.ResourceManager.GetObject(aExecResources(i, 0)) |
|
||||
If TypeOf (resItem) Is String Then |
|
||||
resContent = System.Text.Encoding.Default.GetBytes(resItem.ToString) |
|
||||
Else |
|
||||
resContent = resItem |
|
||||
End If |
|
||||
|
|
||||
Using file As New IO.FileStream(sRunTimeDir & aExecResources(i, 1), IO.FileMode.Create) |
|
||||
file.Write(resContent, 0, resContent.Length) |
|
||||
End Using |
|
||||
Next |
|
||||
End With |
|
||||
|
|
||||
oConfigFile.Load(sRunTimeDir & "\lvnc_rs.ini") |
|
||||
sProxyHost = oConfigFile.GetKeyValue("repeater", "host") |
|
||||
sProxyPort = oConfigFile.GetKeyValue("repeater", "serverport") |
|
||||
End Sub |
|
||||
|
|
||||
Public Sub getSupportID() |
|
||||
Dim aNics() As Net.NetworkInformation.NetworkInterface = Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() |
|
||||
Dim sMAC As String = String.Empty |
|
||||
Dim iID As Integer = 0 |
|
||||
|
|
||||
For Each nic As Net.NetworkInformation.NetworkInterface In aNics |
|
||||
If (nic.NetworkInterfaceType = Net.NetworkInformation.NetworkInterfaceType.Ethernet Or |
|
||||
nic.NetworkInterfaceType = Net.NetworkInformation.NetworkInterfaceType.Wireless80211) And |
|
||||
nic.OperationalStatus = Net.NetworkInformation.OperationalStatus.Up Then |
|
||||
sMAC = nic.GetPhysicalAddress.ToString |
|
||||
Exit For |
|
||||
End If |
|
||||
Next |
|
||||
|
|
||||
Dim strBuilder As New Text.StringBuilder(sMAC) |
|
||||
Dim startIndex As Integer = strBuilder.Length - (strBuilder.Length Mod 2) - 2 |
|
||||
|
|
||||
For i As Integer = startIndex To 2 Step -2 |
|
||||
strBuilder.Insert(i, ":"c) |
|
||||
Next i |
|
||||
|
|
||||
Dim aMAC() = strBuilder.ToString.Split(":") |
|
||||
Dim n As Integer = 0 |
|
||||
For i As Integer = 0 To UBound(aMAC) |
|
||||
n = Convert.ToInt32(aMAC(i), 16) |
|
||||
Debug.Print(n) |
|
||||
|
|
||||
iID = ((iID * 16) + n) Mod 99999999 |
|
||||
|
|
||||
If iID < 99999999 Then |
|
||||
iID = iID + 10000000 |
|
||||
End If |
|
||||
Next |
|
||||
sSupportID = iID.ToString |
|
||||
End Sub |
|
||||
|
|
||||
Public Sub getSupportPasswd() |
|
||||
Dim rndGen As New System.Random |
|
||||
|
|
||||
sSupportPasswd = rndGen.Next(1000, 10000).ToString |
|
||||
End Sub |
|
||||
|
|
||||
Public Sub checkProxy(ByRef sHost As String, ByRef sPort As String) |
|
||||
Dim hostEntry As Net.IPHostEntry |
|
||||
Dim ipAddress As Net.IPAddress |
|
||||
Dim epHost As Net.IPEndPoint |
|
||||
Dim socket As Net.Sockets.Socket |
|
||||
|
|
||||
Try |
|
||||
hostEntry = Net.Dns.GetHostEntry(sHost) |
|
||||
Catch ex As Exception |
|
||||
byProxyStatus = 2 |
|
||||
|
|
||||
Exit Sub |
|
||||
End Try |
|
||||
|
|
||||
If hostEntry.AddressList.Count > 0 Then |
|
||||
ipAddress = hostEntry.AddressList.FirstOrDefault |
|
||||
epHost = New Net.IPEndPoint(ipAddress, Convert.ToInt32(sPort)) |
|
||||
socket = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) |
|
||||
|
|
||||
Try |
|
||||
socket.Connect(epHost) |
|
||||
Catch ex As Exception |
|
||||
|
|
||||
End Try |
|
||||
End If |
|
||||
|
|
||||
If socket.Connected Then |
|
||||
byProxyStatus = 1 |
|
||||
Else |
|
||||
byProxyStatus = 2 |
|
||||
End If |
|
||||
|
|
||||
socket.Disconnect(False) |
|
||||
End Sub |
|
||||
End Module |
|
Reference in new issue