Basic I/O

Note

The documentation has a new home: Check it out!

Every raw PE file interaction is done through classes defined by the AsmResolver.PE.File namespace:

using AsmResolver.PE.File;

Creating a new PE file

Creating a PE file can be done through one of the PEFile constructors:

var peFile = new PEFile();

This will create a new empty PE file with 0 sections, and sets some values in the file header and optional header that are typical for a 32-bit Windows console application targeting the x86 platform.

Opening a PE file

Opening a PE file can be done through one of the FromXXX methods:

byte[] raw = ...
var peFile = PEFile.FromBytes(raw);
var peFile = PEFile.FromFile(@"C:\myfile.exe");
BinaryStreamReader reader = ...
var peFile = PEFile.FromReader(reader);

By default, AsmResolver assumes the PE file is in its unmapped form. This is usually the case when files are read directly from the file system. For memory-mapped PE files, use the overload of the FromReader method, which allows for specifying the memory layout of the input.

BinaryStreamReader reader = ...
var peFile = PEFile.FromReader(reader, PEMappingMode.Mapped);

If you want to read large files (+100MB), consider using memory-mapped I/O instead:

using var service = new MemoryMappedFileService();
var peFile = PEFile.FromFile(service.OpenFile(@"C:\myfile.exe"));

On Windows, if a module is loaded and mapped in memory (e.g. as a native dependency or by the means of LoadLibrary), it is possible to load the PE file from memory by providing the HINSTANCE (a.k.a. module base address):

IntPtr hInstance = ...
var peFile = PEFile.FromModuleBaseAddress(hInstance);

Writing PE files

Writing PE files can be done through the PEFile.Write method:

using (var fs = File.Create(@"C:\patched.exe"))
{
    peFile.Write(new BinaryStreamWriter(fs));
}

AsmResolver will then reassemble the file with all the changes you made. Note that this will also recalculate some fields in the headers, such as FileHeader.NumberOfSections. Furthermore, it will also recalculate the offsets and virtual addresses of each section.