コード例 #1
0
        bool IBinaryAppender <ImportFunctionModule.ImageBoundImportDescription, ReaderWithOffsetArgs> .Attach(ref ImportFunctionModule.ImageBoundImportDescription s, uint size, ReaderWithOffsetArgs arg)
        {
            if (s.TimeDateStamp == 0)
            {
                return(false);
            }

            ImportFunctionSection ifs = arg.Tag as ImportFunctionSection;

            if (ifs == null)
            {
                return(false);
            }

            string name = arg.Source.ReadStringAnsiAt(arg.Offset + s.OffsetModuleName);
            ImportFunctionModule ifm = ifs[name];

            // if there is a module to update:
            if (ifm != null)
            {
                ReaderWithOffsetArgs mArg = new ReaderWithOffsetArgs(arg.Source, arg.Offset, 0, null);
                ifm.BoundDate = new DateTime(1970, 1, 1).AddSeconds(s.TimeDateStamp);

                // append given number of forwarders, having the same size as the current structure
                // and lying just after:
                for (ushort i = 0; i < s.NumberOfModuleForwarderRefs; i++)
                {
                    Append
                    <ImportFunctionModule.ImageBoundImportForwarderRef, ImportFunctionModule, ReaderWithOffsetArgs>(
                        arg.Source, ifm, mArg);
                }
            }

            return(true);
        }
コード例 #2
0
        /// <summary>
        /// Reads detailed data of imported elements.
        /// </summary>
        private void ReadImportData <T, S>(UnmanagedDataReader s, ImportFunctionModule m)
            where T : struct
            where S : class, IBinaryAppender <T, ReaderWithOffsetArgs>
        {
            if (m != null)
            {
                uint xDelta;
                uint xOffset = GetVirtualRelativeAddress(m.NextModuleAddress, out xDelta);

                if (xOffset != 0)
                {
                    s.Jump(xOffset);
                    while (Append <T, S, ReaderWithOffsetArgs>
                               (s, this as S, new ReaderWithOffsetArgs(s, xOffset, xDelta, m)))
                    {
                        m.FirstThunk += s.LastReadSize;
                    }
                }
            }
        }
コード例 #3
0
 /// <summary>
 /// Adds new import module.
 /// </summary>
 public void Add(ImportFunctionModule t)
 {
     modules.Add(t);
 }
コード例 #4
0
        bool IBinaryAppender <ImportFunctionModule.ImageImportDescriptor, ReaderWithOffsetArgs> .Attach(ref ImportFunctionModule.ImageImportDescriptor s, uint size, ReaderWithOffsetArgs arg)
        {
            ImportFunctionSection imports = arg.Tag as ImportFunctionSection;
            IBinaryAppender <ImportFunctionModule.ImageImportDescriptor, ReaderWithOffsetArgs> t = new ImportFunctionModule();

            // read the next import module description:
            if (t.Attach(ref s, size, arg))
            {
                if (imports != null)
                {
                    imports.Add(t as ImportFunctionModule);
                    arg.Tag = t;
                    return(true);
                }
            }

            return(false);
        }
コード例 #5
0
        /// <summary>
        /// Attaches 64-bit specific info about imported functions.
        /// </summary>
        private bool AttachImportData(ref ImportFunctionModule.ImageImportData64 r, UnmanagedDataReader s, uint delta, ImportFunctionModule m)
        {
            if (m == null)
            {
                return(false);
            }

            // check if there is any data attached:
            if (r.OrdinalOrAddressOfData == 0)
            {
                return(false);
            }

            if (r.IsOrdinal)
            {
                ImportFunctionModule.ImageImportData64 thunk = new ImportFunctionModule.ImageImportData64();

                if (s.ReadAt(ref thunk, m.FirstThunk - delta))
                {
                    m.Add(new ImportFunctionDescription(r.Ordinal,
                                                        m.IsBinded ? thunk.OrdinalOrAddressOfData : 0));
                }
            }
            else
            {
                ImportFunctionModule.ImageImportByName funName = new ImportFunctionModule.ImageImportByName();
                ImportFunctionModule.ImageImportData64 thunk   = new ImportFunctionModule.ImageImportData64();

                if (s.ReadAt(ref thunk, m.FirstThunk - delta))
                {
                    if (s.ReadAt(ref funName, (uint)r.OrdinalOrAddressOfData - delta))
                    {
                        m.Add(new ImportFunctionDescription(
                                  s.ReadStringAnsiAt((uint)r.OrdinalOrAddressOfData - delta + sizeof(short)),
                                  m.IsBinded ? thunk.OrdinalOrAddressOfData : 0,
                                  (uint)funName.Hint));
                    }
                }
            }

            return(true);
        }