Example #1
0
        private static void WriteAsn()
        {
            int[] asnIndices = Create.Array(Asns.Max(asn => asn.Number) + 1, -1);
            for (int i = 0; i < Asns.Count; i++)
            {
                asnIndices[Asns[i].Number] = i;
            }

            using MemoryStream memoryStream = new MemoryStream();

            using (BinaryWriter writer = new BinaryWriter(memoryStream, Encoding.UTF8))
            {
                writer.Write(DateTime.Now.Ticks);
                writer.Write(Asns.Count);
                writer.Write(AsnRanges.Length);
                writer.Write(AsnRanges6.Length);

                foreach (Asn asn in Asns)
                {
                    writer.Write(asn.Number);
                    writer.Write(asn.Organization);
                }
                foreach (AsnRange range in AsnRanges)
                {
                    writer.Write(GetAsnIndex(range.Asn));
                    writer.Write(range.From);
                    writer.Write(range.To);
                }
                foreach (AsnRange6 range in AsnRanges6)
                {
                    writer.Write(GetAsnIndex(range.Asn));
                    writer.Write(range.From);
                    writer.Write(range.To);
                }
            }

            File.WriteAllBytes(@"..\..\..\BytecodeApi.GeoIP.ASN\Resources\GeoIP.ASN.db", Compression.Compress(memoryStream.ToArray()));

            int GetAsnIndex(int number)
            {
                int index = asnIndices[number];

                return(index != -1 ? index : throw new FormatException("ASN ID '" + number + "' not found."));
            }
        }
Example #2
0
        /// <summary>
        /// Parses commandline arguments from a <see cref="string" /> and returns the equivalent <see cref="string" />[] with split commandline arguments.
        /// </summary>
        /// <param name="commandLine">A <see cref="string" /> specifying a commandline.</param>
        /// <returns>
        /// The equivalent <see cref="string" />[] with split commandline arguments from the given commandline.
        /// </returns>
        public static string[] ParseCommandLine(string commandLine)
        {
            Check.ArgumentNull(commandLine, nameof(commandLine));

            IntPtr argumentsPtr = Native.CommandLineToArgvW(commandLine, out int count);

            if (argumentsPtr == IntPtr.Zero)
            {
                throw Throw.Win32();
            }

            try
            {
                return(Create.Array(count, i => Marshal.PtrToStringUni(Marshal.ReadIntPtr(argumentsPtr, i * IntPtr.Size))));
            }
            finally
            {
                Native.LocalFree(argumentsPtr);
            }
        }
Example #3
0
        private PEImage(byte[] originalImage) : this()
        {
            OriginalImage             = originalImage;
            using BinaryReader reader = new BinaryReader(new MemoryStream(OriginalImage));

            // MZ
            if (reader.BaseStream.Length < 2)
            {
                throw new PEImageParseException(0, "DOS signature not found.");
            }
            if (reader.ReadUInt16() != 0x5a4d)
            {
                throw new PEImageParseException(0, "DOS header not found.");
            }

            // DOS Header
            if (reader.BaseStream.Length - reader.BaseStream.Position < 64)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "DOS header incomplete.");
            }

            DosHeader = new ImageDosHeader
            {
                LastPageSize     = reader.ReadUInt16(),
                PageCount        = reader.ReadUInt16(),
                RelocationCount  = reader.ReadUInt16(),
                HeaderSize       = reader.ReadUInt16(),
                MinAlloc         = reader.ReadUInt16(),
                MaxAlloc         = reader.ReadUInt16(),
                InitialSS        = reader.ReadUInt16(),
                InitialSP        = reader.ReadUInt16(),
                Checksum         = reader.ReadUInt16(),
                InitialIP        = reader.ReadUInt16(),
                InitialCS        = reader.ReadUInt16(),
                RelocationOffset = reader.ReadUInt16(),
                OverlayNumber    = reader.ReadUInt16(),
                Reserved1        = reader.ReadUInt16(),
                Reserved2        = reader.ReadUInt16(),
                Reserved3        = reader.ReadUInt16(),
                Reserved4        = reader.ReadUInt16(),
                OemIdentifier    = reader.ReadUInt16(),
                OemInformation   = reader.ReadUInt16(),
                Reserved5        = reader.ReadUInt16(),
                Reserved6        = reader.ReadUInt16(),
                Reserved7        = reader.ReadUInt16(),
                Reserved8        = reader.ReadUInt16(),
                Reserved9        = reader.ReadUInt16(),
                Reserved10       = reader.ReadUInt16(),
                Reserved11       = reader.ReadUInt16(),
                Reserved12       = reader.ReadUInt16(),
                Reserved13       = reader.ReadUInt16(),
                Reserved14       = reader.ReadUInt16(),
                PEHeaderOffset   = reader.ReadUInt32()
            };

            // DOS Stub
            if (reader.BaseStream.Length < DosHeader.PEHeaderOffset)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "DOS stub incomplete.");
            }

            DosStub = reader.ReadBytes((int)(DosHeader.PEHeaderOffset - reader.BaseStream.Position));

            // COFF Header
            if (reader.ReadUInt32() != 0x4550)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position - 4, "COFF header not found.");
            }
            if (reader.BaseStream.Length - reader.BaseStream.Position < 20)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "COFF header incomplete.");
            }

            CoffHeader = new ImageCoffHeader
            {
                Machine              = (ImageMachineType)reader.ReadUInt16(),
                NumberOfSections     = reader.ReadUInt16(),
                TimeDateStamp        = reader.ReadUInt32(),
                PointerToSymbolTable = reader.ReadUInt32(),
                NumberOfSymbols      = reader.ReadUInt32(),
                SizeOfOptionalHeader = reader.ReadUInt16(),
                Characteristics      = (ImageCharacteristics)reader.ReadUInt16()
            };

            // Optional Header
            if (reader.BaseStream.Length - reader.BaseStream.Position < 2)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header not found.");
            }
            ushort magic = reader.ReadUInt16();

            if (magic == 0x10b)
            {
                if (reader.BaseStream.Length - reader.BaseStream.Position < 94)
                {
                    throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header incomplete.");
                }

                OptionalHeader = new ImageOptionalHeader32
                {
                    MajorLinkerVersion      = reader.ReadByte(),
                    MinorLinkerVersion      = reader.ReadByte(),
                    SizeOfCode              = reader.ReadUInt32(),
                    SizeOfInitializedData   = reader.ReadUInt32(),
                    SizeOfUninitializedData = reader.ReadUInt32(),
                    AddressOfEntryPoint     = reader.ReadUInt32(),
                    BaseOfCode              = reader.ReadUInt32(),
                    BaseOfData              = reader.ReadUInt32(),
                    ImageBase                   = reader.ReadUInt32(),
                    SectionAlignment            = reader.ReadUInt32(),
                    FileAlignment               = reader.ReadUInt32(),
                    MajorOperatingSystemVersion = reader.ReadUInt16(),
                    MinorOperatingSystemVersion = reader.ReadUInt16(),
                    MajorImageVersion           = reader.ReadUInt16(),
                    MinorImageVersion           = reader.ReadUInt16(),
                    MajorSubsystemVersion       = reader.ReadUInt16(),
                    MinorSubsystemVersion       = reader.ReadUInt16(),
                    Win32VersionValue           = reader.ReadUInt32(),
                    SizeOfImage                 = reader.ReadUInt32(),
                    SizeOfHeaders               = reader.ReadUInt32(),
                    Checksum            = reader.ReadUInt32(),
                    Subsystem           = (ImageSubsystem)reader.ReadUInt16(),
                    DllCharacteristics  = (ImageDllCharacteristics)reader.ReadUInt16(),
                    SizeOfStackReserve  = reader.ReadUInt32(),
                    SizeOfStackCommit   = reader.ReadUInt32(),
                    SizeOfHeapReserve   = reader.ReadUInt32(),
                    SizeOfHeapCommit    = reader.ReadUInt32(),
                    LoaderFlags         = reader.ReadUInt32(),
                    NumberOfRvaAndSizes = reader.ReadUInt32()
                };
            }
            else if (magic == 0x20b)
            {
                if (reader.BaseStream.Length - reader.BaseStream.Position < 110)
                {
                    throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header incomplete.");
                }

                OptionalHeader = new ImageOptionalHeader64
                {
                    MajorLinkerVersion      = reader.ReadByte(),
                    MinorLinkerVersion      = reader.ReadByte(),
                    SizeOfCode              = reader.ReadUInt32(),
                    SizeOfInitializedData   = reader.ReadUInt32(),
                    SizeOfUninitializedData = reader.ReadUInt32(),
                    AddressOfEntryPoint     = reader.ReadUInt32(),
                    BaseOfCode              = reader.ReadUInt32(),
                    ImageBase                   = reader.ReadUInt64(),
                    SectionAlignment            = reader.ReadUInt32(),
                    FileAlignment               = reader.ReadUInt32(),
                    MajorOperatingSystemVersion = reader.ReadUInt16(),
                    MinorOperatingSystemVersion = reader.ReadUInt16(),
                    MajorImageVersion           = reader.ReadUInt16(),
                    MinorImageVersion           = reader.ReadUInt16(),
                    MajorSubsystemVersion       = reader.ReadUInt16(),
                    MinorSubsystemVersion       = reader.ReadUInt16(),
                    Win32VersionValue           = reader.ReadUInt32(),
                    SizeOfImage                 = reader.ReadUInt32(),
                    SizeOfHeaders               = reader.ReadUInt32(),
                    Checksum            = reader.ReadUInt32(),
                    Subsystem           = (ImageSubsystem)reader.ReadUInt16(),
                    DllCharacteristics  = (ImageDllCharacteristics)reader.ReadUInt16(),
                    SizeOfStackReserve  = reader.ReadUInt64(),
                    SizeOfStackCommit   = reader.ReadUInt64(),
                    SizeOfHeapReserve   = reader.ReadUInt64(),
                    SizeOfHeapCommit    = reader.ReadUInt64(),
                    LoaderFlags         = reader.ReadUInt32(),
                    NumberOfRvaAndSizes = reader.ReadUInt32()
                };
            }
            else if (magic == 0x107)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position - 2, "Optional header for ROM's is not supported.");
            }
            else
            {
                throw new PEImageParseException((int)reader.BaseStream.Position - 2, "Optional header magic value of '0x" + magic.ToString("x4") + "' unknown.");
            }

            // Data Directories
            if (reader.BaseStream.Length - reader.BaseStream.Position < OptionalHeader.NumberOfRvaAndSizes * 8)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "Data directories incomplete.");
            }

            OptionalHeader.DataDirectories = Create.Array((int)OptionalHeader.NumberOfRvaAndSizes, i => new ImageDataDirectory((ImageDataDirectoryName)i, reader.ReadUInt32(), reader.ReadUInt32()));

            // Section Headers
            if (reader.BaseStream.Length - reader.BaseStream.Position < CoffHeader.NumberOfSections * 40)
            {
                throw new PEImageParseException((int)reader.BaseStream.Position, "Section headers incomplete.");
            }

            Sections = Create
                       .Enumerable(CoffHeader.NumberOfSections, i => new ImageSectionHeader
            {
                Name                 = reader.ReadBytes(8).TakeWhile(c => c != 0).ToArray().ToUTF8String(),
                VirtualSize          = reader.ReadUInt32(),
                VirtualAddress       = reader.ReadUInt32(),
                SizeOfRawData        = reader.ReadUInt32(),
                PointerToRawData     = reader.ReadUInt32(),
                PointerToRelocations = reader.ReadUInt32(),
                PointerToLineNumbers = reader.ReadUInt32(),
                NumberOfRelocations  = reader.ReadUInt16(),
                NumberOfLineNumbers  = reader.ReadUInt16(),
                Characteristics      = (ImageSectionFlags)reader.ReadUInt32()
            })
                       .Select(header =>
            {
                if (header.PointerToRawData + header.SizeOfRawData <= reader.BaseStream.Length)
                {
                    return(new ImageSection(header, OriginalImage.GetBytes((int)header.PointerToRawData, (int)header.SizeOfRawData)));
                }
                else
                {
                    throw new PEImageParseException((int)reader.BaseStream.Position, "Section '" + header.Name + "' incomplete.");
                }
            })
                       .ToArray();
        }
Example #4
0
        private static void ParseCities()
        {
            Cities = CsvFile
                     .EnumerateBinary(Csv.City, ",", true, false, Encoding.UTF8)
                     .Select(row => new City
            {
                ID                  = row[0].Int32Value.Value,
                CountryIndex        = GetCountryIndex(row[4].Value),
                Name                = row[10].Value,
                Subdivision1Name    = row[7].Value,
                Subdivision1IsoCode = row[6].Value,
                Subdivision2Name    = row[9].Value,
                Subdivision2IsoCode = row[8].Value,
                TimeZone            = row[12].Value
            })
                     .OrderBy(city => city.Name, StringComparer.OrdinalIgnoreCase)
                     .ToArray();

            int[] cityIndices = Create.Array(Cities.Max(city => city.ID) + 1, -1);
            for (int i = 0; i < Cities.Length; i++)
            {
                cityIndices[Cities[i].ID] = i;
            }

            CityRanges = CsvFile
                         .EnumerateBinary(Csv.CityRange, ",", true, false, Encoding.UTF8)
                         .Where(row => row[1].Value != "")
                         .Select(row =>
            {
                ConvertCidr(row[0].Value, out uint from, out uint to);

                return(new CityRange
                {
                    CityIndex = GetCityIndex(row[1].Int32Value.Value),
                    PostalCode = row[6].Value,
                    Latitude = row[7].Value.ToSingleOrNull().Value,
                    Longitude = row[8].Value.ToSingleOrNull().Value,
                    AccuracyRadius = Convert.ToInt16(row[9].Int32Value.Value),
                    From = from,
                    To = to
                });
            })
                         .ToArray();

            CityRanges6 = CsvFile
                          .EnumerateBinary(Csv.CityRange6, ",", true, false, Encoding.UTF8)
                          .Where(row => row[1].Value != "")
                          .Select(row =>
            {
                ConvertCidr(row[0].Value, out byte[] from, out byte[] to);

                return(new CityRange6
                {
                    CityIndex = GetCityIndex(row[1].Int32Value.Value),
                    PostalCode = row[6].Value,
                    Latitude = row[7].Value.ToSingleOrNull().Value,
                    Longitude = row[8].Value.ToSingleOrNull().Value,
                    AccuracyRadius = Convert.ToInt16(row[9].Int32Value.Value),
                    From = from,
                    To = to
                });
            })
                          .ToArray();

            byte GetCountryIndex(string isoCode)
            {
                int index = Countries.IndexOf(country => country.IsoCode == isoCode);

                return(index != -1 ? (byte)index : byte.MaxValue);
            }

            int GetCityIndex(int id)
            {
                int index = cityIndices[id];

                return(index != -1 ? index : throw new FormatException("City ID '" + id + "' not found."));
            }
        }