Beispiel #1
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());
        }