Exemple #1
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Processes the Optional Header (usually Image only)
        /// </summary>
        /// ------------------------------------------------------------------------------------
        private void ProcessOptionalHeader()
        {
            long  nOptHeaderBase = m_stream.Position;
            short magicNumber    = m_reader.ReadInt16();

            if (magicNumber != 0x10b && magicNumber != 0x20b)
            {
                throw new ApplicationException("No valid magic number in Optional Header");
            }

            // Zero out checksum
            m_stream.Position = nOptHeaderBase + 64;
            m_writer.Write((int)0);

            bool fPE32plus = (magicNumber == 0x20b);

            m_stream.Position = nOptHeaderBase + (fPE32plus ? 108 : 92);
            int nDirectories = m_reader.ReadInt32();

            for (int i = 0; i < nDirectories; i++)
            {
                m_htDirectories[m_directoryNames[i]] =
                    new ImageDataDirectory(m_reader.ReadInt32(), m_reader.ReadInt32(), i);
            }
        }
Exemple #2
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Processes one section.
        /// </summary>
        /// <param name="addressVirtual">The address when loaded.</param>
        /// <param name="sizeVirtual">The virtual size (size on disk).</param>
        /// ------------------------------------------------------------------------------------
        private void ProcessSection(int addressVirtual, int sizeVirtual)
        {
            long nSectionBase = m_stream.Position;

            foreach (DictionaryEntry entry in m_htDirectories)
            {
                m_stream.Position = nSectionBase;
                ImageDataDirectory dir = (ImageDataDirectory)entry.Value;
                if (dir.VirtualAddress >= addressVirtual &&
                    dir.VirtualAddress < addressVirtual + sizeVirtual)
                {
                    m_stream.Position = dir.VirtualAddress - addressVirtual + nSectionBase;

                    switch (dir.Index)
                    {
                    case 0:                             // Export Table
                    case 1:                             // Import Table
                        m_stream.Position += 4;
                        OverwriteTimestamp();
                        break;

                    case 2:                             // Resource Table
                        ResourceProcessor resourceProcessor = new ResourceProcessor(m_stream,
                                                                                    m_reader, m_writer);
                        resourceProcessor.ProcessResourceSection(dir.VirtualAddress);
                        break;

                    case 6:                             // Debug
                        ProcessDebugInfo();
                        break;

                    case 14:                             // CLI Header
                        CLIFileProcessor cliFileProcessor = new CLIFileProcessor(m_stream,
                                                                                 m_reader, m_writer);
                        cliFileProcessor.ProcessCLIHeader(nSectionBase, addressVirtual);
                        break;

                    default:
                        break;
                    }
                }
            }
        }
Exemple #3
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Processes the Optional Header (usually Image only)
		/// </summary>
		/// ------------------------------------------------------------------------------------
		private void ProcessOptionalHeader()
		{
			long nOptHeaderBase = m_stream.Position;
			short magicNumber = m_reader.ReadInt16();
			if (magicNumber != 0x10b && magicNumber != 0x20b)
				throw new ApplicationException("No valid magic number in Optional Header");

			// Zero out checksum
			m_stream.Position = nOptHeaderBase + 64;
			m_writer.Write((int)0);

			bool fPE32plus = (magicNumber == 0x20b);

			m_stream.Position = nOptHeaderBase + (fPE32plus ? 108 : 92);
			int nDirectories = m_reader.ReadInt32();

			for (int i = 0; i < nDirectories; i++)
			{
				m_htDirectories[m_directoryNames[i]] =
					new ImageDataDirectory(m_reader.ReadInt32(), m_reader.ReadInt32(), i);
			}
		}