예제 #1
0
        private void UpdateOptionalHeader()
        {
            var header = Assembly.NtHeaders.OptionalHeader;

            header.SizeOfCode            = _textSectionBuilder.GetPhysicalLength();
            header.SizeOfInitializedData = (_relocSectionBuilder != null ? _relocSectionBuilder.GetPhysicalLength() : 0) +
                                           (_rsrcSectionBuilder != null ? _rsrcSectionBuilder.GetPhysicalLength() : 0);
            header.BaseOfCode = _textSectionBuilder.Header.VirtualAddress;
            if (_relocSectionBuilder != null)
            {
                header.BaseOfData = _relocSectionBuilder.Header.VirtualAddress;
            }

            var lastSection = Assembly.SectionHeaders[Assembly.SectionHeaders.Count - 1];

            header.SizeOfImage = lastSection.VirtualAddress +
                                 Align(lastSection.VirtualSize, Assembly.NtHeaders.OptionalHeader.SectionAlignment);
            header.SizeOfHeaders = 0x200;
            UpdateDataDirectories();
        }