예제 #1
0
파일: PEParser.cs 프로젝트: ca1e/PEParser
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 internal FileHeader(IMAGE_FILE_HEADER *header)
 {
     _header = header;
 }