Beispiel #1
0
        /// <summary>
        /// Loads an assembly from a specific file using the specific reading parameters.
        /// </summary>
        /// <param name="file">The file to read.</param>
        /// <param name="arguments">The reading parameters to use.</param>
        /// <returns></returns>
        /// <exception cref="System.BadImageFormatException"></exception>
        public static LWin32 LoadFile(string file, ReadingParameters arguments)
        {
            try
            {
                LWin32 a = new LWin32();
                a._path            = file;
                a.ReadingArguments = arguments;
                a._peImage         = PeImage.LoadFromAssembly(a);

                a._headerReader = PeHeaderReader.FromAssembly(a);
                a._ntHeader     = NTHeader.FromAssembly(a);
                a._mzHeader     = MZHeader.FromAssembly(a);
                a._headerReader.LoadData(arguments.IgnoreDataDirectoryAmount);


                if (!arguments.OnlyManaged)
                {
                    a._importExportTableReader = new ImportExportTableReader(a._ntHeader);
                    a._resourcesReader         = new ResourcesReader(a._ntHeader);
                }


                a._netHeader = NETHeader.FromAssembly(a);
                a._peImage.SetOffset(a._ntHeader.OptionalHeader.HeaderSize);
                return(a);
            }
            catch (Exception ex)
            {
                if (ex is AccessViolationException || ex is FileNotFoundException)
                {
                    throw;
                }
                throw new BadImageFormatException("The file is not a valid Portable Executable File.", ex);
            }
        }
Beispiel #2
0
 public ImportExportTableReader(NTHeader header)
 {
     this.header = header;
     image       = header._assembly._peImage;
     LoadExports();
     LoadImports();
 }
Beispiel #3
0
 internal NETHeaderReader(NTHeader header, NETHeader parent)
 {
     this.parent = parent;
     header._assembly._netHeader = parent;
     image         = header._assembly._peImage;
     this.ntHeader = header;
 }
Beispiel #4
0
 internal ResourceDirectoryEntry(PeImage image, uint offset, Structures.IMAGE_RESOURCE_DIRECTORY_ENTRY rawEntry, string customName)
 {
     this._image      = image;
     this._offset     = offset;
     this._rawEntry   = rawEntry;
     this._customName = customName;
 }
Beispiel #5
0
 internal LibraryReference(PeImage image, uint offset, Structures.IMAGE_IMPORT_DESCRIPTOR rawDescriptor, string libraryName, ImportMethod[] importMethods)
 {
     this._image         = image;
     this._offset        = offset;
     this._rawDescriptor = rawDescriptor;
     this.LibraryName    = libraryName;
     this.ImportMethods  = importMethods;
 }
Beispiel #6
0
 public MSILAssembler(MethodBody methodBody)
 {
     this.MethodBody  = methodBody;
     _disassembler    = new MSILDisassembler(methodBody);
     _image           = methodBody.Method._netheader._assembly.Image;
     _offsetConverter = new OffsetConverter(Section.GetSectionByRva(methodBody.Method._netheader._assembly, methodBody.Method.RVA));
     _bodyOffset      = _offsetConverter.RvaToFileOffset(methodBody.Method.RVA) + methodBody.HeaderSize;
     _tokenResolver   = methodBody.Method._netheader.TokenResolver;
 }
Beispiel #7
0
 internal ResourceDirectory(PeImage image, uint offset, ResourcesReader reader, ResourceDirectoryEntry parentEntry, Structures.IMAGE_RESOURCE_DIRECTORY rawDirectory)
 {
     this._image        = image;
     this.ParentEntry   = parentEntry;
     this._offset       = offset;
     this._fileOffset   = offset + image.ParentAssembly._ntHeader.OptionalHeader.DataDirectories[(int)DataDirectoryName.Resource].TargetOffset.FileOffset;
     this._rawDirectory = rawDirectory;
     this._reader       = reader;
 }
Beispiel #8
0
 internal NETMethodReader(PeImage peImage, MethodBody methodbody)
 {
     tokenResolver   = new MetaDataTokenResolver(peImage.ParentAssembly._netHeader);
     this.peImage    = peImage;
     this.rva        = methodbody.Method.RVA;
     this.methodbody = methodbody;
     peImage.SetOffset(Offset.FromRva(rva, peImage.ParentAssembly).FileOffset);
     rawoffset = (uint)peImage.Stream.Position;
     signature = peImage.Reader.ReadByte();
 }
Beispiel #9
0
        internal ResourceDataEntry(PeImage image, uint offset, ResourceDirectoryEntry parentEntry, Structures.IMAGE_RESOURCE_DATA_ENTRY rawDataEntry)
        {
            this._image        = image;
            this._offset       = offset;
            this.ParentEntry   = parentEntry;
            this._rawDataEntry = rawDataEntry;

            Section resourceSection = Section.GetSectionByRva(image.ParentAssembly, image.ParentAssembly._ntHeader.OptionalHeader.DataDirectories[(int)DataDirectoryName.Resource].TargetOffset.Rva);

            _targetOffset = OffsetToData - resourceSection.RVA + resourceSection.RawOffset;
        }
Beispiel #10
0
 internal ResourcesReader(NTHeader header)
 {
     this.header       = header;
     this.image        = header._assembly._peImage;
     resourceDirectory = header.OptionalHeader.DataDirectories[(int)DataDirectoryName.Resource];
     if (header._assembly._peImage.TrySetOffset(resourceDirectory.TargetOffset.FileOffset))
     {
         stream = header._assembly._peImage.ReadStream((int)resourceDirectory.Size);
         reader = new BinaryReader(stream);
         ReadRootDirectory();
     }
 }