/// ------------------------------------------------------------------------------------ /// <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); } }
/// ------------------------------------------------------------------------------------ /// <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; } } } }
/// ------------------------------------------------------------------------------------ /// <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); } }