void CalcHeaders() { _dosHeader = (IMAGE_DOS_HEADER *)_address; _ntHeaders32 = (IMAGE_NT_HEADERS32 *)(_address + _dosHeader->e_lfanew); _ntHeaders64 = (IMAGE_NT_HEADERS64 *)(_address + _dosHeader->e_lfanew); _isPE64 = _ntHeaders32->OptionalHeader.Magic == (ushort)OptionalHeaderMagic.PE32Plus; _fileHeader = _isPE64 ? &_ntHeaders64->FileHeader : &_ntHeaders32->FileHeader; _header32 = &_ntHeaders32->OptionalHeader; _header64 = &_ntHeaders64->OptionalHeader; _sections = new IMAGE_SECTION_HEADER[_fileHeader->NumberOfSections]; var offset = _isPE64 ? sizeof(IMAGE_NT_HEADERS64) : sizeof(IMAGE_NT_HEADERS32); fixed(void *sections = _sections) { Buffer.MemoryCopy((byte *)_ntHeaders32 + offset, sections, _sections.Length * sizeof(IMAGE_SECTION_HEADER), _sections.Length * sizeof(IMAGE_SECTION_HEADER)); } FileHeader = new FileHeader(_fileHeader); if (IsPE64) { OptionalHeader = new OptionalHeader(_header64); } else { OptionalHeader = new OptionalHeader(_header32); } _workBuffer = Marshal.AllocCoTaskMem(1 << 12); }
private static bool GetLibraryInfo(IntPtr handle, out DynLibInfo lib) { lib = new DynLibInfo(); if (handle == IntPtr.Zero) { return(false); } MEMORY_BASIC_INFORMATION info; if (VirtualQuery(handle, out info, Marshal.SizeOf <MEMORY_BASIC_INFORMATION>()) == 0) { return(false); } //uintptr_t baseAddr = reinterpret_cast<uintptr_t>(info.AllocationBase); IMAGE_DOS_HEADER * dos = (IMAGE_DOS_HEADER *)info.AllocationBase; IMAGE_NT_HEADERS * pe = (IMAGE_NT_HEADERS *)(info.AllocationBase + dos->e_lfanew); IMAGE_FILE_HEADER * file = &pe->FileHeader; IMAGE_OPTIONAL_HEADER *opt = &pe->OptionalHeader; if (dos->e_magic != IMAGE_DOS_SIGNATURE) { return(false); } if (pe->Signature != IMAGE_NT_SIGNATURE) { return(false); } if (opt->Magic != MagicType.IMAGE_NT_OPTIONAL_HDR32_MAGIC) { return(false); } if (file->Machine != 0x014c)// Intel 386. { return(false); } if ((file->Characteristics & 0x2000) == 0)// File is a DLL. { return(false); } lib.memorySize = opt->SizeOfImage; lib.baseAddress = info.AllocationBase; return(true); }
internal FileHeader(IMAGE_FILE_HEADER *header) { _header = header; }