示例#1
0
        protected bool ReadTrunks(FByteFile file, FModuleInfo module)
        {
            // Trunk
            int ftSize = Marshal.SizeOf(typeof(SImageThunkData32));
            int pOrgFt = ConvertRva(module.OriginalFirstThunk);
            int pFt    = ConvertRva(module.FirstThunk);

            while (true)
            {
                SImageThunkData32 origThunk = (SImageThunkData32)file.GetStruct(pOrgFt, typeof(SImageThunkData32));
                SImageThunkData32 realThunk = (SImageThunkData32)file.GetStruct(pFt, typeof(SImageThunkData32));
                if (origThunk.Function == 0)
                {
                    break;
                }
                if ((origThunk.Ordinal & 0x80000000) == 0x80000000)
                {
                    break;
                }
                // Read name
                SImageImportByName impName = (SImageImportByName)file.GetStruct(ConvertRva(origThunk.AddressOfData), typeof(SImageImportByName));
                if (impName.Name[0] == 0)
                {
                    break;
                }
                // TrunkInfo
                FTrunkInfo trunk = new FTrunkInfo();
                trunk.Name    = RAscii.GetString(impName.Name);
                trunk.Address = origThunk.Function;
                trunk.Entry   = (IntPtr)realThunk.Function;
                trunk.Hint    = impName.Hint;
                module.Trunks.Push(trunk);
                // Loop
                pOrgFt += ftSize;
                pFt    += ftSize;
            }
            return(true);
        }
示例#2
0
        public static FTrunkInfo[] FetchTrunks(IntPtr hModule)
        {
            Nullable <SImageNtHeaders> ntHeaders = GetNtHeaders(hModule);
            SImageDataDirectory        idd       = ntHeaders.Value.OptionalHeader.DataDirectory[(int)EImageDirectoryEntry.Import];

            if (idd.VirtualAddress == 0)
            {
                return(null);
            }
            // Import
            uint   maddress  = (uint)hModule.ToInt32();
            IntPtr pIdHeader = (IntPtr)(maddress + idd.VirtualAddress);
            SImageImportDescriptor impDesc = (SImageImportDescriptor)Marshal.PtrToStructure(pIdHeader, typeof(SImageImportDescriptor));

            if (impDesc.Name == 0)
            {
                return(null);
            }
            // Get module Name
            // IntPtr moduleNamePtr = (IntPtr)(maddress + impDesc.Name);
            // Trunk
            IntPtr pOrgFt = (IntPtr)(maddress + impDesc.OriginalFirstThunk);
            IntPtr pFt    = (IntPtr)(maddress + impDesc.FirstThunk);
            int    ftSize = Marshal.SizeOf(typeof(SImageThunkData32));
            int    miSize = Marshal.SizeOf(typeof(SMemoryBasicInformation));
            FObjects <FTrunkInfo> infos = new FObjects <FTrunkInfo>();

            while (true)
            {
                SImageThunkData32 origThunk = (SImageThunkData32)Marshal.PtrToStructure(pOrgFt, typeof(SImageThunkData32));
                SImageThunkData32 realThunk = (SImageThunkData32)Marshal.PtrToStructure(pFt, typeof(SImageThunkData32));
                if (origThunk.Function == 0)
                {
                    break;
                }
                if ((origThunk.Ordinal & 0x80000000) == 0x80000000)
                {
                    break;
                }

                /*uint arrd = (uint)(maddress + origThunk.AddressOfData);
                 * if ((arrd & 0x80000000) == 0x80000000) {
                 * break;
                 * }*/
                // Read name
                IntPtr             pName  = (IntPtr)(maddress + origThunk.AddressOfData);
                SImageImportByName byName = (SImageImportByName)Marshal.PtrToStructure(pName, typeof(SImageImportByName));
                if (byName.Name[0] == 0)
                {
                    break;
                }
                // Read memory state
                SMemoryBasicInformation mbi = new SMemoryBasicInformation();
                //RKernel32.VirtualQuery((uint)pFt.ToInt32(), ref mbi, miSize);
                RKernel32.VirtualQuery(realThunk.Function, ref mbi, miSize);
                // TrunkInfo
                FTrunkInfo info = new FTrunkInfo();
                info.Name    = RAscii.GetString(byName.Name);
                info.Address = origThunk.Function;
                //info.Entry = (IntPtr)(maddress + origThunk.Function);
                info.Entry                = (IntPtr)realThunk.Function;
                info.Hint                 = byName.Hint;
                info.MemAllocationBase    = mbi.AllocationBase;
                info.MemAllocationProtect = mbi.AllocationProtect;
                info.MemBaseAddress       = mbi.BaseAddress;
                info.MemProtect           = mbi.Protect;
                info.MemRegionSize        = mbi.RegionSize;
                info.MemState             = mbi.State;
                info.MemType              = mbi.Type;
                infos.Push(info);
                // Loop
                pOrgFt = (IntPtr)(pOrgFt.ToInt32() + ftSize);
                pFt    = (IntPtr)(pFt.ToInt32() + ftSize);
            }
            return(infos.ToArray());
        }
示例#3
0
        public bool Open()
        {
            // Dos header
            SImageDosHeader dosHeader = _process.ReadStructure <SImageDosHeader>(_handle);

            if (dosHeader.e_magic != (uint)EImageSignature.Dos)
            {
                return(false);
            }
            _dosHeader = dosHeader;
            // Nt header
            IntPtr          pNtHeader = (IntPtr)(_handle.ToInt32() + dosHeader.e_lfanew);
            SImageNtHeaders ntHeaders = _process.ReadStructure <SImageNtHeaders>(pNtHeader);

            if (ntHeaders.Signature != (uint)EImageSignature.Nt)
            {
                return(false);
            }
            _ntHeaders = ntHeaders;
            // Fetch trunks
            SImageDataDirectory idd = ntHeaders.OptionalHeader.DataDirectory[(int)EImageDirectoryEntry.Import];

            if (idd.VirtualAddress == 0)
            {
                return(false);
            }
            // Import
            uint   maddress  = (uint)_handle.ToInt32();
            IntPtr pIdHeader = (IntPtr)(maddress + idd.VirtualAddress);
            SImageImportDescriptor impDesc = _process.ReadStructure <SImageImportDescriptor>(pIdHeader);

            if (impDesc.Name == 0)
            {
                return(false);
            }
            // Get module Name
            // IntPtr moduleNamePtr = (IntPtr)(maddress + impDesc.Name);
            // Trunk
            IntPtr pOrgFt = (IntPtr)(maddress + impDesc.OriginalFirstThunk);
            IntPtr pFt    = (IntPtr)(maddress + impDesc.FirstThunk);
            int    ftSize = Marshal.SizeOf(typeof(SImageThunkData32));
            int    miSize = Marshal.SizeOf(typeof(SMemoryBasicInformation));

            _trunks = new FTrunkInfoCollection();
            while (true)
            {
                SImageThunkData32 origThunk = _process.ReadStructure <SImageThunkData32>(pOrgFt);
                SImageThunkData32 realThunk = _process.ReadStructure <SImageThunkData32>(pFt);
                if (origThunk.Function == 0)
                {
                    break;
                }
                if ((origThunk.Ordinal & 0x80000000) == 0x80000000)
                {
                    break;
                }
                // Read name
                IntPtr             pName  = (IntPtr)(maddress + origThunk.AddressOfData);
                SImageImportByName byName = _process.ReadStructure <SImageImportByName>(pName);
                if (byName.Name[0] == 0)
                {
                    break;
                }
                // Read memory state
                SMemoryBasicInformation mbi = new SMemoryBasicInformation();
                //RKernel32.VirtualQuery((uint)pFt.ToInt32(), ref mbi, miSize);
                RKernel32.VirtualQueryEx(_process.Handle, realThunk.Function, ref mbi, miSize);
                // TrunkInfo
                FTrunkInfo trunk = new FTrunkInfo();
                trunk.Name    = RAscii.GetString(byName.Name);
                trunk.Address = origThunk.Function;
                //info.Entry = (IntPtr)(maddress + origThunk.Function);
                trunk.Entry                = (IntPtr)realThunk.Function;
                trunk.EntryPtr             = pFt;
                trunk.Hint                 = byName.Hint;
                trunk.MemAllocationBase    = mbi.AllocationBase;
                trunk.MemAllocationProtect = mbi.AllocationProtect;
                trunk.MemBaseAddress       = mbi.BaseAddress;
                trunk.MemProtect           = mbi.Protect;
                trunk.MemRegionSize        = mbi.RegionSize;
                trunk.MemState             = mbi.State;
                trunk.MemType              = mbi.Type;
                _trunks.Push(trunk);
                // Loop
                pOrgFt = (IntPtr)(pOrgFt.ToInt32() + ftSize);
                pFt    = (IntPtr)(pFt.ToInt32() + ftSize);
            }
            return(true);
        }